tkinter图形界面开发
目录
第16章 tkinter图形界面开发
tkinter是Python的标准GUI库,安装时自带,可以直接导入,如import tkinter as tk
16.1 主窗口容器
import tkinter
mainWin = tkinter.Tk() # 用构造方法Tk()创建主窗口容器。
mainWin.title("第一个tkinter程序") # 设置窗口标题
mainWin.geometry("400x300") # 设置窗口尺寸
label = tkinter.Label(mainWin,text="用Python的tkinter模块实现GUI") # 在主窗口中创建标签组件
button1 = tkinter.Button(mainWin,text="按钮1") # 在主窗口中创建按钮组件
button2 = tkinter.Button(mainWin,text="按钮2")
label.pack() # 标签组件以包裹方式添加进窗口
button1.pack(side=tkinter.LEFT) # 按钮组件以包裹方式添加进窗口,设置为靠左。
button2.pack(side=tkinter.RIGHT)
mainWin.mainloop() # 执行消息循环,相当于while循环,则之后的代码不被执行
16.2 窗口组件
16.2.1 组件概述
-
Tkinter的提供各种控件,如按钮,标签和文本框,一个GUI应用程序中使用,目前有15种Tkinter的部件。详情查找菜鸟教程
控件 描述 Button 按钮控件;在程序中显示按钮。 Canvas 画布控件;显示图形元素如线条或文本 Checkbutton 多选框控件;用于在程序中提供多项选择框 Entry 输入控件;用于显示简单的文本内容 Frame 框架控件;在屏幕上显示一个矩形区域,多用来作为容器 Label 标签控件;可以显示文本和位图 Listbox 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户 Menubutton 菜单按钮控件,用于显示菜单项。 Menu 菜单控件;显示菜单栏,下拉菜单和弹出菜单 Message 消息控件;用来显示多行文本,与label比较类似 Radiobutton 单选按钮控件;显示一个单选的按钮状态 Scale 范围控件;显示一个数值刻度,为输出限定范围的数字区间 Scrollbar 滚动条控件,当内容超过可视化区域时使用,如列表框。. Text 文本控件;用于显示多行文本 Toplevel 容器控件;用来提供一个单独的对话框,和Frame比较类似 Spinbox 输入控件;与Entry类似,但是可以指定输入范围值 PanedWindow PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。 LabelFrame labelframe 是一个简单的容器控件。常用与复杂的窗口布局。 tkMessageBox 用于显示你应用程序的消息框。 -
标准属性也就是所有控件的共同属性,如大小,字体和颜色等等。
属性 描述 Dimension 控件大小; Color 控件颜色; Font 控件字体; Anchor 锚点; Relief 控件样式; Bitmap 位图; Cursor 光标; -
Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织.
几何方法 描述 pack() 包装; grid() 网格; place() 位置;
16.2.2 组件演示
-
框架Frame
import tkinter as tk mainWin = tk.Tk() mainWin.title("框架演示") mainWin.geometry("300x200") tk.Label(mainWin,text="校训",font=("Arial",20)).pack() mainFrame = tk.Frame(mainWin) # 在主窗口创建一个主框架 # 左框架 left_frame = tk.Frame(mainFrame) tk.Label(left_frame,text="厚德",font=("Arial",15)).pack(side=tk.TOP) tk.Label(left_frame,text="博学",font=("Arial",15)).pack(side=tk.TOP) left_frame.pack(side=tk.LEFT) # 右框架 right_frame = tk.Frame(mainFrame) tk.Label(right_frame,text="敬业",font=("Arial",15)).pack(side=tk.TOP) tk.Label(right_frame,text="乐群",font=("Arial",15)).pack(side=tk.TOP) right_frame.pack(side=tk.RIGHT) # ----------------- mainFrame.pack() # 所有控件捆绑在主框架后,添加到主窗口。 mainWin.mainloop() -
按钮Button
import tkinter as tk mainWin = tk.Tk() mainWin.title("按钮演示") mainWin.geometry("400x300") btn_1 = tk.Button(mainWin, anchor=tk.E, # 设置文本对齐方式 text="按钮1", # 按钮的文本 width=30, height=7) btn_2 = tk.Button(mainWin, text="按钮2", bg="blue") # 设置背景颜色 btn_3 = tk.Button(mainWin, text="按钮3", width=12, height=1) btn_4 = tk.Button(mainWin, text="按钮4", width=40, height=7, state=tk.DISABLED) # 设置按钮为禁用 btn_1.pack() btn_2.pack() btn_3.pack() btn_4.pack() mainWin.mainloop() -
文本框Entry/Text
import tkinter as tk mainWin = tk.Tk() # Entry文本框 frame_1 = tk.Frame(mainWin) entry_1 = tk.Entry(frame_1, show="*") # 文本显示为“*” entry_2 = tk.Entry(frame_1, show="#") # 文本显示为“#” entry_3 = tk.Entry(frame_1,bg="red",fg="gray") # 设置背景色、前景色 entry_4 = tk.Entry(frame_1,selectbackground="red", # 设置选中文本后的背景色、前景色 selectforeground="gray") entry_1.pack() entry_2.pack() entry_3.pack() entry_4.pack() # text文本框 frame_2 = tk.Frame(mainWin) label_name = tk.Label(frame_2,text="name:") label_tel = tk.Label(frame_2,text="tel:") label_email = tk.Label(frame_2,text="email:") text_name = tk.Text(frame_2,height="1",width=30) text_tel = tk.Text(frame_2,heigh="1",width=30) text_email = tk.Text(frame_2,heigh="1",width=30) btn_1 = tk.Button(frame_2,text="submit",width=7) btn_2 = tk.Button(frame_2,text="cancel",width=7) # 以网格方式添加到容器中 label_name.grid(row=0,column=0) label_tel.grid(row=1,column=0) label_email.grid(row=2,column=0) text_name.grid(row=0,column=1) text_tel.grid(row=1,column=1) text_email.grid(row=2,column=1) btn_1.grid(row=3,column=0) btn_2.grid(row=3,column=1) # ------------------------ frame_1.grid(row=0,column=0) frame_2.grid(row=1,column=0) mainWin.mainloop() -
菜单Menu
- 需要使用config()将菜单添加到窗口中。
- Menu()既可以创建菜单栏,又可以创建子菜单。
- 子菜单以“add_XXX()”方法添加菜单项或修饰。
import tkinter as tk def display(): print("打开了某菜单项。") mainWin = tk.Tk() # 创建菜单栏 menubar = tk.Menu(mainWin) # 创建下级子菜单 file_menu = tk.Menu(menubar,tearoff=0) # 文件子菜单,设为不可独立 file_menu.add_command(label="打开",command=display) file_menu.add_command(label="保存",command=display) file_menu.add_command(label="关闭",command=display) edit_menu = tk.Menu(menubar,tearoff=1) # 编辑子菜单,设为可独立 edit_menu.add_command(label="复制",command=display) edit_menu.add_command(label="剪切",command=display) edit_menu.add_command(label="粘贴",command=display) help_menu = tk.Menu(menubar) # 帮助子菜单,默认可独立 help_menu.add_command(label="关于",command=display) help_menu.add_command(label="联系",command=display) # 将子菜单添加到菜单栏 menubar.add_cascade(label="文件",menu=file_menu) menubar.add_cascade(label="编辑",menu=edit_menu) menubar.add_cascade(label="帮助",menu=help_menu) # 将菜单栏添加到主窗口 mainWin.config(menu=menubar) mainWin.mainloop() -
单选框Radiobutton和复选框Checkbutton
import tkinter as tk mainWin = tk.Tk() # 单选按钮 r = tk.StringVar() # 创建一个tk中的变量 r.set("空") # 先初始化 # 单选按钮绑定该变量,赋不同的值 radio_1 = tk.Radiobutton(mainWin,variable=r,value="按钮1",text="单选按钮1") radio_2 = tk.Radiobutton(mainWin,variable=r,value="按钮2",text="单选按钮2") radio_3 = tk.Radiobutton(mainWin,variable=r,value="按钮3",text="单选按钮3") radio_1.pack() radio_2.pack() radio_3.pack() # 多选按钮 var1 = tk.IntVar() # 创建3个tk中的变量 var2 = tk.IntVar() var3 = tk.IntVar() # 每个复选框绑定一个变量,设置选中时的值和未选中时的值。 check_1 = tk.Checkbutton(mainWin,text="是否加鸡蛋",variable=var1,onvalue=1,offvalue=0) check_2 = tk.Checkbutton(mainWin,text="是否加米饭",variable=var2,onvalue=1,offvalue=0) check_3 = tk.Checkbutton(mainWin,text="是否加青菜",variable=var3,onvalue=1,offvalue=0) check_1.pack() check_2.pack() check_3.pack() # ---------------- mainWin.mainloop() -
画布Canvas
- Canvas控件可以绘制直线、圆弧、矩形的简单图案。
import tkinter as tk mainWin = tk.Tk() # 创建画布 canvas = tk.Canvas(mainWin,width=600,height=480,bg="white") # 加入图片 img = tk.PhotoImage(file="图片.png") canvas.create_image(300,50, image=img) # 加入文字 canvas.create_text(300,75, text="Using Canvas",fill="blue") canvas.create_text(302,77, text="Using Canvas",fill="gray") # 绘制六边形 canvas.create_polygon(290,114,316,114,330,130,310,146,284,146,270,130) # 绘制椭圆 canvas.create_oval(280,120,320,140,fill="red") # 绘制直线 canvas.create_line(250,130,350,130) canvas.create_line(300,100,300,160) # 绘制矩形 canvas.create_rectangle(90,190,510,400,width=5) # 绘制圆弧 canvas.create_arc(100,200,500,400,start=0,extent=240,fill="pink") canvas.create_arc(103,203,500,400,start=240,extent=118,fill="red") # --------------- canvas.pack() mainWin.mainloop()
16.3 事件处理
-
对于Button、Menu等组件,可以在创建组件时通过参数command指定事件的处理函数。
-
鼠标事件、键盘事件、窗口事件可以绑定到组件上实现事件处理。
方法 功能 bind(sequence, func, add) 绑定响应函数来处理事件。 bind_class(className, sequence, func, add) 绑定一个类来处理事件。 bind_all(sequence, func, add) 将所有组件的事件绑定一个响应函数。 -
参数表
- func 被绑定的响应函数。
- sequence 即事件,是用“<>”包裹的字符串。
- className 被绑定的类。
- add 可选参数,空字符或“+”。
16.3.1 鼠标事件
<1> = <Button-1> =<ButtonPress-1> 鼠标左键单击
<2> = <Button-2> = <ButtonPress-2> 鼠标中键单击
<3> = <Button-3> =<ButtonPress-3> 鼠标右键单击
<B1-Motion> 鼠标左键拖动
<B2-Motion> 鼠标中键拖动
<B3-Motion> 鼠标右键拖动
<ButtonRelease-1> 鼠标左键释放
<ButtonRelease-2> 鼠标中键释放
<ButtonRelease-3> 鼠标右键释放
<Double-Button-1> 鼠标左键双击
<Double-Button-2> 鼠标中键双击
<Double-Button-3> 鼠标右键双击
<Motion> 鼠标在某个按键被按下时的移动事件
<Enter> 鼠标指针进入控件
<Leave> 鼠标指针离开控件
16.3.2 键盘事件
<Return> 回车
<Cancel> Break键
<BackSpace> BackSpace键
<Tab> Tab键
<Shift_L> Shift键
<Alt_L> Alt键
<Control_L> Control键
<Pause> Pause键
<Caps_Lock> Caps_Lock键
<Escape> Escape键
<Prior> PageUp键
<Next> PageDown键
<End> End键
<Home> Home键
<Left> 左箭头
<Up> 上箭头
<Right> 右箭头
<Down> 下箭头
<Print> Print Screen键
<Insert> Insert键
<Delete> Delete键
<F1> F1键
<Num_Lock> Num_Lock键
<Scroll_Lock> Scroll_Lock键
<key> 任意键
组合键
<Shift-Up> Shift+Up
<Alt-Up> Alt+Up
<Control-Up> Ctrl+Up
<Control-A> Ctrl+shift+a
16.3.3 窗口事件
<Configure> 改变大小或位置
<Visibility> 当组件变为可视状态时触发
<Unmap> 当组件由显示状态变为隐藏状态时触发
<Map> 当组件由隐藏状态变为显示状态时触发
<Expose> 当组件从原本被其他组件遮盖的状态中暴漏出来时触发
<FocusIn> 组件获得焦点时触发
<FocusOut> 组件失去焦点时触发
<Circulate> 当窗体由于系统协议要求在堆栈中置顶或压底时触发
<Colormap> 当窗体的颜色或外貌改变时触发,Tk中忽略此细则
<Property> 当窗体的属性被删除或改变时触发,属于TK的核心
<Destroy> 当组件被销毁时触发
<Activate> 与组件选项中的state项有关,表示组件由不可用变为可用时触发
<Deactiavte> 与组件选项中的state项有关,表示组件由可用变为不可用时候触发
16.3.4 event的成员属性
当窗口事件别绑定响应函数,事件被触发时,Python会向该函数传递一个event对象作参数。
Widget 事件被触发的控件
x, y 鼠标距离窗体左上角的位置(坐标)
x_root, y_root 鼠标距离屏幕左上角的位置(坐标)
char 键盘事件对应的字符代码
keysym 键盘事件对应的字符串
keycode 键盘事件对应的按键码
num 鼠标事件对应的按键码
width, height 控件的新大小
type 事件类型
16.4 代码示例
-
鼠标按键事件的演示
import tkinter as tk root = tk.Tk() # 定义两个响应函数 def callback_1(event): print("点击位置:", event.x, event.y) def callback_2(event): print("点击的键盘字符为:", event.char) # 创建框架组件绑定事件 frame = tk.Frame(root, width=200, height=200) frame.bind("<Button-1>", callback_1) # 绑定鼠标事件 frame.bind("<Key>", callback_2) # 绑定键盘事件 frame.focus_set() # 设置框架组件获取焦点 frame.pack() # -------------- root.mainloop() -
一个“英尺/米”换算器
import tkinter as tk from tkinter import ttk # ttk子模块提供了更美观的部件样式。 # 定义响应函数进行单位换算 def calculate(*args): try: value = float(feet.get()) meter.set( (0.3048*value*10000.0 + 0.5) / 10000.0 ) except ValueError: pass # 创建主框架GUI mainWin = tk.Tk() mainWin.title("单位换算器") frame = ttk.Frame(mainWin,padding="3 3 12 12") frame.grid(column=0,row=0,sticky=(tk.N,tk.W,tk.E,tk.S)) # sticky可选参数用于指定对齐方式 # 定义两个tk变量存放数据 feet = tk.StringVar() meter = tk.StringVar() # 创建组件并添加到框架 feet_entry = ttk.Entry(frame,width=7,textvariable=feet) feet_entry.grid(column=2,row=1,sticky=(tk.W,tk.E)) ttk.Label(frame,textvariable=meter).grid(column=2,row=2,sticky=(tk.W,tk.E)) ttk.Button(frame,text="计算",command=calculate).grid(column=3,row=3,sticky=tk.W) ttk.Label(frame,text="英尺").grid(column=3,row=1,sticky=tk.W) ttk.Label(frame,text="相当于").grid(column=1,row=2,sticky=tk.E) ttk.Label(frame,text="米").grid(column=3,row=2,sticky=tk.W) # 调整排版 for child in frame.winfo_children(): # 遍历所有部件 child.grid_configure(padx=5,pady=5) # 在网格中定位子部件 # 绑定键盘事件 feet_entry.focus() mainWin.bind("<Return>",calculate) # 回车键触发 # ----------- mainWin.mainloop()

浙公网安备 33010602011771号