我試圖寫一個簡單的Python程序,將允許用戶輸入在十進制的IP地址,或點分十進制格式,然後將其轉換到相反的格式並將其顯示在相同的輸入框中(即,如果他們輸入一個十進制IP地址,則可以單擊一個按鈕並將其輸入替換爲點分十進制格)。Tkinter的「入口」對象不更新textvariable變量(Python的3.4)
我遇到的問題是與拉出來的數據輸入框,然後把新的數據返回到輸入框中。我寫了一個例子只用GUI代碼,並沒有我的其他轉換邏輯的,簡化問題:
import tkinter as tk
root = tk.Tk()
root.title("Test")
win1 = tk.Frame(root)
win1.grid()
x = tk.StringVar()
y = tk.StringVar()
xBox = tk.Entry(win1)
xBox.grid(row = 0, column = 0)
xBox.textvariable = x
yBox = tk.Entry(win1)
yBox.grid(row = 1, column = 0)
yBox.textvariable = y
button = tk.Button(win1,text = "Calculate", command = lambda: copyVal())
button.grid(row = 2, column = 0)
def copyVal():
print("x: " + x.get())
print("y: " + y.get())
xVal = x.get()
print("xval: " + xVal)
y.set(xVal)
root.update_idletasks()
root.mainloop()
這就是我希望這個代碼的情況發生:
- 值輸入頂部框應存儲在
StringVar x
。 - 點擊「計算」按鈕,應該運行
copyVal()
功能: copyVal()
得到的StringVar x
值並將其存儲爲xVal
。copyVal()
套StringVar y
值相匹配xVal
。- 底部框中的文本現在應該與頂部框中的文本匹配。
相反,它不檢索StringVar x
的值,所以沒有什麼可以設置StringVar y
。
我已經試過以下變化:
- 使用的
xVal = xBox.get()
代替xVal = x.get()
:此檢索頂部輸入框中的內容,並設置的StringVar y
要匹配的值,但底部的輸入框做不變。 - 使用
command = copyVal()
代替command = lambda: copyVal()
:所述copyVal
功能立即執行在程序的執行,而不是當該按鈕被按下。 - 將
copyVal
函數移到根主循環之外:按下按鈕時會引發NameError
異常(copyVal
被視爲未定義)。 - 移動
root.update_idletasks()
的copyVal
功能外沒有任何影響。
我已經四處尋找這個問題的解決方案,但無論有多少人遇到類似問題,他們的修復似乎都無法解決問題(我通常會看到他們被告知要使用StringVar()
獲取/設置值)。我對與Tkinter合作完全陌生,因此我確信這是我忽略的一些基本內容,我很欣賞任何人都可以提供的建議。
謝謝!我知道這是我忽略的一些愚蠢。我沒有想到自己做錯了,因爲它沒有拋出異常。 – Liesmith 2014-11-20 23:20:57