目录
GUI图形用户编程(二)
Tkinter中常见用法
常见选项汇总
选项名(别名) | 含义 |
---|---|
activebackground | 指定组件处于激活状态时的背景色 |
activeforeground | 指定组件处于激活状态时的前景色 |
background(bg) | 指定组件正常显示时的背景色 |
borderwidth | 指定组件正常显示时的3D边框的宽度,该值可以是Tk—GetPixeis接受的任何格式 |
cursor | 指定光标在组件上的样式,该值可以是Tk—GetCursors接受的任何格式 |
disabledforeground | 指定组件处于禁用状态时的前景色 |
font | 指定组件上显示的文本字体 |
foreground(fg) | 指定组件正常显示时的前景色 |
highlightcolor | 指定组件在高亮状况下的前景色 |
highlightbackground | 指定组件在高亮状态下的beijingse |
highlightthickness | 指定组件在高亮状态下的周围方形区域的宽度,该值可以是Tk—GetPixeis接受的任何格式 |
height | 指定组件的高度,以font选项指定的字体的字符高度为单位,至少为1 |
image | 指定组件的显示的图片,若设置了image选项,它将会覆盖text、bitmap选项 |
justify | 指定组件内部内容的对齐方式,该选项支持LEFT(左对齐)、CENTER(居中对齐)、RIGHT(右对齐)这三个值 |
padx | 指定组件内部在水平方向上两边的空白,该值可以是Tk—GetPixeis接受的任何格式 |
pady | 指定组件内部在垂直方向上两边的空白,该值可以是Tk—GetPixeis接受的任何格式 |
relief | 指定组件的3D效果,该值指出组件内部相对于外部的外观样式 |
selectbackground | 指定组件在选中状态下的背景色 |
selectborderwidth | 指定组件在选中状态下的3D边框的宽度,该值可以是Tk—GetPixeis接受的任何格式 |
state | 指定组件的当前状态,该选项支持NORMAL(正常)、DISABLE(禁用)这两个值 |
takefocus | 指定组件在键盘遍历(Tab或Shift +Tab)时是否接受焦点,将该选项设为1为接受焦点,设为0则为不接收焦点 |
text | 指定组件上显示的文本,文本显示格式由组件本身、anchor及justify选项决定 |
textvariable | 指定一个变量名,GUI组件负责显示该变量值转换得到的字符串,文本显示格式由组件本身、anchor及justify选项决定 |
underline | 指定为组件文本的第几个字符添加下划线,该选项就相对于为组件绑定了下划线 |
width | 指定组件的宽度,以font选项指定的字体的字符高度为单位,至少为1 |
wraplength | 对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过该数量的字符将会转到下行显示 |
xscrollcommand | 通常用于将组件的水平滚动改变(包括内容滚动或宽度发生改变)与水平滚动条的set方法关联,从而让组件的水平滚动改变传递到水平滚动条 |
yscrollcommand | 通常用于将组件的垂直滚动改变(包括内容滚动或宽度发生改变)与水平滚动条的set方法关联,从而让组件的垂直滚动改变传递到水平滚动条 |
常见组件
Button
Button(按钮)用来执行用户的单击操作。Button可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。
Entry单行文本框
Entry用来接收一行字符串的控件。如果用户输入的文字长度长于Entry控件的宽度时,文字会自动向后滚动,如果想输入多行文本,需要使用Text控件
Text多行文本框
Text(多行文本框)主要用于显示多行文本,还可以显示网络链接、图片、HTML页面、甚至css样式表、添加组件等。也常被用来做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDLE就是Text组件构成的。
Radiobutton单选按钮
Radiobutton控件用于选择同一个单选按钮中的一个。
Radiobutton可以显示文本,也可以显示图像。
canvas画布
canvas(画布)是一个矩形区域,可以放置图形、图像、组件等。
例题:
from tkinter import *
from tkinter import messagebox
class Application(Frame):
"""一个经典的GUI程序类的写法"""
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""创建组件"""
self.bnt = Button(self, text="登录", command=self.login)
self.bnt.pack()
def login(self):
messagebox.showinfo("Python基础学习", "登录成功!!!开启学习之旅!!!")
if __name__ == "__main__":
root = Tk()
root.geometry("600x700+200+300")
app = Application(master=root)
root.mainloop()
布局管理器
Tkinter提供了三种管理器:pack、grid、place。
grid布局管理器
grid表格管理器,采用表格结构组织组件,子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从而实现复杂的布局。
grid()方法提供选项:
选项 | 说明 | 取值范围 |
---|---|---|
column | 单元格的列号 | 从0开始的正整数 |
columnspan | 跨列或跨越的列数 | 正整数 |
row | 单元格的行号 | 从0开始的正整数 |
rowspan | 跨行或跨越的行数 | 正整数 |
ipadx,ipady | 设置子组件之间的间隔。x方向或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
padx、pady | 与之并列的组件之间的间隔,x方向或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
sticky | 组件紧贴所在单元格的某一角,对应于东南西北中依旧4个角 | “n”,“s”,“w”,“e”,“nw”,“sw”,“se”,“ne”,“center” |
用grid()方法设计计算机界面
from tkinter import *
class Application(Frame):
"""一个经典的GUI程序类的写法"""
def __init__(self, master=None):
super().__init__(master) # super()代表的是父类的定义,而不是父类对象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""用grid设计计算机界面"""
Entry(self).grid(row=0,column=0,columnspan=4,pady=10)
bntText=(("MC", "M+", "M-", "MR"),("C", "±", "÷", "×"),(7, 8, 9, "-"),(4, 5, 6,"+"),(1, 2, 3, "="),(0,"."))
for rindex,r in enumerate(bntText):
for cindex,c in enumerate(r):
if c=="=":
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,rowspan=2,sticky=NSEW)
elif c==0:
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,columnspan=2,sticky=NSEW)
elif c==".":
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex+1,sticky=EW)
else:
Button(self,text=c,width=2).grid(row=rindex+1,column=cindex,sticky=EW)
if __name__ == "__main__":
root = Tk()
root.geometry("150x250+200+300")
app = Application(master=root)
root.mainloop()
计算机界面效果:
pack布局管理器
pack按照组件创建顺序将子组件添加到父组件中去,按照垂直或者水平的方向自然排布。如果不指定任何选项,默认在负组件中自顶而下垂直添加组件。
pack是代码最少,最简单的一种,可用于快速生成界面
pack()方法提供选项:
名称 | 描述 | 取值范围 |
---|---|---|
expand | 当值为“yes”时,side选项无效,组件显示在父配件中心位置,若fill选项为“both”,ze填充父组件的剩余空间 | “yes”,自然数,“no”,0(默认值:“no”或0) |
fill | 填充x(y)方向上的空间,当side=“top”或“bottom”时,填充x方向;当side=“left”或“right”时,填充“y”方向;当expand选项为“yes”时,填充父组件的剩余空间 | “x”,“y”,“both”,“none”(默认值:none) |
ipadx,ipady | 设置子组件间的间隔,x方向或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
padx,pady | 与之并列的组件之间的间隔,x方向或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
side | 定义停靠在夫组建的哪一边上 | “top”,“bottom”,“left”,“right”(默认:top) |
before | 将本组件与所选组件之前pack,类似于先创建本组件在创建选定组件 | 已经pack后的组件对象 |
after | 将本组件与所选组件之后pack,类似于先创建选定组件在创建本组件 | 已经pack后的组件对象 |
in— | 将本组件作为所选组件对象的子组件,类似于指定本组件的master为选定组件 | 已经pack后的组件对象 |
anchor | 对齐方式,左对齐“w”,右对齐“e”,顶对齐“n”,底对齐“s” | “n”,“s”,“w”,“e”,“nw”,“sw”,“se”,“ne”,“center”(默认) |
用pack()方法设计简易钢琴软件界面
from tkinter import *
root=Tk()
root.geometry("700x220")
#Frame是一个矩形区域,就是用来放置其他子组件
f1=Frame(root)
f1.pack()
f2=Frame(root)
f2.pack()
btnText=("流行风","中国风","欧美风","重金属","轻音乐")
for txt in btnText:
Button(f1,text=txt).pack(side="left", padx="10")
for i in range(1,20):
Label(f2,width=5, height=10, borderwidth=1, relief="solid", bg="black" if i%2==0 else "white").pack(side="left", padx=2)
root.mainloop()
钢琴软件界面效果:
place布局管理器
place布局管理器可通过坐标精准控制组件的位置,适用于一些布局更加灵活的场景。
place()方法的选项:
选项 | 说明 | 取值范围 |
---|---|---|
x,y | 组件左上角的绝对坐标(相对于窗口) | 非负整数 x和y选项用于设置偏移(像素),如果同时设置relx(rely)和x(y),那么place将优先计算relx和rely,然后在实现x和y指定的偏移量 |
relx,rely | 组件组上角的坐标(相对于父容器) | relx是相对于父组件的位置,0是最左边,0.5是正中间,1是最右边; rely是相对于父组件的位置。0是最上边,0.5是正中间,1是最下边。 |
width,height | 组件的宽度和高度 | 非负整数 |
relwidth,relheight | 组件的宽度和高(相对于父容器) | 与relx,rely取值类似,但是相对于父组件的尺寸 |
anchor | 对齐方式,左对齐“w”,右对齐“e”,顶对齐“n”,底对齐“s” | “n”,“s”,“w”,“e”,“nw”,“sw”,“se”,“ne”,“center”(默认) |