tkinter中的textvariable参数在初次运行后不会更新

时间:2018-11-10 07:05:25

标签: python class user-interface tkinter

我是第一次使用<ul id="list"> <li>Item 1 <ul> <li>Item 1.1</li> <li>Item 1.2 <ul> <li>Item 1.1.1</li> <li>Item 1.2.1</li> </ul> </li> </ul> </li> <li>Item 2</li> <li>Item 3</li> </ul>模块,创建标签/按钮时发现了tkinter参数,而没有发现。 它只会在第一次更新。我已经用任何一种方式扭曲了检索命令的方法,但似乎没有任何效果。我碰到了砖墙。

textvariable

3 个答案:

答案 0 :(得分:0)

看看这个语句片段:

self.button = Button(..., command=textVar.set(str(fibonacci()))

在功能上等效于此:

result = textVar.set(str(fibonacci()))
self.button = Button(..., command=result)

看到问题了吗?您正在立即调用textVar.set(...),并将其结果用作command属性的值。 textVar.set(...)返回None,因此您可以有效地进行command=None

请勿尝试将代码放入command参数中。而是创建一个适当的函数,并使该command属性的值。这将使您的代码更易于理解,更易于维护和调试。

示例:

def __init__(self, master):
    ...
    self.button = Button(..., command=self.do_something)
    ...

您遇到的第二个问题是您正在使用局部变量来存储StringVar()的结果。这意味着一旦函数运行完毕,它将被垃圾收集器删除。

要解决此问题,请将属性分配给实例变量:

def __init(self, master):
    ...
    self.textVar = StringVar()
    self.button = Button(..., command=self.do_something)
    ...

def do_something()
    self.textVar.set(str(fibonacci()))

答案 1 :(得分:0)

您的代码有几个问题。首先,您需要将textVar设置为实例属性,这样即使__init__()方法返回后,该属性仍然存在。在您的代码中,这是一个局部变量,返回时将消失。

第二,应该将command的{​​{1}}选项设置为一个函数,以便在单击该函数时稍后调用,但是您的代码在创建窗口小部件本身时会调用一次。您可以通过使用lambda表达式来定义一个“匿名”函数来解决该问题,该函数只要调用 就会调用所需的函数。

Button

可以做同样的事情而无需使用x = 1 y = 1 z = 0 class App: def __init__(self, master): frame = Frame(master) frame.pack() self.textVar = StringVar() # Make an instance attribute. self.textVar.set(x) # Set to show initial value of x. self.button = Button(frame, textvariable=self.textVar, command=lambda: self.textVar.set(fibonacci())) self.button.pack() def fibonacci(): global x, y, z z = x x = x + y y = z return x root = Tk() app = App(root) root.mainloop() ,如下面的代码所示。 注意lambda的使用只是指定函数的名称,而实际上并不像使用command=self.button_click_callback那样调用它。另外,由于command=self.button_click_callback()被定义为类方法,它将自动获取传递的button_click_callback参数(与通过self表达式内联定义的函数不同)。

无论如何,如您所见,以这种方式执行操作需要花费更多的代码行。

lamba

答案 2 :(得分:-2)

我个人在Windows计算机上使用anaconda环境(使用Spyder)放弃了textvariable:我的层和嵌套太多了,事情变得无处可去..特别是由于命令和lambda使用的“回调”情况。看起来其他人也将其与textvariable混淆了(建议不要使用它。.Tkinter Entry not showing the current value of textvariable) 像您一样,我在 init 部分中使用了以.set('是否在这里吗?')初始化的textvariable,后来在条目中重复使用,所以不显示文本“是否在那里”。抱歉,没有一个明确的解决方案,但看起来如果没有此文本变量,生活将会继续。

到目前为止,我能找到的最好的摘要链接是How to pass arguments to a Button command in Tkinter?。一切都有:lambda解释了,回调解释了一下,由于回调的情况,被调用函数中的textvariable没有更新,使用全局变量来更改参数等。