2013-06-15 3 views
19

У меня возникли проблемы с использованием привязки клавиш для изменения значения метки или любого параметра. Это мой код:Изменение текста на ярлыке

from tkinter import* 

class MyGUI: 
    def __init__(self): 
    self.__mainWindow = Tk() 
    #self.fram1 = Frame(self.__mainWindow) 
    self.labelText = 'Enter amount to deposit' 
    self.depositLabel = Label(self.__mainWindow, text = self.labelText) 
    self.depositEntry = Entry(self.__mainWindow, width = 10) 
    self.depositEntry.bind('<Return>', self.depositCallBack) 
    self.depositLabel.pack() 
    self.depositEntry.pack() 

    mainloop() 

    def depositCallBack(self,event): 
    self.labelText = 'change the value' 
    print(self.labelText) 

myGUI = MyGUI() 

Когда я запускаю это, я нажимаю entrybox и нажать кнопку ввода, в надежде, что метка изменится значение «изменить значение». Однако, пока он печатает этот текст, метка остается неизменной.

От взгляда на другие вопросы по сходным проблемам и проблемам я решил, как работать с некоторыми из этого вне класса, но у меня возникают некоторые трудности с его выполнением внутри класса.

Также, на боковой ноте, какую роль играет «мастер» в tkinter?

+0

'master' является GUI, что виджет упакован в. –

ответ

42
self.labelText = 'change the value' 

Вышеприведенное предложение make labelText ссылается на «изменить значение», но не меняет текст depositLabel.

Чтобы изменить текст depositLabel, используйте один из следующих setences:

self.depositLabel['text'] = 'change the value' 

ИЛИ

self.depositLabel.config(text='change the value') 
+0

Для первого предложения я получаю: self.labelText ['text'] = 'изменить значение' ТипError: объект 'str' не поддерживает назначение элемента – editate

+1

Я не набрал 'self.labelText ['text'] ', но' self.depositLabel ['text'] '. – falsetru

+0

А, это так. Спасибо. Можете ли вы помочь мне понять, почему моя техника не работает? Или когда использовать set() – editate

1

Вот еще один, я думаю. Только для справки. Давайте установим переменную быть instantance класса STRINGVAR

If you program Tk using the Tcl language, you can ask the system to let you know when a variable is changed. The Tk toolkit can use this feature, called tracing, to update certain widgets when an associated variable is modified.

There’s no way to track changes to Python variables, but Tkinter allows you to create variable wrappers that can be used wherever Tk can use a traced Tcl variable.

text = StringVar() 
self.depositLabel = Label(self.__mainWindow, text = self.labelText, textvariable = text) 
                    ^^^^^^^^^^^^^^^^^ 
    def depositCallBack(self,event): 
     text.set('change the value') 
9

Вы также можете определить textvariable при создании ярлыка, а также изменить textvariable обновить текст в метке. Вот пример:

labelText = Stringvar() 
depositLabel = Label(self, textvariable=labelText) 
depositLabel.grid() 

def updateDepositLabel(txt) # you may have to use *args in some cases 
    labelText.set(txt) 

Там нет необходимости обновлять текст в depositLabel вручную. Tk делает это за вас.

+0

Спасибо за краткое решение. Порекомендовал бы Комментировать код для начинающих понять. –

2

Я сделал небольшой Tkinter приложение, которое задает метку после того, как кнопка нажата

#!/usr/bin/env python 
from Tkinter import * 
from tkFileDialog import askopenfilename 
from tkFileDialog import askdirectory 


class Application: 
    def __init__(self, master): 
     frame = Frame(master,width=200,height=200) 
     frame.pack() 

     self.log_file_btn = Button(frame, text="Select Log File", command=self.selectLogFile,width=25).grid(row=0) 
     self.image_folder_btn = Button(frame, text="Select Image Folder", command=self.selectImageFile,width=25).grid(row=1) 
     self.quite_button = Button(frame, text="QUIT", fg="red", command=frame.quit,width=25).grid(row=5) 

     self.logFilePath =StringVar() 
     self.imageFilePath = StringVar() 
     self.labelFolder = Label(frame,textvariable=self.logFilePath).grid(row=0,column=1) 
     self.labelImageFile = Label(frame,textvariable = self.imageFilePath).grid(row = 1,column=1) 

     def selectLogFile(self): 
      filename = askopenfilename() 
      self.logFilePath.set(filename) 

     def selectImageFile(self): 
      imageFolder = askdirectory() 
      self.imageFilePath.set(imageFolder) 

root = Tk() 
root.title("Geo Tagging") 
root.geometry("600x100") 
app = Application(root) 
root.mainloop() 
0

Используйте метод config изменить значение знака:

top = Tk() 

l = Label(top) 
l.pack() 

l.config(text = "Hello World", width = "50" ,) 
Смежные вопросы