2017-01-26 71 views
1

下面是我正在測試的一些代碼。在這段代碼中,我可以創建一個窗口,頂部有一個標籤,底部有一個入口字段。當我輸入該輸入字段時,我可以動態更改標籤中的內容。現在,我已經包含了一個函數,試圖通過存儲在Entry小部件中預定義的內容來評估分配給「tex」的變量。這是「貓」。這是拿起:Python,Tkinter - 製作get()動態

tex = e.get() 

據我所知,get()並沒有動態改變,因爲我改變了入口小部件的文本。所以當我改變入口小部件中的字符串時,它不能變成「狗」。這可能嗎?這裏是代碼:

from Tkinter import * 
import time 

root = Tk() 

def change(): 
    if tex == ("cat"): 
     time.sleep(0.5) 
     pass 
    else: 
     time.sleep(0.5) 
     e.delete(0, END) 
     e.insert(0, "dog") 

v = StringVar() 

e = Entry(root, textvariable=v) 
e.insert(0, "cat") 
e.pack(side=BOTTOM) 
tex = e.get() #When text is defined with get(), it does not change 
       #dynamically with the entry widget 


l = Label(root, textvariable=v) 
l.pack(side=TOP) 

change() 

root.mainloop() 

任何幫助,將不勝感激。

+0

您正在錯誤地創建'StringVar'。它需要是'v = StringVar()'(注意尾部的'()') –

+0

我沒有看到你想要達到的目標。當Entry內容改變時,StringVar'v'會動態變化,那麼爲什麼還需要動態改變的另一個變量? –

+0

我不是無所事事。這只是一個練習,或多或少。我試圖看看是否有可能影響條目字符串以觸發條件循環,以便在影響字符串「cat」時「更改」標籤小部件。換句話說,我希望當我開始退格並從貓身上移除「t」時,條目和小部件會立即得到改變。 –

回答

3

要回答您的具體問題,不,tex沒有辦法在入口小部件更改時神奇地保持更新。該功能正是爲什麼textvariable屬性存在的原因 - 它會導致變量始終使用條目窗口小部件中的值進行更新。如果您需要另一個變量中的數據,則必須調用.get()方法。這就是說,你可以在變量上設置一個跟蹤,或者在條目窗口小部件上設置一個綁定,並讓它調用代碼,以便在條目窗口小部件發生更改時將tex更新爲任何你想要的。

例如,下面的代碼演示瞭如何有callback稱爲每當進入小部件的值更改:

def callback(*args): 
    global tex 
    tex = e.get() 
v.trace("w", callback) 

有關傳遞給回調哪些參數的詳細信息,請參閱What are the arguments to Tkinter variable trace method callbacks?

所有這些都說了,你的代碼中有幾個嚴重的缺陷。首先,您錯誤地創建了StringVar。它需要是v = StringVar()(注意尾隨())。

此外,您不應該在GUI程序的主線程中調用sleep。如果您想在經過一段時間後執行某些代碼,請閱讀after方法。

+0

謝謝你的幫助! –