首页 文章

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

提问于
浏览
2

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

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

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

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

    或者使用 .config 方法稍后更改它们:

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

相关问题