我正在尝试编写一个简单的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
被视为未定义) . -
在
copyVal
函数外移动root.update_idletasks()
无效 .
我一直在寻找这个问题的解决方案,但无论我找到多少人遇到类似的问题,他们都没有解决我的问题(我通常看到他们被告知使用 StringVar()
来获取/设置值) . 我对与Tkinter合作非常陌生,所以我可以俯瞰,我感谢任何人都可以提供的任何建议 .
1 回答
Python对象通常允许您随意添加属性:
所以,当你这样做时:
你实际上并没有将
Entry
s'textvariable
选项设置为x
和y
. 而是在每个对象上创建名为textvariable
的新属性 .要解决此问题,请在创建窗口小部件时设置每个
Entry
的textvariable
选项:或者使用
.config
方法稍后更改它们: