Tkinter" entry"对象不更新textvariable变量(Python 3.4)

时间:2014-11-20 23:08:25

标签: python user-interface python-3.x tkinter

我正在尝试编写一个简单的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. 底部框中的文字现在应与顶部框中的文字相匹配。
  6. 相反,它不会检索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无效。
    5. 我已经四处寻找这个问题的解决方案,但无论我找到多少人遇到类似的问题,他们的修补程序似乎都没有为我解决问题(我经常看到他们被告知使用{ {1}}获取/设置值)。我对与Tkinter合作非常陌生,所以我确信这是一个非常基本的东西,我忽略了,我很感激任何人都可以提供的建议。

1 个答案:

答案 0 :(得分:4)

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的新属性。

要解决此问题,请在创建小部件时设置每个Entry的{​​{1}}选项:

textvariable

或使用xBox = tk.Entry(win1, textvariable=x) ... yBox = tk.Entry(win1, textvariable=y) 方法稍后更改它们:

.config