python图形化界面

一.定义理解

Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。其图像化编程的基本步骤通常包括:

~导入 tkinter 模块

创建 GUI 根窗体

添加人机交互控件并编写相应的函数。

在主事件循环中等待用户触发事件响应。

二.tkinter中的组件

1.常用的组件

控件名称作用
Button按钮单击触发事件
Canvas画布绘制图形或绘制特殊控件
Checkbutton复选框多项选择
Entry输入框接收单行文本输入
Frame框架用于控件分组
Label标签单行文本显示
Listbox列表框显示文本列表
Menu菜单创建菜单命令
Message消息多行文本标签,与Label用法类似
Radiobutton单选按钮从互斥的多个选项中做单项选择
Scale滑块默认垂直方向,鼠标拖动改变数值形成可视化交互
Scrollbar滑动条默认垂直方向,鼠标拖动改变数值,可与Text,Listbox,Canvas等控件配合移动可视化空间
Text文本框接收或输出多行文本
Toplevel新建窗体容器在顶层创建新窗体
常用组件的举例:
(1.)设置窗口,标题,大小和位置
import tkinter
# 创建主窗口
win = tkinter.Tk()
# 设置标题
win.title("小王最帅")
#设置大写和位置
win.mainloop()

输出:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKFhPz0W-1654168959309)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602174222188.png)]

(2.)Label控件
import tkinter
# 创建主窗口
win = tkinter.Tk()
# 设置标题
win.title("小王最帅")
#设置大写和位置
win.geometry("400x400+200+50")
'''
Labels标签控件,可以显示文本
win:父窗口
text:显示的文本内容
bg:背景颜色
fg:字体颜色
font:字体
wraplength:指定text文本中多宽后换行
justify:设置换行后的对齐方式
anchor:位置 n北,s,w,e,center居中:还可以写在一起:ne东北方向
'''
label = tkinter.Label(win,
                      text="this is a world!",
                      bg='pink',fg='red',
                      font=('黑体',20),
                      width=20,
                      height=10,
                      wraplength=100,
                      justify='left',
                      anchor='ne'
                      )
#显示出来
label.pack()
# 进入消息循环,可以写控件
win.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFyhp3x7-1654168959311)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602174058643.png)]

(3.)Button控件
import tkinter
def func():
    print("小王是憨憨")# 创建主窗口
win = tkinter.Tk()# 设置标题
win.title("小王最帅")#设置大写和位置
win.geometry("400x400+200+50")# 创建按钮
button1=tkinter.Button(win,text='按钮',command=func,width=10,height=10,anchor='ne')
button1.pack()
button2=tkinter.Button(win,text='按钮',command=lambda:print("放假放假"))
button2.pack()
button3=tkinter.Button(win,text='退出',command=win.quit)
button3.pack()# 进入消息循环,可以写控件
win.mainloop()

输出:

小王是憨憨
放假放假

解释:点击不同的按钮,输出不同的结果。

(4.)Entry控件
import tkinter
def func():
    print("小王是憨憨")
win = tkinter.Tk()# 创建主窗口
win.title("小王最帅")# 设置标题
win.geometry("400x400+200+50")#设置大写和位置
'''
Entry:输入控件,用于显示简单的文本内容
'''
entry1=tkinter.Entry(win,show='*') # show=‘*’可以表示输入的密码#,密文显示
entry1.pack()
e=tkinter.Variable()# 绑定变量
entry2=tkinter.Entry(win,textvariable=e) # show=‘*’可以表示输入的密码
entry2.pack()
e.set("放假放假")#e代表输入框这个对象,设置值
# 取值
print(e.get())
print(entry2.get())# 进入消息循环,可以写控件
win.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G9yK8oNA-1654168959312)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602175456315.png)]

(5.)点击按钮输出输入框中的内容
import tkinter
# 创建主窗口
win = tkinter.Tk()
# 设置标题
win.title("小王最帅")
#设置大写和位置
win.geometry("400x400+200+50")
def showinfo():
    # 获取输入的内容
    print(entry.get())
entry=tkinter.Entry(win)
entry.pack()
button=tkinter.Button(win,text="按钮",command=showinfo)
button.pack()
# 进入消息循环,可以写控件
win.mainloop()

输出:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V325B1AM-1654168959313)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602175807751.png)]

123456

解释:点击按钮将框中的数据输出。

(6.)Text控件
import tkinter
# 创建主窗口
win = tkinter.Tk()
# 设置标题
win.title("小王最帅")
#设置大写和位置
win.geometry("400x400+200+50")
'''
文本控件:用于显示多行文本
'''
# height表示的是显示的行数
text = tkinter.Text(win, width=30, height=10)
text.pack()
str = '''长恨歌
白居易 〔唐代〕

汉皇重色思倾国,御宇多年求不得。
杨家有女初长成,养在深闺人未识。
天生丽质难自弃,一朝选在君王侧。
回眸一笑百媚生,六宫粉黛无颜色。
春寒赐浴华清池,温泉水滑洗凝脂。
侍儿扶起娇无力,始是新承恩泽时。
云鬓花颜金步摇,芙蓉帐暖度春宵。
春宵苦短日高起,从此君王不早朝。
承欢侍宴无闲暇,春从春游夜专夜。
后宫佳丽三千人,三千宠爱在一身。
金屋妆成娇侍夜,玉楼宴罢醉和春。
姊妹弟兄皆列土,可怜光彩生门户。
遂令天下父母心,不重生男重生女。
骊宫高处入青云,仙乐风飘处处闻。
缓歌慢舞凝丝竹,尽日君王看不足。

渔阳鼙鼓动地来,惊破霓裳羽衣曲。
九重城阙烟尘生,千乘万骑西南行。
翠华摇摇行复止,西出都门百余里。
六军不发无奈何,宛转蛾眉马前死。
花钿委地无人收,翠翘金雀玉搔头。
君王掩面救不得,回看血泪相和流。
黄埃散漫风萧索,云栈萦纡登剑阁。
峨嵋山下少人行,旌旗无光日色薄。
蜀江水碧蜀山青,圣主朝朝暮暮情。
行宫见月伤心色,夜雨闻铃肠断声。
天旋地转回龙驭,到此踌躇不能去。(地转 一作:日转)
马嵬坡下泥土中,不见玉颜空死处。
君臣相顾尽沾衣,东望都门信马归。
归来池苑皆依旧,太液芙蓉未央柳。
芙蓉如面柳如眉,对此如何不泪垂?
春风桃李花开日,秋雨梧桐叶落时。(花开日 一作:花开夜)
西宫南内多秋草,落叶满阶红不扫。(南内 一作:南苑)
梨园弟子白发新,椒房阿监青娥老。
夕殿萤飞思悄然,孤灯挑尽未成眠。
迟迟钟鼓初长夜,耿耿星河欲曙天。
鸳鸯瓦冷霜华重,翡翠衾寒谁与共?
悠悠生死别经年,魂魄不曾来入梦。

临邛道士鸿都客,能以精诚致魂魄。
为感君王辗转思,遂教方士殷勤觅。
排空驭气奔如电,升天入地求之遍。
上穷碧落下黄泉,两处茫茫皆不见。
忽闻海上有仙山,山在虚无缥缈间。
楼阁玲珑五云起,其中绰约多仙子。
中有一人字太真,雪肤花貌参差是。
金阙西厢叩玉扃,转教小玉报双成。
闻道汉家天子使,九华帐里梦魂惊。
揽衣推枕起徘徊,珠箔银屏迤逦开。
云鬓半偏新睡觉,花冠不整下堂来。

风吹仙袂飘飖举,犹似霓裳羽衣舞。(飘飖 一作:飘飘)
玉容寂寞泪阑干,梨花一枝春带雨。(阑 通:栏)
含情凝睇谢君王,一别音容两渺茫。
昭阳殿里恩爱绝,蓬莱宫中日月长。
回头下望人寰处,不见长安见尘雾。
惟将旧物表深情,钿合金钗寄将去。
钗留一股合一扇,钗擘黄金合分钿。
但令心似金钿坚,天上人间会相见。(但令 一作:但教)

临别殷勤重寄词,词中有誓两心知。
七月七日长生殿,夜半无人私语时。
在天愿作比翼鸟,在地愿为连理枝。
天长地久有时尽,此恨绵绵无绝期。'''
text.insert(tkinter.INSERT, str)
# 进入消息循环,可以写控件
win.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfhy053J-1654168959314)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602180502981.png)]

(7.)带滚动条的Text
import tkinter
win = tkinter.Tk()
win.title("小王最帅")
win.geometry("400x400+200+50")
'''
文本控件:用于显示多行文本
'''
# 创建滚动条
scroll = tkinter.Scrollbar()
text = tkinter.Text(win, width=30, height=10)
 # side放到窗体的哪一侧,  fill填充
scroll.pack(side=tkinter.RIGHT, fill=tkinter.Y)
text.pack(side=tkinter.LEFT, fill=tkinter.Y)
 # 关联
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
text.pack()
str = '''长恨歌
白居易 〔唐代〕

汉皇重色思倾国,御宇多年求不得。
杨家有女初长成,养在深闺人未识。
天生丽质难自弃,一朝选在君王侧。
回眸一笑百媚生,六宫粉黛无颜色。
春寒赐浴华清池,温泉水滑洗凝脂。
侍儿扶起娇无力,始是新承恩泽时。
云鬓花颜金步摇,芙蓉帐暖度春宵。
春宵苦短日高起,从此君王不早朝。
承欢侍宴无闲暇,春从春游夜专夜。
后宫佳丽三千人,三千宠爱在一身。
金屋妆成娇侍夜,玉楼宴罢醉和春。
姊妹弟兄皆列土,可怜光彩生门户。
遂令天下父母心,不重生男重生女。
骊宫高处入青云,仙乐风飘处处闻。
缓歌慢舞凝丝竹,尽日君王看不足。

渔阳鼙鼓动地来,惊破霓裳羽衣曲。
九重城阙烟尘生,千乘万骑西南行。
翠华摇摇行复止,西出都门百余里。
六军不发无奈何,宛转蛾眉马前死。
花钿委地无人收,翠翘金雀玉搔头。
君王掩面救不得,回看血泪相和流。
黄埃散漫风萧索,云栈萦纡登剑阁。
峨嵋山下少人行,旌旗无光日色薄。
蜀江水碧蜀山青,圣主朝朝暮暮情。
行宫见月伤心色,夜雨闻铃肠断声。
天旋地转回龙驭,到此踌躇不能去。(地转 一作:日转)
马嵬坡下泥土中,不见玉颜空死处。
君臣相顾尽沾衣,东望都门信马归。
归来池苑皆依旧,太液芙蓉未央柳。
芙蓉如面柳如眉,对此如何不泪垂?
春风桃李花开日,秋雨梧桐叶落时。(花开日 一作:花开夜)
西宫南内多秋草,落叶满阶红不扫。(南内 一作:南苑)
梨园弟子白发新,椒房阿监青娥老。
夕殿萤飞思悄然,孤灯挑尽未成眠。
迟迟钟鼓初长夜,耿耿星河欲曙天。
鸳鸯瓦冷霜华重,翡翠衾寒谁与共?
悠悠生死别经年,魂魄不曾来入梦。

临邛道士鸿都客,能以精诚致魂魄。
为感君王辗转思,遂教方士殷勤觅。
排空驭气奔如电,升天入地求之遍。
上穷碧落下黄泉,两处茫茫皆不见。
忽闻海上有仙山,山在虚无缥缈间。
楼阁玲珑五云起,其中绰约多仙子。
中有一人字太真,雪肤花貌参差是。
金阙西厢叩玉扃,转教小玉报双成。
闻道汉家天子使,九华帐里梦魂惊。
揽衣推枕起徘徊,珠箔银屏迤逦开。
云鬓半偏新睡觉,花冠不整下堂来。

风吹仙袂飘飖举,犹似霓裳羽衣舞。(飘飖 一作:飘飘)
玉容寂寞泪阑干,梨花一枝春带雨。(阑 通:栏)
含情凝睇谢君王,一别音容两渺茫。
昭阳殿里恩爱绝,蓬莱宫中日月长。
回头下望人寰处,不见长安见尘雾。
惟将旧物表深情,钿合金钗寄将去。
钗留一股合一扇,钗擘黄金合分钿。
但令心似金钿坚,天上人间会相见。(但令 一作:但教)

临别殷勤重寄词,词中有誓两心知。
七月七日长生殿,夜半无人私语时。
在天愿作比翼鸟,在地愿为连理枝。
天长地久有时尽,此恨绵绵无绝期。'''
text.insert(tkinter.INSERT, str)
win.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eZNbhE7-1654168959315)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602180934648.png)]

解释:跟上面的区别是增加滚动条。

2.组件的属性

属性说明取值
anchor文本起始位置CENTER(默认),E,S,W,N,NE,SE,SW,NW
bg背景色
bd加粗(默认2像素)
bitmap黑白二值图标网上查找
cursor鼠标悬停光标网上查找
font字体
fg字体颜色
height高(文本控件的单位为行)
image显示图像
justify多行文本的对齐方式CENTER(默认),LEFT,RIGHT,TOP,BOTTOM
padx水平扩展像素
pady垂直扩展像素
relief3D浮雕样式FLAT,RAISED,SUNKEN,GROOVE,RIDGE
state控件实例状态是否可用NORMAL(默认),DISABLED
width宽(文本控件的单位为行)

三.按钮

1.单选按钮

定义:字面意思只能选一个。

示例:

from tkinter import *
def Mysel():
      dic = {0:'甲',1:'乙',2:'丙'}
      s = "您选了" + dic.get(var.get()) + "项"
      lb.config(text = s)
root = Tk()
root.title('单选按钮')
lb = Label(root)
lb.pack()
var = IntVar()
rd1 = Radiobutton(root,text="甲",variable=var,value=0,command=Mysel)
rd1.pack()
rd2 = Radiobutton(root,text="乙",variable=var,value=1,command=Mysel)
rd2.pack()
rd3 = Radiobutton(root,text="丙",variable=var,value=2,command=Mysel)
rd3.pack()
root.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kcTMG3eR-1654168959315)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602181717894.png)]

2.多选按钮

跟多选的选择题一样

示例:

from tkinter import *
import tkinter
def run():
     if(CheckVar1.get()==0 and CheckVar2.get()==0 and CheckVar3.get()==0 and CheckVar4.get()==0):
         s = '您还没选择任何爱好项目'
     else:
         s1 = "哈密瓜" if CheckVar1.get()==1 else ""
         s2 = "葡萄" if CheckVar2.get() == 1 else ""
         s3 = "羊肉串" if CheckVar3.get() == 1 else ""
         s4 = "卡瓦斯" if CheckVar4.get() == 1 else ""
         s = "您选择了%s %s %s %s" % (s1,s2,s3,s4)
     lb2.config(text=s)
root = tkinter.Tk()
root.title('复选框')
lb1=Label(root,text='请选择您的爱好项目')
lb1.pack()
CheckVar1 = IntVar()
CheckVar2 = IntVar()
CheckVar3 = IntVar()
CheckVar4 = IntVar()
ch1 = Checkbutton(root,text='哈密瓜',variable = CheckVar1,onvalue=1,offvalue=0)
ch2 = Checkbutton(root,text='葡萄',variable = CheckVar2,onvalue=1,offvalue=0)
ch3 = Checkbutton(root,text='羊肉串',variable = CheckVar3,onvalue=1,offvalue=0)
ch4 = Checkbutton(root,text='卡瓦斯',variable = CheckVar4,onvalue=1,offvalue=0)
ch1.pack()
ch2.pack()
ch3.pack()
ch4.pack()
btn = Button(root,text="OK",command=run)
btn.pack()
lb2 = Label(root,text='')
lb2.pack()
root.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNB4x1W6-1654168959316)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602182113370.png)]

四.模仿验证滑块界面

滑块控件实例的主要方法比较简单,有 get()set(值),分别为取值和将滑块设在某特定值上。滑块实例也可绑定鼠标左键释放事件<ButtoonRelease-1>,并在执行函数中添加参数event来实现事件响应。
例如:在一个窗体上设计一个200像素宽的水平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为 1,用鼠标拖动滑块后释放鼠标可读取滑块值并显示在标签上。效果如下:

示例:

from tkinter  import  *
def show(event):
      s = '滑块的滑动距离' + str(var.get())
      lb.config(text=s)
root = Tk()
root.title('滑块')
root.geometry('320x180')
var=DoubleVar()
scl = Scale(root,orient=HORIZONTAL,length=200,from_=1.0,to=5.0,label='请拖动滑块',tickinterval=1,resolution=0.05,variable=var)
scl.bind('<ButtonRelease-1>',show)
scl.pack()
lb = Label(root,text='')
lb.pack()
root.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gSGPCFb-1654168959316)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602182552437.png)]

五.菜单界面

示例:

from tkinter import *
def new():
     s = '新建'
     lb1.config(text=s)
def ope():
     s = '打开'
     lb1.config(text=s)
def sav():
     s = '保存'
     lb1.config(text=s)
def cut():
     s = '剪切'
     lb1.config(text=s)
def cop():
     s = '复制'
     lb1.config(text=s)
def pas():
     s = '粘贴'
     lb1.config(text=s)
def popupmenu(event):
     mainmenu.post(event.x_root,event.y_root)
root = Tk()
root.title('菜单实验')
root.geometry('320x240')
lb1 = Label(root,text='显示信息',font=('黑体',32,'bold'))
lb1.place(relx=0.2,rely=0.2)
mainmenu = Menu(root)
menuFile = Menu(mainmenu)  # 菜单分组 menuFile
mainmenu.add_cascade(label="文件",menu=menuFile)
menuFile.add_command(label="新建",command=new)
menuFile.add_command(label="打开",command=ope)
menuFile.add_command(label="保存",command=sav)
menuFile.add_separator()  # 分割线
menuFile.add_command(label="退出",command=root.destroy)
menuEdit = Menu(mainmenu)  # 菜单分组 menuEdit
mainmenu.add_cascade(label="编辑",menu=menuEdit)
menuEdit.add_command(label="剪切",command=cut)
menuEdit.add_command(label="复制",command=cop())
menuEdit.add_command(label="粘贴",command=pas())
root.config(menu=mainmenu)
root.bind('Button-3',popupmenu) # 根窗体绑定鼠标右击响应事件
root.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cUwjJO0b-1654168959317)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602183021820.png)]

固定格式:

菜单实例名=Menu(根窗体)
菜单分组1=Menu(菜单实例名)
菜单实例名.add_cascade(<label=菜单分组1 显示文本>,<menu=菜单分组1>)
菜单分组1.add_command(<label=命令1文本>,<command=命令1函数名>)

六.对话框的选择与交互

1.交互对话框

示例:

rom tkinter import *
import tkinter.messagebox
def xz():
    answer=tkinter.messagebox.askokcancel('请选择','请选择确定或取消')
    if answer:
        lb.config(text='已确认')
    else:
        lb.config(text='已取消')
root = Tk()
lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出对话框',command=xz)
btn.pack()
root.mainloop()

输出:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MCGd67zW-1654168959318)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602184033255.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TI8jwffq-1654168959318)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602184057053.png)]

2.选择对话框

示例:

from tkinter import *
import tkinter.filedialog
def xz():
    filename=tkinter.filedialog.askopenfilename()
    if filename != '':
         lb.config(text='您选择的文件是'+filename)
    else:
         lb.config(text='您没有选择任何文件')
root = Tk()
lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出文件选择对话框',command=xz)
btn.pack()
root.mainloop()
= Tk()
lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出对话框',command=xz)
btn.pack()
root.mainloop()

输出:

[外链图片转存中…(img-MCGd67zW-1654168959318)]

[外链图片转存中…(img-TI8jwffq-1654168959318)]

2.选择对话框

示例:

from tkinter import *
import tkinter.filedialog
def xz():
    filename=tkinter.filedialog.askopenfilename()
    if filename != '':
         lb.config(text='您选择的文件是'+filename)
    else:
         lb.config(text='您没有选择任何文件')
root = Tk()
lb = Label(root,text='')
lb.pack()
btn=Button(root,text='弹出文件选择对话框',command=xz)
btn.pack()
root.mainloop()
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐