我试图写一个简单的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