Tkinter“entry”对象未更新textvariable变量(Python3.4)

2024-10-01 15:36:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试编写一个简单的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异常。在
  4. root.update_idletasks()移到copyVal函数之外没有效果。在

我四处寻找这个问题的解决方案,但是不管我发现有多少人遇到了类似的问题,他们的解决方案似乎都无法为我解决问题(我通常会看到他们被告知使用StringVar()来获取/设置值)。我对与Tkinter的工作完全陌生,所以我确信这是我忽略的一些非常基本的东西,我很感激任何人能提供的建议。在


Tags: 函数getcolumnroot按钮tkgridrow
1条回答
网友
1楼 · 发布于 2024-10-01 15:36:17

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
>>>

所以,当你这样做的时候:

^{pr2}$

您实际上没有将Entrys'textvariable选项设置为x和{}。相反,您将在每个对象上创建名为textvariable的新属性。在

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

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

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

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

相关问题 更多 >

    热门问题