tkinter回调与时间绑定

本文最后更新于 2024年5月16日。

tkinter回调

tkinter无法获取回调函数的返回值:
你无法区这个返回值,你可以设置一个变量,temp=tkinter.StrinVar(),然后在a函数里把return那句换成temp.set(txt)
然后在外部你就可以通过temp.get()获取到这个值了,或者使用全局变量接收这个值.

一般解决方案是设置全局变量。

或者使用多个函数,事件函数和处理函数分开
Command handler 返回值没什么意义——事件是框架处理的,按钮并不知道返回值怎么用。你应该让 Command handler 再调用一次函数,比如这样:

def openPhoto():
filename1 = tkinter.filedialog.askopenfilename()
return filename1
def btnPhoto_click():
filename = openPhoto()
# 处理返回值
btnPhoto = Button(win,text="打开照片",command=btnPhoto_click)

tkinter绑定事件

bind:

bind的用法:控件.bind(event, handler),其中event是tkinter已经定义好的的事件,handler是处理器,可以是一个处理函数,如果相关事件发生, handler 函数会被触发, 事件对象 event 会传递给 handler 函数
基本所有控件都能bind
常见event有:

鼠标单击事件:鼠标左键点击为 <Button-1>, 鼠标中键点击为 <Button-2>, 鼠标右键点击为 <Button-3>, 向上滚动滑轮为 <Button-4>, 向下滚动滑轮为 <Button-5>.
鼠标双击事件.:鼠标左键点击为 <Double-Button-1>, 鼠标中键点击为 <Double-Button-2>, 鼠标右键点击为 <Double-Button-3>.
鼠标释放事件:鼠标左键点击为 <ButtonRelease-1>, 鼠标中键点击为 <ButtonRelease-2>, 鼠标右键点击为 <ButtonRelease-3>. 鼠标相对当前控件的位置会被存储在 event 对象中的 x 和 y 字段中传递给回调函数.
鼠标移入控件事件:<Enter>
获得焦点事件:<FocusIn>
鼠标移出控件事件: <Leave>
失去焦点事件:<FocusOut>
鼠标按下移动事件:鼠标左键点击为 <B1-Motion>, 鼠标中键点击为 <B2-Motion>, 鼠标右键点击为 <B3-Motion>. 鼠标相对当前控件的位置会被存储在 event 对象中的 x 和 y 字段中传递给回调函数.
键盘按下事件:<Key>,event中的keysym ,keycode,char都可以获取按下的键【其他想要获取值的也可以先看看event中有什么】
键位绑定事件:<Return>回车键,<BackSpace>,<Escape>,<Left>,<Up>,<Right>,<Down>…….
控件大小改变事件:<Configure>,新的控件大小会存储在 event 对象中的 width 和 height 属性传递. 有些平台上该事件也可能代表控件位置改变.
Event中的属性:
widget:产生事件的控件
x, y:当前鼠标的位置
x_root, y_root:当前鼠标相对于屏幕左上角的位置,以像素为单位。
char:字符代码(仅限键盘事件),作为字符串。
keysym:关键符号(仅限键盘事件)。
keycode:关键代码(仅限键盘事件)。
num:按钮号码(仅限鼠标按钮事件)。
width, height:小部件的新大小(以像素为单位)(仅限配置事件)。
type:事件类型。

要获取列表框中选定的文本项列表,我发现下面的解决方案是最优雅的:

selected_text_list = [listbox.get(i) for i in listbox.curselection()]

在使用 matplotlib.pyplot 画图添加图例:

fig, ax1 = plt.subplots()
line1 = ax1.plot(x, y, color='firebrick')  # draw a line
ax2.legend([line1], ['First'])

显示以下提示:

A proxy artist may be used instead.

原因在于,plot 返回 的 list 对象(list of Line2D)需要解构,因此需要在line1和等号之间加一个逗号:

fig, ax1 = plt.subplots()
line1, = ax1.plot(x, y, color='firebrick')  # draw a line
ax2.legend([line1], ['First'])