2015-06-22 3 views
0

код ниже, что я ссылка от импорта TkinterИзменения отображения текста в виджете Tkinter этикеток на основе условия

root = Tk() 

#Variables 
answer = "Enter Answer" 

data = "" 

#Functions 
def function(): 
    data = e.get() 
    while data == "": 
     if data == 5: 
      answer = "Correct" 
     if data != 5: 
      answer = "Incorrect" 
    print(answer) 


top = Label(root, text = "Test") 
top.pack() 

e = Entry(root) 
e.pack() 
e.focus_set() 

b = Button(root, text = "Enter", command = function) 
b.pack() 

check = Label(root, text = answer) 
check.pack() 

mainloop() 

Я не могу * обновить виджет метки (имя ' проверить'). Я хочу, чтобы иметь возможность обновлять его на основе проверки состояния, но я не могу заставить его работать. Я поместил «(ответ) печать» линию, чтобы проверить переменные, но я получаю ошибку:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__ 
    return self.func(*args) 
    File "G:/Portable Apps/Portable Python 3.2.5.1/Documents/TEST.py", line 22, in function 
    print(answer) 
UnboundLocalError: local variable 'answer' referenced before assignment 

Это происходит, когда я запускаю программу, введите значение, затем нажмите кнопку ввода.

ответ

1

Ваша переменная answer не определена в пределах области действия. Чтобы выполнить это простейшим способом, я предлагаю вам использовать класс для хранения всех виджетов из вашего пользовательского интерфейса.

from tkinter import * 

class Window(): 

    def __init__(self, root): 

     self.top = Label(root, text = "Test") 
     self.top.pack() 

     self.e = Entry(root) 
     self.e.pack() 
     self.e.focus_set() 

     self.b = Button(root, text = "Enter", command = self.function) 
     self.b.pack() 

     self.answer = StringVar() 
     self.answer.set("Enter answer") 

     self.check = Label(root, text = self.answer.get(), textvariable = self.answer) 
     self.check.pack() 

    #Functions 
    def function(self): 

     data = self.e.get() 

     if data == "5": 
      self.answer.set("Correct") 
     else: 
      self.answer.set("Incorrect") 

root = Tk() 
w = Window(root) 
root.mainloop() 

Кроме того, поскольку виджет command «s работы в качестве обратных вызовов, вы не должны использовать время цикла, чтобы выполнить то, что вы хотите. Просто поместите проверку if/else, как я это сделал, и каждый раз, когда вы нажимаете кнопку, он снова проверяет.

Я также изменил вашу переменную answer как экземпляр StringVar(). Это тип Tkinter-переменной, специально разработанный для выполнения того, что вы пытаетесь сделать. Затем я могу использовать опцию конфигурации textvariable = self.answer, чтобы обновлять метку всякий раз, когда изменяется StringVar. Чтобы получить доступ к тексту StringVar, вы должны позвонить self.answer.get(); для изменения данных, которые вы вызываете self.answer.set("text"), как я сделал в пределах function.

Наконец, так как ваш Entryself.e является экземпляром StringVar, а я должен был изменить if условие if data == "5": в качестве данных будет строка, а не инт.

Смежные вопросы