如标题所言,省流版请直接看标粗或者标红部分。
以下是具体解决过程:
在使用TK搭建UI界面的时候,突然脑洞大开想要使用bind函数,实现只有当鼠标左键双击按钮控件后,才运行按钮的响应事件,故原代码是这样写的:
"""
这是按钮响应事件
其中MyThread函数的功能是将某函数放入独立线程中运行
open_text函数的功能是打开固定路径下的文本文件,并将文本内容在窗口中显示
"""
def thread_text():
MyThread(open_text())
"""
在后续代码中,设置了一个按钮控件
打算使用bind函数,实现鼠标左键双击按钮控件,运行thread_text函数
"""
button0 = tk.Button(window, image=button_photo0, bd=0, padx=10, pady=20,
activebackground='Silver')
button0.grid(row=0, column=0)
button0.bind("<Double-Button-1>", thread_text())
但出现了第一个问题,原本的设想是,鼠标左键双击按钮控件后,才运行thread_text函数,但不知为何,一旦运行代码,当UI界面一启动,即使我没有双击按钮,thread_text函数也自行启动了。
查阅了不少类似使用bind函数的代码后,发现无论是官方的实例代码还是其他大佬写的代码,他们的bind事件发生后要执行的函数,都不带后面的括号,只有一个函数名,故作出以下修改:
"""将thread_text()改成了thread_text"""
button0.bind("<Double-Button-1>", thread_text)
将修改后的代码运行后,thread_text函数终于不再自行启动,但双击按钮时,却报出以下错误:
既然说必须要设置一个输入参数,那就在thread_text函数里添加一个不使用的输入参数吧,如下:
"""
thread_text函数输入一个不使用的参数self
后续代码不作改变
"""
def thread_text(self):
MyThread(open_text())
button0 = tk.Button(window, image=button_photo0, bd=0, padx=10, pady=20,
activebackground='Silver')
button0.grid(row=0, column=0)
button0.bind("<Double-Button-1>", thread_text)
成功实现功能。故解决方法如下:
1.bind事件执行后需调用的函数,只需输入函数名即可;
2.在调用函数里至少添加一个不使用的输入参数。
但以上解决方法只适用于调用函数本身不需要任何输入参数的情况,那如果bind事件执行后想要调用一个必须输入参数的函数呢?
答案是:定义一个不需要输入参数的新函数,把这个需要输入参数的函数包进去呗。
我的代码里就是那么解决的,如下:
"""
最原本的想法里,当bind事件发生后,直接调用MyThrad函数
"""
button0 = tk.Button(window, image=button_photo0, bd=0, padx=10, pady=20,
activebackground='Silver')
button0.grid(row=0, column=0)
button0.bind("<Double-Button-1>", MyThread(open_text()))
"""
但发生了如标题所言的问题,为了保证功能实现
只好再套一层不需要输入参数的函数喽
"""
def thread_text(self):
MyThread(open_text())
button0 = tk.Button(window, image=button_photo0, bd=0, padx=10, pady=20,
activebackground='Silver')
button0.grid(row=0, column=0)
button0.bind("<Double-Button-1>", thread_text)