2014-11-20 53 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