我正在尝试编写一个简单的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
中。单击“Calculate”(计算)按钮应运行
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
来获取/设置值)。我对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
s'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)
关于python - Tkinter“入口”对象未更新textvariable变量(Python 3.4),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27051349/