python图形界面化编程GUI(三)事件绑定(鼠标和
常用组件汇总
⼀个 GUI 应用整个生命周期都处在⼀个消息循环 (event loop) 中。等待事件的发生,并作出相应的处理,点击一下按钮,就触发相应的事件,实现相应的功能。 Tkinter 提供了⽤以处理相关事件的机制,处理函数可被绑 定给各个控件的各种事件。
鼠标和键盘import tkinter as tk from tkinter import messagebox root = tk.Tk() root.geometry('500x300+100+100') # 定义函数的功能 # 点击时两个功能1.打印文字,2.消息框内显示文字 def button_mand(): print('你点击了按钮') messagebox.shoinfo('message','你点击了按钮') # 1.mand绑定事件 btn = tk.Button(root,text='确定',mand=button_mand) btn.pack() # 2.使用config方法配置参数 btn = tk.Button(root,text='确定1') btn.pack() btn.config(mand=button_mand) # 3.使用对象的属性配置参数 btn = tk.Button(root,text='确定2') btn.pack() btn['mand']=button_mand # 4.bind绑定事件 def button_mand1(event): # 此时必须要设置形参,但并不使用 print('你点击了按钮') messagebox.shoinfo('message','你点击了按钮') btn = tk.Button(root,text='确定3') btn.pack() btn.bind('event对象',button_mand1) # 此方法会出现按钮按下去按不上来的情况(跟消息框有关),可以重复点击,显示的内容是一样的,可以把1改为2,3 root.mainloop()
lambda 表达式定义的是⼀个匿名函数,只适合简单输入参数,简单计算返回结果,不适合功能复杂情况。 lambda 定义的匿名函数也有输入、也有输出,只是没有名字。
语法格式如下 lambda 参数值列表表达式 参数值列表即为输⼊。 表达式计算的结构即为输出。
lambda 表达式的参数值列表可以为如下内容
点击后显示你点击了按钮,打印1+2=3,1和2为实参传入
import tkinter as tk from tkinter import messagebox root = tk.Tk() root.geometry('500x300+100+100') # 定义函数的功能 # 点击时两个功能1.打印文字,2.消息框内显示文字 def button_mand(a,b): print('{}+{}={}'.format(a,b,a+b)) messagebox.shoinfo('message','你点击了按钮') # 1.mand绑定事件,此时lambda是函数,而button_mand只是调用 btn = tk.Button(root,text='确定',mand=lambda: button_mand(1,2)) btn.pack() # 2.使用config方法配置参数 btn = tk.Button(root,text='确定1') btn.pack() btn.config(mand=lambda: button_mand(1,2)) # 3.使用对象的属性配置参数 btn = tk.Button(root,text='确定2') btn.pack() btn['mand'] = lambda: button_mand(1,2) # 4.bind绑定事件 def button_mand1(event,a,b): # 此时必须要设置形参,但并不使用 print('{}+{}={}'.format(a,b,a+b)) messagebox.shoinfo('message','你点击了按钮') btn = tk.Button(root,text='确定3') btn.pack() btn.bind('OptionMenu选择项', lambda e: button_mand1(e,1,2)) # 实参中e可以为任意值 # 此方法会出现按钮按下去按不上来的情况(跟消息框有关),可以重复点击,显示的内容是一样的,可以把1改为2,3 root.mainloop()
OptionMenu(选择项)⽤来做多选⼀,选中的项会在顶部显示。
from tkinter import from tkinter import messagebox root = Tk() root.geometry('500x300') # 选择的值是可变的用 StringVar v = StringVar() v.set('A老师') om = OptionMenu(root,v,'B老师','A老师','C老师','D老师') om['idth'] = 20 om.pack() def test(): print('最喜欢的老师是',v.get()) messagebox.shoinfo('显示信息','最喜欢的老师是:{}'.format(v.get())) Button(root,text='确定',mand=test).pack() root.mainloop()
Scale(移动滑块)⽤于在指定的数值区间,通过滑块的移动来选择值。比如音量大小的滑动,网页的上下滑动等等
from tkinter import root = Tk() root.geometry('400x150') def test1(value): print('滑块的值',value) nefont = ('宋体',value) a.config(font=nefont) # 参数分别为,窗口,最小值,最大值,可滑动的长度,步长(间隔),横向(水平)滑动(默认垂直),触发命令 s1 = Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL,mand=test1) s1.pack() a = Label(root,text='文字大小',idth=10,height=1,bg='black',fg='hite') a.pack() root.mainloop()
最开始的状态
移动滑块的状态
颜⾊选择框可以帮助我们设置背景色、前景色、画板颜色、画笔颜色、 字体颜色等等。
from tkinter import from tkinter.colorchooser import root = Tk() root.geometry('400x150') def test1(): # 设置默认选择颜色为红色 s1 = askcolor(color='red',title='颜色选择框') print(s1) # 选择红色,得到((255.99609375, 0.0, 0.0), '#ff0000') root.config(bg=s1[1]) # 取s1里的第二个值 Button(root,text='选择背景色',mand=test1).pack() root.mainloop()
文件对话框帮助我们实现可视化的操作目录、操作文件。,将⽂件、目录的信息传入到程序中,从本地找到文件进行上传。文件对话框包含如下常用函数
命名参数 options 的常见值如下
from tkinter import from tkinter.filedialog import root = Tk() root.geometry("400x100") def test1(): # 标题为上传文件,默认打开绝对路径,D盘新建文件夹,只显示默认的格式,其他文件类型则不显示 f = askopenfilename(title="上传文件", initialdir="D:新建文件夹", filetypes=[("视频文件", ".ev4")]) # 可以用 ith askopenfilename() as f print(f) sho["text"] = f # 打开文件夹,显示文件夹下的所有文件 # f = askopenfile() # r 只读模式,显示的文件类型 # f = askopenfile(mode='r', filetypes=[('python', '.py'), ('python', '.pyc')]) # 选择打开多个文件 # f = askopenfiles(title='选择多个文件') # 保存文件 # f = asksaveasfilename() # print(f) Button(root, text="选择编辑的视频文件", mand=test1).pack() sho = Label(root, idth=40, height=3, bg="green") sho.pack() root.mainloop()
GUI 程序通常都有菜单,⽅便⽤户的交互。我们⼀般将菜单分为两种
1.主菜单
主菜单通常位于 GUI 程序上⽅。例如
import tkinter as tk root = tk.Tk() root.geometry('500x300+100+100') def callback(): print('被调用了') # 创建顶级菜单,不需要布局 menuber = tk.Menu(root) # 文件的菜单,打开,保存等 filemenu = tk.Menu(menuber, tearoff=False) filemenu.add_mand(label='打开', mand=callback) filemenu.add_mand(label='保存', mand=callback) filemenu.add_separator() # 分割线 filemenu.add_mand(label='退出', mand=root.quit()) menuber.add_cascade(label='文件', menu=filemenu) # 显示菜单 root.config(menu=menuber) root.mainloop()
2… 快捷菜单(上下⽂菜单)
通过⿏标右键单击某个组件对象⽽弹出的菜单,⼀般是与该组件相关的操作。
import tkinter as tk root = tk.Tk() root.geometry('500x300+100+100') def callback(): print('被调用了') # 创建顶级菜单,不需要布局 menuber = tk.Menu(root) # 文件的菜单,打开,保存等 filemenu = tk.Menu(menuber, tearoff=False) filemenu.add_mand(label='打开', mand=callback) filemenu.add_mand(label='保存', mand=callback) filemenu.add_separator() # 分割线 filemenu.add_mand(label='退出', mand=root.quit()) menuber.add_cascade(label='文件', menu=filemenu) # 上下文菜单 m = tk.Menu(root) m.add_mand(label='字体') def test(event): # 在鼠标右键点击坐标处显示菜单 m.post(event.x_root, event.y_root) # 获取点击事件的坐标 root.bind('ttk子模块',test) # 显示菜单 root.config(menu=menuber) root.mainloop()
ttk组件更加美观、功能更加强大。使用Combobox替代了原来的Listbox 、新增了LabeledScale( 带 标 签 的 Scale) 、Notebook(多⽂档窗口)、Progressbar(进度条)、Treevie(数)等组件。
Comboboximport tkinter as tk from tkinter import ttk root = tk.Tk() root.geometry('500x300+100+100') num = tk.StringVar() # 创建下拉列表框 # 之前用 tk.Listbox num_cbb = ttk.Combobox(root, textvariable=num) # 设置下拉列表的值 num_cbb['value'] = (1,5,10,50,100) num_cbb.pack() # 设置默认值,取得是传入数据的下标 num_cbb.current(0) # 第一个值 def func(): print(num_cbb.get()) tk.Button(root,text='打印选择的金额',mand=func).pack() root.mainloop()
import tkinter as tk from tkinter import ttk import time root = tk.Tk() root.geometry('320x240') def increment(): for i in range(100): p1['value'] = i + 1 # 值不断变化,一直+1 print(p1['value']) root.update() # 窗口更新 time.sleep(0.1) # cursor 鼠标变为小蜘蛛 ,length是进度条的长度 p1 = ttk.Progressbar(root,length=200,cursor='spider',mode='determinate',orient=tk.HORIZONTAL) p1.grid(ro=1, column=1) btn = ttk.Button(root, text='Start',mand=increment) btn.grid(ro=1,column=0) root.mainloop()