GUI介绍
- Graphical User Interface
- GUI for Python:Tkinter,wxPython,PyQt
- Tkinter
- 绑定的是TK GUI工具集,用Python包装的Tcl代码
- PyGTK
- Tkinter替代品
- wxPython
- 跨平台的Python GUI
- PyQt
Tkinter常用组件
- 按钮
- Button------------------------按钮组件
- RadioButton----------------单选框组件
- CheckButton----------------选择按钮组件
- Listbox------------------------列表框组件
- 文本输入组件
- Entry---------------------------单行文本框组件
- Text----------------------------多行文本框组件
- 标签组件
- Label--------------------------可以显示图片和文字
- Message---------------------可以根据内容将文字换行
- 菜单
- Menu---------------------------菜单组件
- MenuButton------------------菜单按钮组件
- 滚动条
- scale---------------------------滑动组件
- Scrollbar----------------------滚动条组件
- 其他组件
- Canvas-----------------------画布组件
- Frame------------------------框架组件,将多个组件编组
- Toplevel-----------------------创建子窗口容器组件
组件的大致使用步骤
- 创建总面板
- 创建面板上的各种组件
- 指定组件的父组件,即依附关系
- 利用相应的属性对组件进行设置
- 给组件安排布局
- 启动总面板的消息循环
label组件示例
import tkinter
base = tkinter.Tk()
#标题
base.wm_title('Label test')
#label组件
lb = tkinter.Label(base,text = 'python label',background = 'blue')
#布局设置
lb.pack()
#启动消息循环
base.mainloop()
button组件示例
import tkinter
def showLabel():
#在函数中定义了一个label
#label的父组件是baseFrame
lb = tkinter.Label(baseFrame,text = '显示label')
lb.pack()
baseFrame = tkinter.Tk()
btn = tkinter.Button(baseFrame,text = 'Show label',command = showLabel)
btn.pack()
baseFrame.mainloop()
组建布局
- 控制组件的摆放方式
- 三种布局:
- pack:按照方位布局
- place:按照坐标布局
- grid:网格布局
- pack布局
- 最简单,代码量最少,挨个摆放,默认从上到下,系统自动设置
- 通用使用方式:组件对象.pack(,,,,,,,,,)
- side:停靠方位,LEFT,TOP,RIGHT,BOTTON
- fill:填充方式,X,Y,BOTH,NONE
- expand:yes/no
- ·················
- grid布局
- 组件对象.grid(,,,,,,,,)
- 利用row,column编号,从零开始
- sticky:N,E,S,W,决定组件从哪个方向开始
- rowspan,cloumnspan表示跨行,跨列数量
- place布局
- 明确方位的摆放
- 相对位置布局,随意改变窗口大小会导致混乱
- 使用place函数,分为绝对布局和相对布局,绝对布局使用x,y参数,相对布局使用relx,rely,relhight,relwidth
grid布局示例
import tkinter
baseFrame = tkinter.Tk()
lb1 = tkinter.Label(baseFrame,text = '账号:').grid(row = 0,sticky = tkinter.W)
tkinter.Entry(baseFrame).grid(row = 0,column = 1,sticky =tkinter.E)
lb2 = tkinter.Label(baseFrame,text = '密码:').grid(row = 1,sticky = tkinter.W)
tkinter.Entry(baseFrame).grid(row = 1,column = 1,sticky =tkinter.E)
tkinter.Button(baseFrame,text = '登录').grid(row = 2,column = 1,sticky = tkinter.W)
baseFrame.mainloop()
消息机制
- 消息的传递机制
- 消息由系统负责发送到队列
- 由相关组件进行绑定/设置
- 消息格式
---type-[-detail]> :鼠标左键 :键盘A键位 :同时按下Control,Shift,A键位
消息示例
import tkinter
def baseLabel(event):
lb = tkinter.Label(baseFrame,text = '谢谢点击')
lb.pack()
#程序总框架
baseFrame = tkinter.Tk()
lb = tkinter.Label(baseFrame,text='模拟按钮')
#label绑定相应的消息和处理函数
lb.bind('',baseLabel)
lb.pack()
#启动消息循环
baseFrame.mainloop()
- 绑定
- bing_all:全局范围的绑定,默认的是全局快捷键,比如F1是帮助文档
- bind_class:接受三个参数,第一个类名,第二个事件,第三个操作
- w.bind_class('Entry','
',my_paste)
- w.bind_class('Entry','
- bind:单独对某一个实例绑定
- unbind:解绑
输入框
import tkinter
def reg():
name,pwd= e1.get(),e2.get()
t1,t2 =len(name),len(pwd)
if name == "111" and pwd == "222":
lb3['text'] = '登录成功'
else:
lb3['text'] = '用户名或密码错误'
e1.delete(0,t1)
e2.delete(0,t2)
baseFrame = tkinter.Tk()
lb1 = tkinter.Label(baseFrame,text='用户名')
lb1.grid(row=0,column=0,stick=tkinter.W)
e1 = tkinter.Entry(baseFrame)
e1.grid(row=0,column=1,stick=tkinter.E)
lb2 = tkinter.Label(baseFrame,text='密码')
lb2.grid(row=1,column=0,stick=tkinter.W)
e2 = tkinter.Entry(baseFrame)
e2.grid(row=1,column=1,stick=tkinter.E)
e2['show'] = '*'
btn = tkinter.Button(baseFrame,text='登录',command=reg)
btn.grid(row=2,column=1,stick=tkinter.E)
lb3 = tkinter.Label(baseFrame)
lb3.grid(row=2,column=0,stick=tkinter.W)
baseFrame.mainloop()
菜单
- 第一个Menu类定义的是parent
- add_command 添加菜单项,如果菜单是顶层菜单,则从左向右添加
- label:指定菜单项名称
- command:点击后相应的调用函数
- acceletor:快捷键
- menu:属性制定哪一个作为顶级菜单
- add_cascade 级联菜单
- label:名称
- menu:指明把菜单级联到哪一个菜单上
- add_separator:添加分隔符
- 弹出式菜单
- 监听鼠标右键,如果右键点击,则根据位置判断弹出,
- 调用Menu的pop方法
菜单示例1
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
for item in ['File','Edit','View','About']:
menupar.add_command(label=item)
baseFrame['menu'] = menupar
baseFrame.mainloop()
菜单示例2
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
menusun = tkinter.Menu(menupar)
for item in ['第一个','第二个','第二个']:
menusun.add_command(label=item)
menupar.add_command(label = 'File')
menupar.add_cascade(label = 'Edit',menu = menusun)
menupar.add_command(label = 'About')
baseFrame['menu'] = menupar
baseFrame.mainloop()
菜单示例3
import tkinter
baseFrame = tkinter.Tk()
menupar = tkinter.Menu(baseFrame)
def makelabel():
tkinter.Label(baseFrame,text='赶紧关了').pack()
for item in ['第一个','第二个','第三个']:
menupar.add_separator()
menupar.add_command(label=item)
menupar.add_separator()
menupar.add_command(label='点我',command=makelabel)
#事件处理函数一定要有一个参数,且第一个参数表示的是系统事件
def pop(event):
menupar.post(event.x_root,event.y_root)
baseFrame.bind('',pop)
baseFrame.mainloop()
画布
- canvas,在画布上绘制对象,通常用create_×××,例如line、rectangle
- 每次调用create_×××都会返回一个创建的组件的ID,同时也可以用tag属性指定其标签
- 调用canvas.move实现动作
画布示例1
import tkinter
baseFrame = tkinter.Tk()
cvs = tkinter.Canvas(baseFrame,width = 300,height=200)
cvs.pack()
cvs.create_line(23,23,190,230)
cvs.create_text(50,50,text='hahahahaha')
baseFrame.mainloop()
画布示例2
import tkinter
baseFrame = tkinter.Tk()
def btnClick(event):
cvs.move(id_ball,12,5)
cvs.move('fall',0,5)
cvs = tkinter.Canvas(baseFrame,width=500,height=500)
cvs.pack()
cvs.bind('',btnClick)
#创建组件后返回id
id_ball = cvs.create_oval(20,20,50,50,fill='blue')
#创建组件使用tag属性
cvs.create_text(120,60,fill='blue',text='hahahahaha',tag='fall')
#若没有指定tag可用addtag_withtag添加
#同类函数还有addtag_all,addtag_above等
id_rectangle = cvs.create_rectangle(60,80,180,100,fill='blue')
cvs.addtag_withtag('fall',id_rectangle)
baseFrame.mainloop()