欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

30 Python事件处理--Tkinter图形界面设计

程序员文章站 2022-04-12 09:57:55
...

事件(event)

就是程序上发生的事情。例如用户要在键盘上某一个键单击、移动鼠标等。对于这些事件,程序需要作出反应。

  • tkinter提供的组件通常都有自己可以识别的事件。例如当按钮被单击的时候执行特定操作或者是当一个输入栏成为焦点、而你又敲击了键盘上的某些按键,你所输入的内容就会显示在输入栏内。
  • 程序可以使用事件处理函数来指定当触发某个时间时作出的反应/操作。
  • 事件类型的通用格式:<[modifier]…type[-detail]>
    事件类型必须放置于尖括号<>内。
    modifier用于组合键定义,例如Control。
    type描述了类型,例如单击。
    detail用于定义是哪一个按钮或者键的事件。例如1表示鼠标左键。
  • Python中事件主要有:1.键盘事件 2.鼠标事件 3.窗体事件

事件绑定

程序建立一个处理某一事件的事件处理参数,称为绑定。

  1. 创建组件对象时指定
    创建组件对象实例的时候,可以通过命名参数command指定事件处理函数。
import tkinter as tk
from tkinter import messagebox

root = tk.Tk()


def callback():
    messagebox.showinfo("Python", "Hello Python")


button1 = tk.Button(root, text="测试事件调用", command=callback)
button1.pack()
root.mainloop()
  1. 实例绑定(最常用、最重要的方式)
    调用组件对象实例方法bind可以为指定组件实例绑定事件。
    组件对象实例名.bind("<事件类型>",事件处理函数)
import tkinter as tk


def callback(event):
    cv.create_line(50, 50, 200, 100, width=5, dash=9)


root = tk.Tk()
cv = tk.Canvas(root, bg='orange', width=200, height=100)
cv.bind("<Button-1>", callback)
cv.create_rectangle(20, 20, 150, 150, outline='green', fill='red')
cv.pack()
root.mainloop()
  1. 类绑定
    将事件与一组件类绑定。调用任意组件实例的.bind_class()函数为特定组件类绑定事件。
    组件实例名.bind_class(“组件类”,"<事件类型>",事件处理函数)
import tkinter as tk


def callback(event):
    cv.create_line(10, 10, 200, 100, width=3, dash=9)


root = tk.Tk()
cv = tk.Canvas(root, bg='white', width=200, height=120)
cv.create_rectangle(20, 20, 100, 100, outline='red', fill='green')
cv.bind_class("Canvas", "<Button-1>", callback)
cv.pack()
root.mainloop()
  1. 程序界面绑定
    无论在哪一组实例上触发某一事件,程序都做相应的处理。
import tkinter as tk


def drawline(event):
    cv.create_line(10, 10, 200, 100, width=3, dash=7)


root = tk.Tk()
cv = tk.Canvas(root, bg='white', width=200, height=120)
cv.create_rectangle(20, 20, 110, 110, outline='red', fill='green')
cv.bind_all("<Button-1>", drawline)
cv.pack()
root.mainloop()
  1. 标识绑定
    在Canvas画布中绘制各种图形,将图形与实践绑定的时候可以用标识绑定tag_bind()函数,预先为图形定义标识tag后,通过标识tag来绑定事件。
import tkinter as tk


def drawline(event):
    cv.create_line(10, 10, 200, 100, width=3, dash=7)


root = tk.Tk()
cv = tk.Canvas(root, bg='white', width=200, height=120)
cv.create_rectangle(20, 20, 110, 110, outline='red', fill='green', tags='rt')
cv.tag_bind("rt", "<Button-1>", drawline)
cv.pack()
root.mainloop()

事件处理函数

  • 定义事件处理函数:
    事件处理函数常带有一个event参数,触发事件调用事件处理函数的时候,将传递event对象实例。
  • event对象实例可以获取各种相关的参数。

触发KeyPress键盘事件的示例:

import tkinter as tk


def printkey(event):
    print("你按下了:", event.char)


root = tk.Tk()
entry = tk.Entry(root)  # 实例化一个单行输入框
entry.bind('<KeyPress>', printkey)  # 给输入框绑定按键监听事件<KeyPress>以监听任何按键
entry.pack()
root.mainloop()