[英]Tkinter “entry” object not updating textvariable variable (Python 3.4)
我正在嘗試編寫一個簡單的Python程序,該程序將允許用戶以十進制或點分十進制格式輸入IP地址,然后將其轉換為相反的格式並在同一輸入框中顯示(例如,如果他們輸入了十進制IP地址,他們可以單擊一個按鈕,然后將其輸入替換為等價的點分十進制)。
我遇到的問題是將數據從輸入框中拉出,然后將新數據放回輸入框中。 我只用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
函數移到根主copyVal
之外:按下按鈕時會引發NameError
異常(將copyVal
視為未定義)。 root.update_idletasks()
copyVal
函數之外無效。 我一直在尋找解決此問題的方法,但是無論我發現有多少人遇到類似的問題,他們的修復都無法為我解決這個問題(我通常會看到他們被告知使用StringVar()
獲取/設置值)。 對於Tkinter來說,我是一個全新的人,因此,我確信這是我所忽略的真正基本知識,並且我感謝任何人都可以提供的建議。
Python對象通常允許您向其任意添加屬性:
>>> class Foo:
... pass
...
>>> foo = Foo()
>>> foo.a = 1 # No error. It makes a new attribute.
>>> foo.a
1
>>>
>>> def foo():
... pass
...
>>> foo.a = 1 # Works with function objects too.
>>> foo.a
1
>>>
因此,當您這樣做時:
xBox.textvariable = x
...
yBox.textvariable = y
您實際上並沒有將Entry
的textvariable
選項設置為x
和y
。 而是在每個對象上創建名為textvariable
新屬性。
要解決此問題,請在創建窗口小部件時設置每個Entry
的textvariable
選項:
xBox = tk.Entry(win1, textvariable=x)
...
yBox = tk.Entry(win1, textvariable=y)
或使用.config
方法稍后進行更改:
xBox.config(textvariable=x)
...
yBox.config(textvariable=y)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.