Python-Tkinter图形化界⾯设计(详细教程)
Python-Tkinter 图形化界⾯设计(详细教程)
⼀.图形化界⾯设计的基本理解
当前流⾏的计算机桌⾯应⽤程序⼤多数为图形化⽤户界⾯(Graphic User Interface,GUI),即通过⿏标对菜单、按钮等图形化元素触发指令,并从标签、对话框等图型化显⽰容器中获取⼈机对话信息。
Python⾃带了tkinter 模块,实质上是⼀种流⾏的⾯向对象的GUI⼯具包 TK 的Python编程接⼝,提供了快速便利地创建GUI应⽤程序的⽅法。其图像化编程的基本步骤通常包括:
○导⼊ tkinter 模块
○创建 GUI 根窗体
○添加⼈机交互控件并编写相应的函数。
○在主事件循环中等待⽤户触发事件响应。
⼆.窗体控件布局
2.1. 数据集导⼊
根窗体是图像化应⽤程序的根控制器,是tkinter的底层控件的实例。当导⼊tkinter模块后,调⽤ Tk()⽅法可初始化⼀个根窗体实例 root ,⽤ title() ⽅法可设置其标题⽂字,⽤geometry()⽅法可以设置窗体的⼤⼩(以像素为单位)。将其置于主循环中,除⾮⽤户关闭,否则程序始终处于运⾏状态。执⾏该程序,⼀个窗体就呈现出来了。在这个主循环的根窗体中,可持续呈现中的其他可视化控件实例,监测事件的发⽣并执⾏相应的处理程序。下⾯是根窗体呈现⽰例:
from tkinter import *
root= Tk()
root.title('我的第⼀个Python窗体')
root.mainloop()
2.2. tkinter 常⽤控件
常⽤控件:常⽤的10 多种,如下:
2.2.1 控件的共同属性
在窗体上呈现的可视化控件,通常包括尺⼨、颜⾊、字体、相对位置、浮雕样式、图标样式和悬停光标形状等共同属性。不同的控件由于形状和功能不同,⼜有其特征属性。在初始化根窗体和根窗体主循环之间,可实例化窗体控件,并设置其属性。⽗容器可为根窗体或其他容器控件实例。常见的控件共同属性如下表:
标签及常见属性⽰例:
from tkinter import *
root = Tk()
lb = Label(root,text='我是第⼀个标签',\
bg='#d3fbfb',\
fg='red',\
font=('华⽂新魏',32),\
width=20,\
height=2,\
relief=SUNKEN)
lb.pack()
root.mainloop()
其中,标签实例lb 在⽗容器root中实例化,具有代码中所⽰的text(⽂本)、bg(背景⾊)、fg(前景⾊)、font(字体)、width(宽,默认以字符为单位)、height(⾼,默认以字符为单位)和 relief(浮雕样式)等⼀系列属性。
在实例化控件时,实例的属性可以“属性=属性值”的形式枚举列出,不区分先后次序。例如:“ text=‘我是第⼀个标签’ ”显⽰标签的⽂本内容,“bg=’#d3fbfb’”设置背景⾊为⼗六进制数RGB⾊ #d3fbfb等等。属性值通常⽤⽂本形式表⽰。
当然如果这个控件实例只需要⼀次性呈现,也可以不必命名,直接实例化并布局呈现出来,例如:
Label(root,text='我是第⼀个标签',font='华⽂新魏').pack()
属性 relief 为控件呈现出来的3D浮雕样式,有 FLAT(平的)、RAISED(凸起的)、SUNKEN(凹陷的)、GROOVE(沟槽状边缘)和 RIDGE(脊状边缘) 5种。
2.3 控件布局
2.3.1 place()⽅法
根据控件实例在⽗容器中的绝对或相对位置参数进⾏布局。其常⽤布局参数如下:
x,y:控件实例在根窗体中⽔平和垂直⽅向上的其实位置(单位为像素)。注意,根窗体左上⾓为0,0,⽔平向右,垂直向下为正⽅向。
relx,rely:控件实例在根窗体中⽔平和垂直⽅向上起始布局的相对位置。即相对于根窗体宽和⾼的⽐例位置,取值在0.0~1.0之间。
height,width:控件实例本⾝的⾼度和宽度(单位为像素)。
relheight,relwidth:控件实例相对于根窗体的⾼度和宽度⽐例,取值在0.0~1.0之间。
利⽤place()⽅法配合relx,rely和relheight,relwidth参数所得的到的界⾯可⾃适应根窗体尺⼨的⼤⼩。place()⽅法与grid()⽅法可以混合使⽤。如下例⼦:利⽤place()⽅法排列消息(多⾏标签)。
from tkinter import *
root = Tk()
msg1 = Message(root,text='''我的⽔平起始位置相对窗体 0.2,垂直起始位置为绝对位置 80 像素,我的⾼度是窗体⾼度的0.4,宽度是200像素''',relief=GROOVE) msg1.place(relx=0.2,y=80,relheight=0.4,width=200)
root.mainloop()
三、tkinter常见控件的特征属性
3.1、⽂本输⼊和输出相关控件
⽂本的输⼊与输出控件通常包括:标签(Label)、消息(Message)、输⼊框(Entry)、⽂本框(Text)。他们除了前述共同属性外,都具有⼀些特征属性和功能。
○ 3.1.1 标签(Label)和消息(Message)
后发⽣变化,则可以使⽤下列⽅法之⼀实现:1、⽤控件实例的configure()⽅法来改变属性text的值,可使显⽰的⽂本发⽣变化;2、先定义⼀个tkinter的内部类型变量var=StringVar() 的值也可以使显⽰⽂本发⽣变化。
看下⾯的⼀个例⼦:制作⼀个电⼦时钟,⽤root的after()⽅法每隔1秒time模块以获取系统当前时间,并在标签中显⽰出来。
⽅法⼀:利⽤configure()⽅法或config()来实现⽂本变化。
import tkinter
import time
def gettime():
timestr = time.strftime("%H:%M:%S") # 获取当前的时间并转化为字符串
root.after(1000,gettime) # 每隔1s调⽤函数 gettime ⾃⾝获取时间
root = tkinter.Tk()
root.title('时钟')
lb = tkinter.Label(root,text='',fg='blue',font=("⿊体",80))
lb.pack()
gettime()
root.mainloop()
⽅法⼆:利⽤textvariable变量属性来实现⽂本变化
import tkinter
import time
def gettime():
var.set(time.strftime("%H:%M:%S")) # 获取当前时间
root.after(1000,gettime) # 每隔1s调⽤函数 gettime ⾃⾝获取时间
root = tkinter.Tk()
root.title('时钟')
var=tkinter.StringVar()
lb = tkinter.Label(root,textvariable=var,fg='blue',font=("⿊体",80))
lb.pack()
gettime()
root.mainloop()
○ 3.1.2 ⽂本框(Text)
⽂本框的常⽤⽅法如下:
上表位置的取值可为整数,浮点数或END(末尾),例如0.0表⽰第0列第0⾏
如下⼀个例⼦:每隔1秒获取⼀次当前⽇期的时间,并写⼊⽂本框中,如下:本例中调⽤ w()获取当前⽇期时间,⽤insert()⽅法每次从⽂本框txt的尾部(END)开始追加⽂本。
from tkinter import *
import time
import datetime
def gettime():
s=str(w())+'\n'
txt.insert(END,s)
即时设计教程root.after(1000,gettime) # 每隔1s调⽤函数 gettime ⾃⾝获取时间
root=Tk()
txt=Text(root)
txt.pack()
gettime()
root.mainloop()
○ 3.1.3 输⼊框(Entry)
通常作为功能⽐较单⼀的接收单⾏⽂本输⼊的控件,虽然也有许多对其中⽂本进⾏操作的⽅法,但通常⽤的只有取值⽅法get()和⽤于删除⽂本的delete(起始位置,终⽌位置),例如:清空输⼊框为delete(0,END)。
3.2 按钮(Button)
主要是为响应⿏标单击事件触发运⾏程序所设的,故其除控件共有属性外,属性command是最为重要的属性。通常,将按钮要触发执⾏的程序以函数形式预先定义,然后可以⽤⼀下两种⽅法调⽤函数。Button按钮的状态有:'normal','active','disabled'
○直接调⽤函数。参数表达式为“command=函数名”,注意函数名后⾯不要加括号,也不能传递参数。如下⾯的command=run1:
○利⽤匿名函数调⽤函数和传递参数。参数的表达式为“command=lambda”:函数名(参数列表)。例如下⾯
的:"command=lambda:(),())"。
○看下⾯的例⼦:1.从两个输⼊框去的输⼊⽂本后转为浮点数值进⾏加法运算,要求每次单击按钮产⽣的算是结果以⽂本的形式追加到⽂本框中,将原输⼊框清空。2.按钮⽅法⼀不传参数调⽤函数run1()实现,按钮“⽅法⼆”⽤lambda调⽤函数run2(x,y)同时传递参数实现。
from tkinter import *
def run1():
a = ())
b = ())
s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
txt.insert(END, s) # 追加显⽰运算结果
inp2.delete(0, END) # 清空输⼊
def run2(x, y):
a = float(x)
b = float(y)
s = '%0.2f+%0.2f=%0.2f\n' % (a, b, a + b)
txt.insert(END, s) # 追加显⽰运算结果
inp1.delete(0, END) # 清空输⼊
inp2.delete(0, END) # 清空输⼊
root = Tk()
root.title('简单加法器')
lb1 = Label(root, text='请输⼊两个数,按下⾯两个按钮之⼀进⾏加法计算')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
inp1 = Entry(root)
inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
inp2 = Entry(root)
inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
# ⽅法-直接调⽤ run1()
btn1 = Button(root, text='⽅法⼀', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
# ⽅法⼆利⽤ lambda 传参数调⽤run2()
btn2 = Button(root, text='⽅法⼆', command=lambda: (), ()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
# 在窗体垂直⾃上⽽下位置60%处起,布局相对窗体⾼度40%⾼的⽂本框
txt = Text(root)
txt.place(rely=0.6, relheight=0.4)
root.mainloop()
3.3 单选按钮
(Radiobutton)是为了响应故乡排斥的若⼲单选项的单击事件以触发运⾏⾃定义函数所设的,该控件排除具有共有属性外,还具有显⽰⽂本(text)、返回变量(variable)、返回值(value)、响应函数名(command)等重要属性。响应函数名“command=函数名”的⽤法与Button相同,函数名最后也要加括号。返回变量variable=var通常应预先声明变量的类型var=IntVar()或var=StringVar(),在所调⽤的函数中⽅可⽤()⽅法获取被选中实例的value值。例如下⾯:
from tkinter import *
def Mysel():
dic = {0:'甲',1:'⼄',2:'丙'}
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()
3.4 复选框
(Checkbutton) 是为了返回多个选项值的交互控件,通常不直接触发函数的执⾏。该控件除具有共有属性外,还具有显⽰⽂本(text)、返回变量(variable)、选中返回值(onvalue)和未选中默认返回值(offvalue)等重要属性。返回变量variable=var 通常可以预先逐项分别声明变量的类型var=IntVar() (默认)或
var=StringVar(), 在所调⽤的函数中⽅可分别调⽤ ()⽅法取得被选中实例的 onvalue或offvalue值。复选框实例通常还可分别利⽤ select()、deselect()和toggle() ⽅法对其进⾏选中、清除选中和反选操作。
○如下的例⼦:利⽤复选框实现,单击OK,可以将选中的结果显⽰在标签上。效果如下:
○⽅法:利⽤函数中的 if-else 分⽀实现多项显⽰
from tkinter import *
import tkinter
def run():
()==0 ()==0 ()==0 ()==0):
s = '您还没选择任何爱好项⽬'
else:
s1 = "⾜球" ()==1 else ""
s2 = "篮球" () == 1 else ""
s3 = "游泳" () == 1 else ""
s = "您选择了%s %s %s %s" % (s1,s2,s3,s4)
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()
3.5 列表框与组合框
3.5.1 列表框
(Listbox) 可供⽤户单选或多选所列条⽬以形成⼈机交互。列表框控件的主要⽅法见下⾯的表:
执⾏⾃定义函数时,通常使⽤“实例名.surselection()” 或 “selected” 来获取选中项的位置索引。由于列表框实质上就是将Python 的列表类型数据可视化呈现,在程序实现时,也可直接对相关列表数据进⾏操作,然后再通过列表框展⽰出来,⽽不必拘泥于可视化控件的⽅法。看下⾯的⼀个例⼦:实现列表框的初始化、添加、插⼊、修改、删除和清空操作,如下:
from tkinter import *
def ini():
Lstbox1.delete(0,END)
list_items = ["数学","物理","化学","语⽂","外语"]
for item in list_items:
Lstbox1.insert(END,item)
def clear():
Lstbox1.delete(0,END)
def ins():
() != '':
if Lstbox1.curselection() == ():
Lstbox1.insert(Lstbox1.size(),())
else:
Lstbox1.insert(Lstbox1.curselection(),())
def updt():
() != '' and Lstbox1.curselection() != ():
selected=Lstbox1.curselection()[0]
Lstbox1.delete(selected)
Lstbox1.insert(())
def delt():
if Lstbox1.curselection() != ():
Lstbox1.delete(Lstbox1.curselection())
root = Tk()
root.title('列表框实验')
frame1 = Frame(root,relief=RAISED)
frame1.place(relx=0.0)
frame2 = Frame(root,relief=GROOVE)
frame2.place(relx=0.5)
Lstbox1 = Listbox(frame1)
Lstbox1.pack()
entry = Entry(frame2)
btn1 = Button(frame2,text='初始化',command=ini)
btn1.pack(fill=X)
btn2 = Button(frame2,text='添加',command=ins)
btn2.pack(fill=X)
btn3 = Button(frame2,text='插⼊',command=ins) # 添加和插⼊功能实质上是⼀样的
btn3.pack(fill=X)
btn4 = Button(frame2,text='修改',command=updt)
btn4.pack(fill=X)
btn5 = Button(frame2,text='删除',command=delt)
btn5.pack(fill=X)
btn6 = Button(frame2,text='清空',command=clear)
btn6.pack(fill=X)
root.mainloop()
3.5.2 组合框
(Combobox) 实质上是带⽂本框的上拉列表框,其功能也将是Python 的列表类型数据可视化呈现,并提供⽤户单选或多选所列条⽬以形成⼈机交互。在图形化界⾯设计时,由于其具有灵活的界⾯,因此往往⽐列表框更受喜爱。但该控件并不包含在 tkinter 模块中,⽽是与 TreeView、Progressbar、Separator等控件⼀同包含在tkinter 的⼦模块ttk中。如果使⽤该控件,应先与from tkinter import ttk 语句引⽤ttk⼦模块,然后创建组合框实例:实例名=Combobox(根对象,[属性列表])
指定变量var=StringVar(),并设置实例属性 textvariable = var,values=[列表…]。组合框控件常⽤⽅法有:获得所选中的选项值get()和获得所选中的选项索引current()。
看下⾯的⼀个例⼦:实现四则运算计算器,将两个操作数分别填⼊两个⽂本框后,通过选择组合框中的算法触发运算,如下:
k import *
def calc(event):
a = ())
b = ())
dic = {0:a+b,1:a-b,2:a*b,3:a/b}
c = dic[comb.current()]
root = Tk()
root.title('四则运算')
t1 = Entry(root)
t1.place(relx=0.1,rely=0.1,relwidth=0.2,relheight=0.1)
t2 = Entry(root)
t2.place(relx=0.5,rely=0.1,relwidth=0.2,relheight=0.1)
var = StringVar()
comb = Combobox(root,textvariable=var,values=['加','减','乘','除',])
comb.place(relx=0.1,rely=0.5,relwidth=0.2)
comb.bind('<<ComboboxSelected>>',calc)
lbl=Label(root,text='结果')
lbl.place(relx=0.5,rely=0.7,relwidth=0.2,relheight=0.3)
root.mainloop()
3.6 滑块
(Scale) 是⼀种直观地进⾏数值输⼊的交互控件,其主要属性见下表:
滑块控件实例的主要⽅法⽐较简单,有 get()和set(值),分别为取值和将滑块设在某特定值上。滑块实例也可绑定⿏标左键释放事件<ButtoonRelease-1>,并在执⾏函数中添加参数event来实现事件响应。
例如:在⼀个窗体上设计⼀个200像素宽的⽔平滑块,取值范围为1.0~5.0,分辨精度为0.05,刻度间隔为 1,⽤⿏标拖动滑块后释放⿏标可读取滑块值并显⽰在标签上。效果如下:
from tkinter import *
def show(event):
s = '滑块的取值为' + ())
root = Tk()
root.title('滑块实验')
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)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论