版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/Changcheng2017/article/details/82415703#commentBox
1.创建窗体及窗体的常用属性
import tkinter #导入tkinter库
Window_Root = tkinter.Tk() # 创建窗体
# 窗体的常用属性:
Window_Root.title('Hello tkinter!') # 设置窗体名称
Window_Root.geometry('300x200') # 设置窗体尺寸,注意中间为小写x
Window_Root.resizable(width=False, height=True) # 设置窗口是否可以变化长、宽,true为可以改变,false为不可以
'''
在窗体中创建各种控件
'''
Window_Root.mainloop() # 保持窗体打开
2.控件的常用布局
tkinter提供了三种布局方式:
- pack()
- grid()
- place()
三种布局方式不能在同一窗体中混合使用。
- pack()是比较简单的布局方式,默认为自上而下进行布局,常用的引用格式为:
Window_Root.Widget_1.pack(fill = , # 组件填充方向:X(水平方向填充)、Y(垂直方向填充)、BOTH(水平和垂直)、NONE(默认,不向任何方向填充)
side = '' , # 组件对齐方式:left、right、top、bottom
expand = '', # yes/no 若fill选项为BOTH,则填充父组件的剩余空间。默认为不展开
anchor = '') # 当可用空间大于所需求的尺寸时,决定组件被放置于容器的何处:N、E、S、W、NW、NE、SW、SE、CENTER(默认值为CENTER)
-grid()是比较简单的布局方式,默认为自上而下进行布局,常用的引用格式为:
Window_Root.Widget_1.grid(row= , # 指定行序号
column = , # 指定列序号
sticky = '', # 设置组件在父系中的对齐方式
rowspan = , # 设置控件所跨越的行个数
columnspan = ) # 设置控件所跨越的列个数
'''
通常可以拿gird()搭配循环模块进行多行控件的代码简化,如:
colours = ['red', 'green', 'orange', 'white']
r = 0
for c in colours:
tkinter.Label(text=c, relief='ridge', width=20).grid(row=r, column=0)
r = r + 1
-place()通过直接指定控件左上角坐标来放置控件,但是不同分辨率下可能会导致错位。常用的引用格式为:
Window_Root.Widget_1.place(x = , # 指定x轴的绝对坐标(相对于整个窗体)
y = , # 指定y轴的绝对坐标(相对于整个窗体)
relx = , # 指定相对于父对象的相对坐标x
rely = ) # 指定相对于父对象的相对坐标y
### 注意,相对坐标和绝对坐标不能同时使用
3.控件 - Label
Label_1 = tkinter.label(master = , # master指定该控件的父容器
### 标签文本
test = '', # label所显示的文本,静态
textvariable = , # label所显示的动态文本,内容赋值不同而不同
'''
动态文本的赋值方式:
VAR = bla,bla,bla # 动态变量
str_obj_1 = tkinter.StringVar()
str_obj_1.set(f'{VAR}') # 格式化引用VAR或直接引用字符串''
textvariable = str_obj_1
'''
font = '', # 指定字体,从系统字体库来
justify = '', # 文本对齐方式:center(默认),left,right
foreground = '', # 字体颜色,可直接指定英文名,如white,red,也可指定RGB格式
anchor = '', # 文本在内容区的位置:n,s,w,e,ne,nw,sw,se,center
### 标签内容区
height = , # label高度
weight = , # label宽度
padx = , # label内容区与右边框的间隔大小,int类型
pady = , # label内容区与上边框的间隔大小,int类型
background = '', # label内容区背景色,可直接指定英文名,如white,red,也可指定RGB格式
### 标签边框
relief = '', # 边框的样式:flat(默认),sunken,raised,groove,ridge,如要设置边框,则边框宽度不应为0
borderwidth = , # label边框的宽度
### 标签中插入图片,应为gif,ppm/pgm或bmp位图格式
image = image_1, # 插入指定的图片
compound = "", # 控制图片与文本的位置:None表示只显示图像,不显示文本;bottom/top/left/right,表示图片显示在文本的下/上/左/右;center,表示文本显示在图片中心上
'''
插入指定路径的图片:
image_1 = TKinter.PhotoImage(file = "gif 、ppm/pgm图片路径")
image_1 = TKinter.BitmapImage(file = "bmp位图片路径")
'''
### 其它
state = '', # 指定该控件的状态,默认为normal,另有:activite,disable可指定
cursor = '', # 指定光标移动至该控件上的形状:arrow、circle、clock、cross、dotbox、exchange、fleur、heart、heart、man、mouse、pirate、plus、shuttle、sizing、spider、spraycan、target、star、tcross、trek、watch
4.控件 - Button
Button的指令与Label相似,只不过多了一个命令:command=函数名。该命令通常可以和自定义函数搭配使用,如:
def hello():
print('hello button')
Window_Root = tkinter.Tk()
Button_1 = tkinter.Button(master=Window_Root, text='Print Hello Button', command=hello).pack()
Window_Root.mainloop()
5.控件 - Entry
Entry()用于制作单行文本框,需要注意的是,Entry()中text属性是无效的,若要在Entry()中预先就输入好文本,需要使用textvariable。如果希望输进Entry()的字符是自定义的,如输密码时的暗码,可使用show=”进行规定。
若我们想将通过Entry()输入的值赋给一个变量,则可以采取以下方式:
v = tkinter.StringVar() # 定义一个字符变量作为容器v
entry_1 = tkinter.Entry(Window_Root, textvariable=v) # 将通过Entry()输入的内容赋值给容器v
value = v.get() # 从容器v中提取内容并将其给予一个新容器value
6.控件 - Frame
Frame的作用是创造一个形状为矩形的父类,作为容器承装其它控件,多用于实现不同类控件间的分组。
frame_1 = Frame(master=, OPTIONS,。。。) # Frame的用法与其它控件类似
7. 控件- Checkbutton
Checkbutton用于对一个陈述进行Yes或No的选择,基本用法与上述类似,但是额外多了对勾选动作的指令:
- command = ,指定勾选后执行的函数
- onvalue = ,指定checkbutton处于勾选状态时的值,通常取1
- offvalue = ,指定checkbutton处于非勾选状态时的值,通常取0
- variable = ,指定跟踪checkbutton状态的变量
下面是一个用checkbutton执行自定义函数的例子:
def act_selection:
if var_1.get() == 1:
label_1.config(text = 'WOW!!!!!!!Me tooooooooo!')
else:
label_1.config(text = 'Too bad, you shall lose a good guy....')
var_1 = tkinter.IntVar()
check_iflikeme = tkinter.Checkbutton(master=Window, text='Do you like me?',\
variable=var_1, onvalue=1, offvalue=0,\
command=act_selection).pack()
window.mainloop()
另外还有一些工具:
check_button.select() # 默认选中
check_button.deselect() # 默认无法选中
8. 控件 - Radiobutton
Radiobutton是用于执行多选一的控件,用法与checkbutton相似,但是要为每一个选项指定触发后的动作,并且需要用value=跟踪每个check通常使用command自定义函数触发。
### 在选项较多的情况下,可以使用for语句为每个选项定义触发标志:
text_RaB = ['Red', 'Blue', 'yellow']
index_RaB = [1, 2, 3, 4]
def print_color:
if value == 1:
print(text_RaB[0])
elseif value == 2:
print(text_Rab[1])
elseif value == 3:
print(text_Rab[2])
else :
print(text_Rab[3])
for color, index in text_RaB, index_RaB:
Window_Radiobutton = tkinter.Radiobutton(master=None,text=color, value=index, command=print_color).pack()
9.控件 - Combobox
Combobox建立一个简易的下拉列表,这个菜单没有label,可以为菜单中的选项设置动作,通常与事件绑定使用。
# 定义一个用来与每个选项相对应的函数,并以*arg作为可变参数
def show_msg(*arg) :
print('Your favorite fruit is:', Windows_Combobox.get()) # Windows_Combobox.get()为从选中的选项中提取内容
# 定义Combobox控件:
fruits_name = tkinter.StringVar() # 设置一个类型为字符串的变量,用来作为空容器准备盛放Combobox选中项
Windows_Combobox = tkinter.Combobox(master=Window_Root, textvariable=fruits_name) # 设置Combobox,并以空容器fruits_name作为下拉选项名称
Windows_Combobox['values'] = ['Apple', 'Banana', 'Pitch'] # 给下拉选项命名,填充空容器
Windows_Combobox.bind("<<ComboboxSelected>>", show_msg) # 将选中下拉菜单中的某一选项作为事件,与show_msg绑定在一起:当选中任何一项时,触发函数show_msg
Windows_Combobox.pack()
10.控件 - Menu
Menu是一个成熟的下拉菜单,可以为该菜单指定标签。通过创建一个Menu实例,将Name.add_command与top.config(menu=Name)相结合可以在顶层创建一个下拉菜单。可以采用command指定选中每个选项的动作,也可以通过绑定事件来执行函数。menu不需要进行布局操作。
def hello():
if value == 1:
print()
elif value == 2:
print()
else:
print()
Index = (1, 2, 3)
Item = ('Apple', 'Banana', 'Pitch')
menubar = tkinter.Menu(master) # 在master下创建下拉菜单
for i, name in Index, Item # 为下拉菜单的label赋值
menubar.add_command(label=name, value=i)
master.config(menu=menubar) #显示master中的menu
menubar.bind("<<MenuSelected>>", hello) # 绑定函数