我是第一次使用<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
答案 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没有更新,使用全局变量来更改参数等。