澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

事件绑定与窗口,GUI之tkinter学习笔记3事件绑定

2019-08-03 作者:www.8455.com   |   浏览(163)

相关内容:

  • command
  • bind
  • protocol

 

首发时间:2018-03-04 19:26


一个Tkinter主要跑在mainloop进程里。Events可能来自多个地方,比如按键,鼠标,或是系统事件。 
Tkinter提供了丰富的方法来处理这些事件。对于每一个控件Widget,你都可以为其绑定方法function。

tkinter学习-事件绑定与窗口,tkinter窗口

阅读目录:

  • 事件绑定

  • Toplevel组件

  • 标准对话框

事件绑定:

  说明:对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上。

事件序列:

  说明:用户需要使用bind()方法将具体的事件序列与自定义的方法绑定,时间序列是以字符串的形式表示的。

  语法描述:

    <modifier - type - dateil>

    事件序列必须包含在尖括号(<...>)中

    type部分的内容是最重要的,它通常用来描述普通的数据类型,例如鼠标单击或键盘单击(<Button-1>,表示用户单击鼠标左键)

    modifier部分是可选的,它通常是用于描述组合键,例如Ctrl c,(<Key-H>,表示用户按下H)

    dateil部分是可选的,它通常是描述具体的键,(<Control-Shift-Key-H>,表示用户同时按下Ctrl Shift H)

  type:

    Button:当用户点击鼠标按键的时候触发该事件,<Button-1>左键,<Button-2>中键,<Button-3>右键,<Button-4>滚轮上,<Button-5>滚轮下  

    ButtonRelease:当用户释放鼠标按键的时候触发的事件

    KeyPress:当用户按下键盘的时候触发该事件,简写key

  modifier:

    Alt:当用户按下Alt按键的的时候

    Any:表示任何类型的按键被按下的时候,例如<Any-KeyPress>,表示当用户按下任何键的时候

    Control:表示按下Ctrl键的时候

    Double:当后续两个事件被连续触发的时候,例如<Double-Button-1>,表示双击鼠标左键的时候

    Lock:当打开大写字母的时候

    Shift:当按下Shift的时候

    Triple:当后续三个事件被触发的时候

Event对象:

  说明:当Tkinter去回调预定定义的函数的时候,将会带着Evnet对象去调用,常用的有:

  x,y 当前鼠标位置坐标

  x_root,y_root 当前鼠标位置坐标

  char 按键对应的字符

  keysym 按键名

  keycode 按键码

获取鼠标的位置:

from tkinter import *root = Tk()frame = Frame(root,width=200,height=200)def callback:    print('当前位置为:',event.x,event.y)frame.bind('<Button-1>',callback)frame.pack()mainloop()

结果:

    澳门新萄京官方网站 1

  接受键盘事件,只有组件获取焦点才能接受键盘事件,用focus_set()获取焦点

from tkinter import *root = Tk()def callback:    print('敲击位置:',repr(event.char))frame = Frame(root,width=200,height=200)frame.bind('<Key>',callback)frame.focus_set()frame.pack()mainloop()

结果:

    澳门新萄京官方网站 2

  获取鼠标的运动轨迹,用的是<Motion>

from tkinter import *root = Tk()def callback:    print('当前位置:',event.x,event.y)frame = Frame(root,width = 600,height=200)frame.bind('<Motion>',callback)frame.pack()mainloop()

结果:

    澳门新萄京官方网站 3

Toplevel:

  说明:顶级窗口,用于显示额外的窗口,其他弹出的窗口

from tkinter import *root = Tk()def show():    top = Toplevel()    top.title('山丘')    top.geometry('200x200')    Label(top,text='越过山丘').pack()Button(root,text='创建顶级窗口',command=show).pack()mainloop()

结果:

      澳门新萄京官方网站 4

  这里还有一个attributes方法,用于设置窗口的属性

from tkinter import *root = Tk()def show():    top = Toplevel()    top.title('山丘')    top.geometry('200x200')    top.attributes('-alpha',0.5)  #设置窗口透明度为50%    Label(top,text='越过山丘').pack()Button(root,text='创建顶级窗口',command=show).pack()mainloop()

结果:

    澳门新萄京官方网站 5

标准对话框:

  说明:主要有三个模块,messagebox,filedialog,colorchooser

消息对话框:

  一共有七种样式,格式是:showwarning(title,message,options)

    title:设置标题栏文本

    message:设置文本内容

    options:设置选项的含义

  返回值:

    askokcancel(),askretrycancel(),askyesno()返回的是布尔类型的值

    askquestion()返回的是‘yes’或‘no’

    showerror(),showinfo(),showwarning()返回的是‘ok’表示用户单击了‘确定’

from tkinter import *from tkinter import messageboxroot = Tk()def show():    #messagebox.askokcancel('山丘','askokcancel')    #messagebox.askquestion('山丘','askquestion')    #messagebox.askretrycancel('山丘','askretrycancel')    #messagebox.askyesno('山丘','askyesno')    #messagebox.showerror('山丘','showerror')    #messagebox.showinfo('山丘','showinfo')    messagebox.showwarning('山丘','showwarning')Button(root,text='打开',command=show).pack()mainloop()

结果:

  澳门新萄京官方网站 6  澳门新萄京官方网站 7  澳门新萄京官方网站 8  澳门新萄京官方网站 9 澳门新萄京官方网站 10   澳门新萄京官方网站 11  澳门新萄京官方网站 12

文件对话框:

  两个函数 askopenfilename()打开文件,asksaveasfilename()保存文件

  常用的值:

    initialdir:指定打开或保存的路径

  返回值:

    如果用户选择了一个文件,那么返回的就是该文件的完整路径

    如果用户选择了取消按钮,那么返回的就是空的字符串   

from tkinter import *from tkinter import filedialogroot = Tk()def show():    filedialog.askopenfilename(initialdir=r'路径名')Button(root,text='打开文件',command=show).pack()mainloop()

颜色对话框:

  返回值:

    如果用户选择了一个颜色并点击确定按钮,返回一个二元组,第一个元素是RGB颜色值,第二个是对应的元素的十六进制颜色值

    如果用户点击取消,返回的是(None,None)

from tkinter import *from tkinter import colorchooserroot = Tk()def show():    colorchooser.askcolor()Button(root,text='选择颜色',command=show).pack()mainloop()

结果:

  澳门新萄京官方网站 13

  最后,做一个注册窗口

from tkinter import *from tkinter import messageboxroot = Tk()def show():    messagebox.askyesno('山丘','确认注册?')def create():    #top.attributes('-alpha',0.5)    top = Toplevel    top.title('山丘')    top.geometry('400x250')    Label(top,text='用户名:').place(x=20,y=50)    Label(top,text='密码:').place(x=20,y=120)    Entry.place(x=110,y=50)    Entry(top,show='*').place(x=110,y=120)    Button(top,text='确认注册',width=10,command=show).place(x=170,y=190) root.title('山丘')root.geometry('450x400')Label(root,text='用户名:').place(x=100,y=170)Label(root,text='密码:').place(x=100,y=230)photo = PhotoImage(file='welcome.gif')Label(root,image=photo).place(x=0,y=0)Entry.place(x=190,y=170)Entry(root,show='*').place(x=190,y=230)Button(root,text='注册',width=10,command=create).place(x=100,y=300)  Button(root,text='提交',width=10).place(x=300,y=300)mainloop()

结果:

    澳门新萄京官方网站 14

参考文献:

  小甲鱼python教学视频

阅读目录:

  • 事件绑定

  • Toplevel组件

  • 标准对话框

事件绑定:

  说明:对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上。

事件序列:

  说明:用户需要使用bind()方法将具体的事件序列与自定义的方法绑定,时间序列是以字符串的形式表示的。

  语法描述:

    <modifier - type - dateil>

    事件序列必须包含在尖括号(<...>)中

    type部分的内容是最重要的,它通常用来描述普通的数据类型,例如鼠标单击或键盘单击(<Button-1>,表示用户单击鼠标左键)

    modifier部分是可选的,它通常是用于描述组合键,例如Ctrl c,(<Key-H>,表示用户按下H)

    dateil部分是可选的,它通常是描述具体的键,(<Control-Shift-Key-H>,表示用户同时按下Ctrl Shift H)

  type(常用的):

    Button:当用户点击鼠标按键的时候触发该事件,<Button-1>左键,<Button-2>中键,<Button-3>右键,<Button-4>滚轮上(liunx),<Button-5>滚轮下(liunx)  

    ButtonRelease:当用户释放鼠标按键的时候触发的事件

    KeyPress:当用户按下键盘的时候触发该事件,简写key

  modifier(常用的):

    Alt:当用户按下Alt按键的的时候

    Any:表示任何类型的按键被按下的时候,例如<Any-KeyPress>,表示当用户按下任何键的时候

    Control:表示按下Ctrl键的时候

    Double:当后续两个事件被连续触发的时候,例如<Double-Button-1>,表示双击鼠标左键的时候

    Lock:当打开大写字母的时候

    Shift:当按下Shift的时候

    Triple:当后续三个事件被触发的时候

Event对象:

  说明:当Tkinter去回调预定定义的函数的时候,将会带着Evnet对象去调用,常用的有:

  x,y 当前鼠标位置坐标(相对于窗口左上角)

  x_root,y_root 当前鼠标位置坐标(相对于屏幕左上角)

  char 按键对应的字符

  keysym 按键名

  keycode 按键码

获取鼠标的位置:

from tkinter import *
root = Tk()
frame = Frame(root,width=200,height=200)
def callback(event):
    print('当前位置为:',event.x,event.y)
frame.bind('<Button-1>',callback)
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 15

  接受键盘事件,只有组件获取焦点才能接受键盘事件,用focus_set()获取焦点

from tkinter import *
root = Tk()
def callback(event):
    print('敲击位置:',repr(event.char))
frame = Frame(root,width=200,height=200)
frame.bind('<Key>',callback)
frame.focus_set()
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 16

  获取鼠标的运动轨迹,用的是<Motion>

from tkinter import *
root = Tk()
def callback(event):
    print('当前位置:',event.x,event.y)
frame = Frame(root,width = 600,height=200)
frame.bind('<Motion>',callback)
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 17

Toplevel:

事件绑定与窗口,GUI之tkinter学习笔记3事件绑定。  说明:顶级窗口,用于显示额外的窗口,其他弹出的窗口

from tkinter import *
root = Tk()
def show():
    top = Toplevel()
    top.title('山丘')
    top.geometry('200x200')
    Label(top,text='越过山丘').pack()
Button(root,text='创建顶级窗口',command=show).pack()
mainloop()

结果:

      澳门新萄京官方网站 18

  这里还有一个attributes方法,用于设置窗口的属性

from tkinter import *
root = Tk()
def show():
    top = Toplevel()
    top.title('山丘')
    top.geometry('200x200')
    top.attributes('-alpha',0.5)  #设置窗口透明度为50%
    Label(top,text='越过山丘').pack()
Button(root,text='创建顶级窗口',command=show).pack()
mainloop()

 

结果:

    澳门新萄京官方网站 19

标准对话框:

  说明:主要有三个模块,messagebox(消息对话框),filedialog(文件对话框),colorchooser(颜色对话框)

消息对话框:

  一共有七种样式,格式是:showwarning(title,message,options)

    title:设置标题栏文本

    message:设置文本内容

    options:设置选项的含义

  返回值:

    askokcancel(),askretrycancel(),askyesno()返回的是布尔类型的值

    askquestion()返回的是‘yes’或‘no’

    showerror(),showinfo(),showwarning()返回的是‘ok’表示用户单击了‘确定’

from tkinter import *
from tkinter import messagebox
root = Tk()
def show():
    #messagebox.askokcancel('山丘','askokcancel')
    #messagebox.askquestion('山丘','askquestion')
    #messagebox.askretrycancel('山丘','askretrycancel')
    #messagebox.askyesno('山丘','askyesno')
    #messagebox.showerror('山丘','showerror')
    #messagebox.showinfo('山丘','showinfo')
    messagebox.showwarning('山丘','showwarning')
Button(root,text='打开',command=show).pack()
mainloop()

结果:

  澳门新萄京官方网站 20  澳门新萄京官方网站 21  澳门新萄京官方网站 22  澳门新萄京官方网站 23 澳门新萄京官方网站 24   澳门新萄京官方网站 25  澳门新萄京官方网站 26

文件对话框:

  两个函数 askopenfilename()打开文件,asksaveasfilename()保存文件

  常用的值:

    initialdir:指定打开或保存的路径

  返回值:

    如果用户选择了一个文件,那么返回的就是该文件的完整路径

    如果用户选择了取消按钮,那么返回的就是空的字符串   

from tkinter import *
from tkinter import filedialog
root = Tk()
def show():
    filedialog.askopenfilename(initialdir=r'路径名')
Button(root,text='打开文件',command=show).pack()
mainloop()

颜色对话框:

  返回值:

    如果用户选择了一个颜色并点击确定按钮,返回一个二元组,第一个元素是RGB颜色值,第二个是对应的元素的十六进制颜色值

    如果用户点击取消,返回的是(None,None)

from tkinter import *
from tkinter import colorchooser
root = Tk()
def show():
    colorchooser.askcolor()
Button(root,text='选择颜色',command=show).pack()
mainloop()

结果:

  澳门新萄京官方网站 27

  最后,做一个注册窗口

from tkinter import *
from tkinter import messagebox
root = Tk()
def show():
    messagebox.askyesno('山丘','确认注册?')
def create():
    #top.attributes('-alpha',0.5)
    top = Toplevel(root)
    top.title('山丘')
    top.geometry('400x250')
    Label(top,text='用户名:').place(x=20,y=50)
    Label(top,text='密码:').place(x=20,y=120)
    Entry(top).place(x=110,y=50)
    Entry(top,show='*').place(x=110,y=120)
    Button(top,text='确认注册',width=10,command=show).place(x=170,y=190) 
root.title('山丘')
root.geometry('450x400')
Label(root,text='用户名:').place(x=100,y=170)
Label(root,text='密码:').place(x=100,y=230)
photo = PhotoImage(file='welcome.gif')
Label(root,image=photo).place(x=0,y=0)
Entry(root).place(x=190,y=170)
Entry(root,show='*').place(x=190,y=230)
Button(root,text='注册',width=10,command=create).place(x=100,y=300)  
Button(root,text='提交',width=10).place(x=300,y=300)
mainloop()

结果:

    澳门新萄京官方网站 28

参考文献:

  小甲鱼python教学视频

 

command:

 

  • command是控件中的一个参数,如果使得command=函数,那么点击控件的时候将会触发函数
  • 能够定义command的常见控件有: Button、Menu…
  • 调用函数时,默认是没有参数传入的,如果要强制传入参数,可以考虑使用lambda

 

from tkinter import *
root=Tk()

def prt():
    print("hello")
def func1(*args,**kwargs):
    print(*args,**kwargs)
hello_btn=Button(root,text="hello",command=prt)#演示
hello_btn.pack()

args_btn=Button(root,text="获知是否button事件默认有参数",command=func1)#获知是否有参数,结果是没有

args_btn.pack()
btn1=Button(root,text="传输参数",command=lambda:func1("running"))#强制传输参数

btn1.pack()

root.mainloop()

 

 


widget.bind(event,handler)

阅读目录:

  • 事件绑定

  • Toplevel组件

  • 标准对话框

澳门新萄京官方网站,事件绑定:

  说明:对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上。

事件序列:

  说明:用户需要使用bind()方法将具体的事件序列与自定义的方法绑定,时间序列是以字符串的形式表示的。

  语法描述:

    <modifier - type - dateil>

    事件序列必须包含在尖括号(<...>)中

    type部分的内容是最重要的,它通常用来描述普通的数据类型,例如鼠标单击或键盘单击(<Button-1>,表示用户单击鼠标左键)

    modifier部分是可选的,它通常是用于描述组合键,例如Ctrl c,(<Key-H>,表示用户按下H)

    dateil部分是可选的,它通常是描述具体的键,(<Control-Shift-Key-H>,表示用户同时按下Ctrl Shift H)

  type(常用的):

    Button:当用户点击鼠标按键的时候触发该事件,<Button-1>左键,<Button-2>中键,<Button-3>右键,<Button-4>滚轮上(liunx),<Button-5>滚轮下(liunx)  

    ButtonRelease:当用户释放鼠标按键的时候触发的事件

    KeyPress:当用户按下键盘的时候触发该事件,简写key

  modifier(常用的):

    Alt:当用户按下Alt按键的的时候

    Any:表示任何类型的按键被按下的时候,例如<Any-KeyPress>,表示当用户按下任何键的时候

    Control:表示按下Ctrl键的时候

    Double:当后续两个事件被连续触发的时候,例如<Double-Button-1>,表示双击鼠标左键的时候

    Lock:当打开大写字母的时候

    Shift:当按下Shift的时候

    Triple:当后续三个事件被触发的时候

Event对象:

  说明:当Tkinter去回调预定定义的函数的时候,将会带着Evnet对象去调用,常用的有:

  x,y 当前鼠标位置坐标(相对于窗口左上角)

  x_root,y_root 当前鼠标位置坐标(相对于屏幕左上角)

  char 按键对应的字符

  keysym 按键名

  keycode 按键码

获取鼠标的位置:

from tkinter import *
root = Tk()
frame = Frame(root,width=200,height=200)
def callback(event):
    print('当前位置为:',event.x,event.y)
frame.bind('<Button-1>',callback)
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 29

  接受键盘事件,只有组件获取焦点才能接受键盘事件,用focus_set()获取焦点

from tkinter import *
root = Tk()
def callback(event):
    print('敲击位置:',repr(event.char))
frame = Frame(root,width=200,height=200)
frame.bind('<Key>',callback)
frame.focus_set()
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 30

  获取鼠标的运动轨迹,用的是<Motion>

from tkinter import *
root = Tk()
def callback(event):
    print('当前位置:',event.x,event.y)
frame = Frame(root,width = 600,height=200)
frame.bind('<Motion>',callback)
frame.pack()
mainloop()

 

结果:

    澳门新萄京官方网站 31

Toplevel:

  说明:顶级窗口,用于显示额外的窗口,其他弹出的窗口

from tkinter import *
root = Tk()
def show():
    top = Toplevel()
    top.title('山丘')
    top.geometry('200x200')
    Label(top,text='越过山丘').pack()
Button(root,text='创建顶级窗口',command=show).pack()
mainloop()

结果:

      澳门新萄京官方网站 32

  这里还有一个attributes方法,用于设置窗口的属性

from tkinter import *
root = Tk()
def show():
    top = Toplevel()
    top.title('山丘')
    top.geometry('200x200')
    top.attributes('-alpha',0.5)  #设置窗口透明度为50%
    Label(top,text='越过山丘').pack()
Button(root,text='创建顶级窗口',command=show).pack()
mainloop()

 

结果:

    澳门新萄京官方网站 33

标准对话框:

  说明:主要有三个模块,messagebox(消息对话框),filedialog(文件对话框),colorchooser(颜色对话框)

消息对话框:

  一共有七种样式,格式是:showwarning(title,message,options)

    title:设置标题栏文本

    message:设置文本内容

    options:设置选项的含义

  返回值:

    askokcancel(),askretrycancel(),askyesno()返回的是布尔类型的值

    askquestion()返回的是‘yes’或‘no’

    showerror(),showinfo(),showwarning()返回的是‘ok’表示用户单击了‘确定’

from tkinter import *
from tkinter import messagebox
root = Tk()
def show():
    #messagebox.askokcancel('山丘','askokcancel')
    #messagebox.askquestion('山丘','askquestion')
    #messagebox.askretrycancel('山丘','askretrycancel')
    #messagebox.askyesno('山丘','askyesno')
    #messagebox.showerror('山丘','showerror')
    #messagebox.showinfo('山丘','showinfo')
    messagebox.showwarning('山丘','showwarning')
Button(root,text='打开',command=show).pack()
mainloop()

结果:

  澳门新萄京官方网站 34  澳门新萄京官方网站 35  澳门新萄京官方网站 36  澳门新萄京官方网站 37 澳门新萄京官方网站 38   澳门新萄京官方网站 39  澳门新萄京官方网站 40

文件对话框:

  两个函数 askopenfilename()打开文件,asksaveasfilename()保存文件

  常用的值:

    initialdir:指定打开或保存的路径

  返回值:

    如果用户选择了一个文件,那么返回的就是该文件的完整路径

    如果用户选择了取消按钮,那么返回的就是空的字符串   

from tkinter import *
from tkinter import filedialog
root = Tk()
def show():
    filedialog.askopenfilename(initialdir=r'路径名')
Button(root,text='打开文件',command=show).pack()
mainloop()

颜色对话框:

  返回值:

    如果用户选择了一个颜色并点击确定按钮,返回一个二元组,第一个元素是RGB颜色值,第二个是对应的元素的十六进制颜色值

    如果用户点击取消,返回的是(None,None)

from tkinter import *
from tkinter import colorchooser
root = Tk()
def show():
    colorchooser.askcolor()
Button(root,text='选择颜色',command=show).pack()
mainloop()

结果:

  澳门新萄京官方网站 41

  最后,做一个注册窗口

from tkinter import *
from tkinter import messagebox
root = Tk()
def show():
    messagebox.askyesno('山丘','确认注册?')
def create():
    #top.attributes('-alpha',0.5)
    top = Toplevel(root)
    top.title('山丘')
    top.geometry('400x250')
    Label(top,text='用户名:').place(x=20,y=50)
    Label(top,text='密码:').place(x=20,y=120)
    Entry(top).place(x=110,y=50)
    Entry(top,show='*').place(x=110,y=120)
    Button(top,text='确认注册',width=10,command=show).place(x=170,y=190) 
root.title('山丘')
root.geometry('450x400')
Label(root,text='用户名:').place(x=100,y=170)
Label(root,text='密码:').place(x=100,y=230)
photo = PhotoImage(file='welcome.gif')
Label(root,image=photo).place(x=0,y=0)
Entry(root).place(x=190,y=170)
Entry(root,show='*').place(x=190,y=230)
Button(root,text='注册',width=10,command=create).place(x=100,y=300)  
Button(root,text='提交',width=10).place(x=300,y=300)
mainloop()

结果:

    澳门新萄京官方网站 42

参考文献:

  小甲鱼python教学视频

 

阅读目录: 事件绑定 Toplevel组件 标准对话框 事件绑定: 说明:对于每个组件来说,可以通过bind...

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:事件类型。
 

 

 

from tkinter import *
root=Tk()
root.geometry("200x200")
text=Text(root)
text.pack()

def func(event):
    print(event)
def func_release(event):
    print("release")
#单击
# text.bind("<Button-1>",func)
# root.bind("<Button-1>",func)
#双击
# text.bind("<Double-Button-1>",func)
# 鼠标释放
# text.bind("<ButtonRelease-1>",func_release)
#鼠标移入
# text.bind("<Enter>",func)
#鼠标按住移动事件
# text.bind("<B1-Motion>",func)
#键盘按下事件
# text.bind("<Key>",func)

#键位绑定事件
# def func3(event):
#     print("你按下了回车!")
# text.bind("<Return>",func3)


#实现的一个拖拽功能
def func4(event):
    # print(event)
    x=str(event.x_root)
    y=str(event.y_root)
    root.geometry("200x200 " x " " y)

text.bind("<B1-Motion>",func4)




root.mainloop()

 

补充:如果想要传参,可以使用lambda:

text.bind("<Button-1>",lambda event:func(event,"hello"))

 澳门新萄京官方网站 43

澳门新萄京官方网站 44


如果相应的event发生了,就会调用handler处理事件。举个例子: 
捕获鼠标点击事件:

protocol:

 

  • protocol的使用:控件.protocol(protocol,handler),其中控件为窗口对象(Tk,Toplevel)
  • 常见protocol有:
    • WM_DELETE_WINDOW:最常用的协议称为WM_DELETE_WINDOW,用于定义用户使用窗口管理器明确关闭窗口时发生的情况。如果使用自己的handler来处理事件的话,这时候窗口将不会自动执行关闭
    • WM_TAKE_FOCUS,WM_SAVE_YOURSELF:[这两个不知道什么来的。]
    • 更多需参考ICCCM文档
  • 注意:要留心协议的写法,在作为字符串填入时不要加多余的空格
 

from tkinter import *
import tkinter.messagebox
root=Tk()
root.geometry("200x200")
def func1():
    if tkinter.messagebox.askyesno("关闭窗口","确认关闭窗口吗"):
        root.destroy()

root.protocol("WM_DELETE_WINDOW",func1)

root.mainloop()

 


想要了解更多,可以参考tkinter的官方文档:


from Tkinter import *

root = Tk()
def callback(event):
    print "clicked at", event.x, event.y
frame = Frame(root, width=100, height=100)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()

 

在这里,我们使用frame的bind方法将一个callback方法绑定到一个事件,也就是点击鼠标左键,每点击一次,控制台打印出当前点击的坐标x,y。 
键盘事件被发送到当前拥有焦点的widget,你可以用focus_set方法来设置widget们的焦点: 
捕获键盘事件:

from Tkinter import *

root = Tk()

def key(event):
    print "pressed", repr(event.char)

def callback(event):
    print "clicked at", event.x, event.y

frame = Frame(root, width=100, height=100)
frame.bind("<Key>", key)
frame.bind("<Button-1>", callback)
frame.pack()

root.mainloop()

运行这个程序,你会发现,只有在当前窗口获取焦点的情况下,你按键盘键它才会捕获到并打印。

事件

事件用字符串定义,有一个特殊的语法规则:

<modifier-type-detail>

 

type字段是最重要的,它指出了事件的种类,可以指定为Button,Key或者Enter,Configure等等。modifier和detail字段可以提供一些附加信息,在大多数情况下可以不指定。还有很多方法可以简化事件字符串,比如:为了匹配一个键盘键,你可以省略尖角括号,直接用 键 即可。除非它是空格 , 或本身就是尖括号。 
让我们来看看最常用的事件格式: 
事件格式:

<Button-1>

 

一个鼠标点击事件。1代表左键,2代表中键,3代表右键。当你在一个widget上点击鼠标按键,tkinter会自动捕获并触发event,注意,当按键被抬起时才会执行handler。鼠标的位置(相对于widge)x,y会被发往event对象传入handler。你也可以这样:,<1>,它们是等价的。我比较喜欢这种方式。

<B1-Motion>

 

鼠标拖动事件。1代表按下左键拖动,2代表中键,3代表右键。同样的,鼠标的x,y会以event对象方式被送往handler。

<ButtonRelease-1>

 

鼠标按下之后释放

<Double-Button-1>

 

双击鼠标

<Enter>

 

注意,这里是鼠标指针进入到widget里,并不是代表按下键盘上的Enter键。

<Leave>

 

和上面的进入对应,鼠标离开widget。

<FocusIn> <FocusOut>

 

<Return> <Cancel> <BackSpace> <Tab> <Shift_L> <Control_L>
<Alt_L> <Home> <Left> <Up> <Right> <Down> <Delete> <F1> <F2>

 

这些按键都和键盘上的一一对应。

<Key>

随便一个按键,键值会以char的格式放入event对象。

a b c ... 1 2 ... 

对应键盘上的按键

<Configure>

这个关键了,如果widget的大小改变了,或者是位置,新的大小(width和height)会打包到event发往handler。

事件对象

事件对象是独立的python实例,有很多属性。 
对象属性:

widget  产生event的实例,不是名字,所有对象拥有
x,y     鼠标位置,单位:像素
x_root,y_root       鼠标相对于屏幕左上角的位置,像素
char        仅键盘事件,string
num     按钮num,仅鼠标事件
width,height        widget新大小
type        事件类型

 

实例绑定和类绑定

上面我们用的绑定方法是绑定到一个实例对象上,这就意味着,如果新建一个实例,它是没有绑定事件的。 
实际上,tkinter允许你将事件绑定到类上,甚至是绑定到程序本身。你可以创建四个层面的绑定:

  • 绑定到widget instance 使用bind方法
  • 绑定到widget的toplevel windows,顶层窗口,也是用bind
  • 绑定到widget class,使用bind_class

比如,你可以使用bind_all来创建一个F1键的绑定,这样你可以在任何地方打开帮助。

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:事件绑定与窗口,GUI之tkinter学习笔记3事件绑定

关键词: