Python图形界面设计:如何实现GUI界面

本篇文章给大家谈谈python编写图形化界面的工具,以及python如何做出图形界面,希望对各位有所帮助,不要忘了收藏本站喔。

大家好,小编来为大家解答以下问题,python如何做出图形界面,用python做图形用户界面,今天让我们一起来看看吧!

python图形化界面

一.定义理解

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

~导入 tkinter 模块

创建 GUI 根窗体

添加人机交互控件并编写相应的函数自学python应该怎么学python自学好学嘛。

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

二.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 垂直扩展像素
relief 3D浮雕样式 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()
物联沃分享整理
物联沃-IOTWORD物联网 » Python图形界面设计:如何实现GUI界面

发表评论