簡體   English   中英

Tkinter“入口”對象未更新textvariable變量(Python 3.4)

[英]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()

我期望此代碼會發生以下情況:

  1. 在頂部框中輸入的值應存儲在StringVar x
  2. 單擊“計算”按鈕應運行copyVal()函數:
  3. copyVal()獲取StringVar x的值並將其存儲為xVal
  4. copyVal()設置StringVar y的值以匹配xVal
  5. 現在,底部框中的文本應與頂部框中的文本匹配。

相反,它不會檢索StringVar x的值,因此沒有將StringVar y設置為的內容。

我嘗試了以下變體:

  1. 使用xVal = xBox.get()而不是xVal = x.get() :這將檢索頂部輸入框的內容,並設置StringVar y的值以與其匹配,但底部輸入框不會更改。
  2. 使用command = copyVal()代替command = lambda: copyVal()copyVal函數在程序執行時立即執行,而不是在按下按鈕時執行。
  3. copyVal函數移到根主copyVal之外:按下按鈕時會引發NameError異常(將copyVal視為未定義)。
  4. 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

您實際上並沒有將Entrytextvariable選項設置為xy 而是在每個對象上創建名為textvariable新屬性。

要解決此問題,請在創建窗口小部件時設置每個Entrytextvariable選項:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM