GUI的Python实现
1 实现
Tkinter是Python的默认GUI库。它基于Tk工具包,该工具包最初是为工具命令语言设计的。Tk 普及后,结合 Tk 的 GUI 开发的可移植性与灵活性,可以让你快速开发和实现很多与商业软件品质相当的 GUI 应用。
让 GUI 程序启动和运行起来需要以下 5 个主要步骤。
1.导入 Tkinter 模块(或 from Tkinter import *)。
2.创建一个顶层窗口对象,用于容纳整个 GUI 应用。
3.在顶层窗口对象之上构建所有的 GUI 组件。
4.通过底层的应用代码将这些 GUI 组件连接起来。
5.进入主事件循环。
import tkinter
top = tkinter.Tk() #(小写k)顶窗口
label = tkinter.Label(top,text='Hello GUI') #控件
label.pack() #布局
top.mainloop() #无限循环
解释:
Tkinter.Tk()返回的对象通常称为根窗口,GUI 程序中可以有多个顶层窗口,但是其中只能有一个是根窗口。
顶层的根窗口对象包含组成 GUI 应用的所有小窗口对象。它们可能是文字标签、按钮、列表框等。这些独立的 GUI 组件称为控件。
Tk 有 3 种布局管理器来帮助控件集进行定位。 Placer:管理器就会将其摆放好;Packer:往行李箱中填充行李的过程;Grid:基于网格坐标
2 控件
- 控件可以独立存在,也可以作为容器存在。如果一个控件包含其他控件,就可以将其认为是那些控件的父控件。
Frame容器
import tkinter
top = tkinter.Tk() #(小写k)顶窗口
frame = tkinter.Frame()
label = tkinter.Label(frame,text='Hello GUI')#控件
label.pack()#布局
frame.pack()
top.mainloop()#无限循环
其他容器:LabelFrame,Toplevel
- 通常,控件有一些相关的行为,比如按下按钮、将文本写入文本框等。这些用户行为称为事件,而 GUI 对这类事件的响应称为回调。
import tkinter
def buttonAction(event): #事件处理函数(event)
print(event.x, event.y)
top = tkinter.Tk() #(小写k)顶窗口
frame = tkinter.LabelFrame()
button = tkinter.Button(frame, text='这是一个按钮')
button.bind('<Button-1>', buttonAction) #绑定事件
button.pack()
frame.pack()
top.mainloop()#无限循环
解释:
控件.bind('<事件代码>',event_handler) #适用于大多数控件。此外还有bind_all方法。
控件.protocal('事件代码', event_handler) #这种情况的控件,必需是顶层窗口或者root容器。
常用事件:
鼠标事件:
Event Description
<Button-1> 鼠标左键
<Button-3> 鼠标右键
<Button-2> 鼠标中键
<Button-4> 鼠标向上滚动
<Button-5> 鼠标向下滚动
<Double-Button-1> 鼠标左键双击
<Double-Button-3> 鼠标右键双击
<Double-Button-2> 鼠标中键双击
<Triple-Button-1> 鼠标左键三击
<Triple-Button-3> 鼠标右键三击
<Triple-Button-2> 鼠标中键三击
<B1-Motion> 左键移动
<B3-Motion> 右键移动
<B2-Motion> 中键移动
<ButtonRelease-1> 释放鼠标左键
<ButtonRelease-3> 释放鼠标右键
<ButtonRelease-2> 释放鼠标中键
<Enter> 鼠标光标进入控件时触发
<Leave> 鼠标光标离开控件时触发
键盘事件:
Event Description
<Key> 响应所有的按键(按下)
<KeyRelease> 响应所有的按键(松开)
<FocusIn> 控件或控件的子空间获得键盘焦点.
<FocusOut> 控件丢失键盘焦点 (焦点移动到另一个控件).
<Return>/<Enter> 只有回车键响应
<Escape> esc键
<space> 空格键
<Tab> Tab键
<Up>/<Down>/<Left>/<Right> 上下左右键
<Shitf_L>/<Shift_R> 左右Shift键(类似有左右两个键的, 添加_L/_R区分)
<BackSpace> 退格
<a>/<b> 指定的小写字母键
<A>/<Z> 指定的大写字母键
<Control-Alt-a> 组合键(可识别任意组合键)
作者:TitanCoder
链接:https://www.jianshu.com/p/6f88eff109e8
enent_handler事件响应的参数:
Tk | Tkinter Event Field | Tk | Tkinter Event Field |
---|---|---|---|
%f | focus | %A | char |
%h | height | %E | send_event |
%k | keycode | %K | keysym |
%s | state | %N | keysym_num |
%t | time | %T | type |
%w | width | %W | widget |
%x | x | %X | x_root |
%y | y | %Y | y_root |
- 具体控件介绍:
1)button控件
Button ( master, option=value, ... )
master: 按钮的父容器。
options: 可选项,即该按钮的可设置的属性。这些选项可以用键 = 值的形式设置,并以逗号分隔。
属性:
activebackground 当鼠标放上去时,按钮的背景色
activeforeground 当鼠标放上去时,按钮的前景色
text 按钮的文本内容
font 文本字体
bd 按钮边框的大小,默认为 2 个像素
bg 按钮的背景色
fg 按钮的前景色(按钮文本的颜色)
padx 按钮在x轴方向上的内边距(padding),是指按钮的内容与按钮边缘的距离
pady 按钮在y轴方向上的内边距(padding)
height 按钮的高度
width 按钮的宽度,如未设置此项,其大小以适应按钮的内容(文本或图片的大小)
command 按钮关联的函数,当按钮被点击时,执行该函数
relief 边框样式,设置控件3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。
state 设置按钮组件状态,可选的有NORMAL、ACTIVE、 DISABLED。默认 NORMAL。
anchor 锚选项,控制文本的位置,默认为中心
image 按钮上要显示的图片
justify 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
underline 下划线。默认按钮上的文本都不带下划线。取值就是带下划线的字符串索引,为 0 时,第一个字符带下划线,为 1 时,前两个字符带下划线,以此类推
wraplength 限制按钮每行显示的字符的数量
highlightcolor 要高亮的颜色
import tkinter
import tkMessageBox
def helloCallBack():
tkMessageBox.showinfo( "弹窗", "Hello !")
top = tkinter.Tk()
B = Tkinter.Button(top, text ="点我", command = helloCallBack)
B.pack()
top.mainloop()
2)Entery
属性:
bg 输入框背景颜色
bd 边框的大小,默认为 2 个像素
fg 文字颜色。值为颜色或为颜色代码,如:'red','#ff0000'
font 文本字体
cursor 光标的形状设定,如arrow, circle, cross, plus 等
width 文本框宽度
justify 显示多行文本的时候,设置不同行之间的对齐方式,可选项包括LEFT, RIGHT, CENTER
relief 边框样式,设置控件3D效果,可选的有:FLAT、SUNKEN、RAISED、GROOVE、RIDGE。默认为 FLAT。
show 指定文本框内容显示为字符,值随意,满足字符即可。如密码可以将值设为 show="*"
state 默认为 state=NORMAL, 文框状态,分为只读和可写,值为:normal/disabled
textvariable 文本框的值,是一个StringVar()对象
selectbackground 选中文字的背景颜色
selectborderwidth 选中文字的背景边框宽度
selectforeground 选中文字的颜色
exportselection 在输入框中选中文本,默认会复制到粘贴板,如果要忽略这个功能刻工艺设置 exportselection=0。
highlightcolor 文本框高亮边框颜色,当文本框获取焦点时显示
xscrollcommand 设置水平方向滚动条,一般在用户输入的文本框内容宽度大于文本框显示的宽度时使用。
常用方法:
get() 获取文件框的值
delete ( first, last=None ) 删除文本框里直接位置值
index ( index ) 返回指定的索引值
nsert ( index, s ) 向文本框中插入值,index:插入位置,s:插入值
select_clear() 清空文本框
1.3 布局
top.pack() #自适应的布局方案
top.grid() #网格布局方案
top.place() #按坐标的布局方案
1) pack布局的参数:
ipadx | 水平方向上的内边距 |
ipady | 垂直方向上的内边距 |
padx | 水平方向上的外边距 |
pady | 垂直方向上的外边距 |
after | 将组件置于其他组件之后 |
before | 将组件置于其他组件之前 |
anchor | 组件的对齐方式,顶对齐’tk.N’,底对齐'tk.S’,左'tk.W',右'tk.E' ,中间'tk.CENTER', |
side | 组件在主窗口的位置,可以为’top’,’bottom’,’left’,’right’; |
fill | 填充方式 (tk.Y垂直填充,tk.X水平填充,tk.BOTH为两边填充,None为不填充) |
expand | 1可扩展,0不可扩展 |
2) grid布局的参数
sticky #对齐方向(tk.N上,tk.W右,tk.S下,tk.E左)
column #组件所在的列起始位置;
columnspan #组件的列宽(占用的列数);
row #组件所在的行起始位置;
rowspan #组件的行宽(占用的行数);
tk.Label.grid(row =0,column=0,sticky=tk.E)
tk.Button.grid(row =1,column=1)
3) place布局的参数
anchor #组件对齐方式,同上;
x #组件左上角的x坐标;
y #组件左上角的y坐标;
relx #组件相对于窗口的x坐标,应为0-1之间的小数;
rely #组件相对于窗口的y坐标,应为0-1之间的小数;
#可以同时使用相对坐标和绝对坐标,此时组件为在相对坐标的基础上作绝对坐标的偏移
width #组件的宽度;
height #组件的高度;
relwidth #组件相对于窗口的宽度,0-1之间;
relheight #组件相对于窗口的高度,0-1之间;