python-GUI-Tkinter

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-----------------------创建子窗口容器组件

组件的大致使用步骤

  1. 创建总面板
  2. 创建面板上的各种组件
    1. 指定组件的父组件,即依附关系
    2. 利用相应的属性对组件进行设置
    3. 给组件安排布局
  3. 启动总面板的消息循环

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()

消息机制

  • 消息的传递机制
    • 消息由系统负责发送到队列
    • 由相关组件进行绑定/设置
  • 消息格式
    • <modifier->---type-[-detail]>
    • <Button-1>:鼠标左键
    • <KeyPress-A>:键盘A键位
    • <Control-Shift-KeyPress-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('<Button-1>',baseLabel)
lb.pack()
#启动消息循环
baseFrame.mainloop()
  • 绑定
    • bing_all:全局范围的绑定,默认的是全局快捷键,比如F1是帮助文档
    • bind_class:接受三个参数,第一个类名,第二个事件,第三个操作
      • w.bind_class('Entry','<Control-V>',my_paste)
    • 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('<Button-3>',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('<Button-3>',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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353