2014-11-20 73 views
1

我試圖寫一個簡單的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() 

這就是我希望這個代碼的情況發生:

  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函數移到根主循環之外:按下按鈕時會引發NameError異常(copyVal被視爲未定義)。
  4. 移動root.update_idletasks()copyVal功能外沒有任何影響。

我已經四處尋找這個問題的解決方案,但無論有多少人遇到類似問題,他們的修復似乎都無法解決問題(我通常會看到他們被告知要使用StringVar()獲取/設置值)。我對與Tkinter合作完全陌生,因此我確信這是我忽略的一些基本內容,我很欣賞任何人都可以提供的建議。

回答

3

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 S'textvariable選項xy。相反,您正在爲每個對象創建名爲textvariable的新屬性。

要解決該問題,要麼設置每個Entrytextvariable選項,當您創建的小部件:

xBox = tk.Entry(win1, textvariable=x) 
... 
yBox = tk.Entry(win1, textvariable=y) 

或使用.config方法後更改它們:

xBox.config(textvariable=x) 
... 
yBox.config(textvariable=y) 
+0

謝謝!我知道這是我忽略的一些愚蠢。我沒有想到自己做錯了,因爲它沒有拋出異常。 – Liesmith 2014-11-20 23:20:57