【问题标题】:Why does this tkinter event function not see the non-event variable?为什么这个 tkinter 事件函数看不到非事件变量?
【发布时间】:2020-06-13 00:02:53
【问题描述】:

我有一个绑定到事件函数的按钮,我希望该函数计算按钮被单击的次数。所以我有一个变量(点击次数),我希望事件函数将点击次数作为参数并将其加一。这是我的代码:

#imports
import tkinter

#variables
clicks = 0

#event functions
def click(event,clicks):
    clicks += 1
    print(clicks)
    return clicks

#create gui
window = tkinter.Tk()

button = tkinter.Button(text = "click me!")
button.pack()
clicks = button.bind("<Button-1>",click)

#run gui
window.mainloop()

当我运行程序并单击按钮时,我收到“click() 缺少 1 个必需的位置参数:'clicks'”错误。但据我所知,我已经初始化了点击,点击获取并返回点击,那么我哪里出错了?

【问题讨论】:

  • bind() 返回bind_ID,而不是来自函数click() 的值 - 它在列表上发送"&lt;Button-1&gt;",click,当您单击鼠标按钮时,然后mainloop 使用列表检查它,当它找到时"&lt;Button-1&gt;",click 然后它执行click(event),而不是click(event, clicks) 所以定义def click(event,clicks): 是错误的。而且使用return clicksclicks = bind() 是没用的。

标签: python function events tkinter parameters


【解决方案1】:

您的代码有很多问题。但要回答您的问题,这是因为您没有在事件处理函数中声明整数clicks 变量global。但是,仅凭这一点并不能使一切正常,因此我将专注于存在的其他问题(并解决该问题)。

首先,您有 两个 名为 clicks 的对象。正如我已经说过的,为了改变整数 clicks 对象的值,它必须在 click() 事件处理函数中声明为 global — 而 可以传递额外的参数到事件处理函数,这在这里没有帮助,因为整数在 Python 中是按值传递的,所以在那里增加它不会改变全局变量的值(所以我不会向你展示如何传递额外的参数,因为这不会有帮助)。

最后,也是最次要的一点,从事件处理函数返回值是没有意义的,因为 tkinter 只是忽略它们返回的内容(而 it 是调用它们的对象)。

这是您的代码,经过修改以使其工作:

#imports
import tkinter

#variables
clicks = 0

#event handler function
def click(event):
    global clicks
    clicks += 1
    print(clicks)

#create gui
window = tkinter.Tk()

button = tkinter.Button(text="click me!")
button.pack()
button.bind("<Button-1>", click)

#run gui
window.mainloop()

【讨论】:

  • 从我在别处读到的内容来看,我认为使用全局是不好的形式,并且“更好”的方法是将变量作为参数传递给函数。这个方法是不是因为 tkinter 会忽略返回而不起作用?
  • @sam:这通常是正确的,但对于不可变类型(如整数),您要么需要使用“技巧”来绕过该限制,要么不使用 clicks a全局变量(无论您是否在函数中将其声明为一个)。避免全局变量的另一种方法是开始定义和使用类。
  • @sam 在这种情况下global 可能是唯一的解决方案。使用类,您可以使用self.clicks 而不是global 运行它。至于return。绑定时函数不会执行,但要晚得多,它由mainloop 执行,它不知道如何处理返回值 - 所以使用return 是没用的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多