2015-06-22 85 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 

這當我運行該程序時,鍵入一個值,然後選擇ENTER鍵。

回答

1

您的answer變量未在函數的範圍內定義。要以最簡單的方式完成此操作,我建議您使用一個類來保存UI中的所有小部件。

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的工作作爲回調,您將不再需要使用while循環來完成你想要的東西。就像我所做的那樣,只需要進行if/else檢查,並且每次單擊按鈕它都會再次檢查。

我還將您的answer變量更改爲StringVar()的實例。這是一種Tkinter變量,專門用於完成您想要做的事情。然後,我可以使用配置選項textvariable = self.answer來允許在更改StringVar時更新標籤。要訪問StringVar的文本,您必須調用self.answer.get();改變你所撥打self.answer.set("text")的數據,就像我在function內所做的那樣。

最後,因爲你的Entryself.eStringVar一個實例,以及,我不得不改變你的if條件if data == "5":數據將是一個字符串,而不是一個int。