繁体   English   中英

Tkinter“入口”对象未更新textvariable变量(Python 3.4)

[英]Tkinter “entry” object not updating textvariable variable (Python 3.4)

我正在尝试编写一个简单的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()

我期望此代码会发生以下情况:

  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函数移到根主copyVal之外:按下按钮时会引发NameError异常(将copyVal视为未定义)。
  4. root.update_idletasks() copyVal函数之外无效。

我一直在寻找解决此问题的方法,但是无论我发现有多少人遇到类似的问题,他们的修复都无法为我解决这个问题(我通常会看到他们被告知使用StringVar()获取/设置值)。 对于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

您实际上并没有将Entrytextvariable选项设置为xy 而是在每个对象上创建名为textvariable新属性。

要解决此问题,请在创建窗口小部件时设置每个Entrytextvariable选项:

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

或使用.config方法稍后进行更改:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM