大家好,小编来为大家解答以下问题,python如何做出图形界面,用python做图形用户界面,今天让我们一起来看看吧!
Python自带了tkinter 模块,实质上是一种流行的面向对象的GUI工具包 TK 的Python编程接口,提供了快速便利地创建GUI应用程序的方法。其图像化编程的基本步骤通常包括:
~导入 tkinter 模块
创建 GUI 根窗体
添加人机交互控件并编写相应的函数自学python应该怎么学。
在主事件循环中等待用户触发事件响应。
控件 | 名称 | 作用 |
---|---|---|
Button | 按钮 | 单击触发事件 |
Canvas | 画布 | 绘制图形或绘制特殊控件 |
Checkbutton | 复选框 | 多项选择 |
Entry | 输入框 | 接收单行文本输入 |
Frame | 框架 | 用于控件分组 |
Label | 标签 | 单行文本显示 |
Listbox | 列表框 | 显示文本列表 |
Menu | 菜单 | 创建菜单命令 |
Message | 消息 | 多行文本标签,与Label用法类似 |
Radiobutton | 单选按钮 | 从互斥的多个选项中做单项选择 |
Scale | 滑块 | 默认垂直方向,鼠标拖动改变数值形成可视化交互 |
Scrollbar | 滑动条 | 默认垂直方向,鼠标拖动改变数值,可与Text,Listbox,Canvas等控件配合移动可视化空间 |
Text | 文本框 | 接收或输出多行文本 |
Toplevel | 新建窗体容器 | 在顶层创建新窗体 |
import tkinter
# 创建主窗口
win = tkinter.Tk()
# 设置标题
win.title("小王最帅")
#设置大写和位置
win.mainloop()
输出:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKFhPz0W-1654168959309)(C:\Users\86139\AppData\Roaming\Typora\typora-user-images\image-20220602174222188.png)]
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)]
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()
输出:
小王是憨憨
放假放假
解释:点击不同的按钮,输出不同的结果。
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)]
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
解释:点击按钮将框中的数据输出。
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)]
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)]
解释:跟上面的区别是增加滚动条。
属性 | 说明 | 取值 |
---|---|---|
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 | 宽(文本控件的单位为行) | 无 |
定义:字面意思只能选一个。
示例:
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)]
跟多选的选择题一样
示例:
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
(值),分别为取值和将滑块设在某特定值上。滑块实例也可绑定鼠标左键释放事件
,并在执行函数中添加参数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('',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(
示例:
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)]
示例:
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)]
示例:
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()