tkinter学习笔记1
tkinter是python自带的标准GUI库,通常无需额外安装,如果没有自带可以通过以下命令来安装
pip install tkinter
为pip指定
--user
可以无需root权限仅为当前用户安装
tkinter是对tcl/tk的一种python封装
引入基本模块
import tkinter as tk
创建根窗口
root = tkinter.Tk()
# 进入root窗口事件循环(z)
root.mainloop()
添加组件
Label
Label
是一个用于显示文本和图片的控件
属性 | 说明 |
---|---|
text | 显示的文本 |
image | 显示的图片(图片和文本只能指定一个) |
使用text
属性来设置文本
root = tkinter.Tk()
# 创建组件
label = tkinter.Label(root, text="我是一个label")
# 放置组件
label.pack()
root.mainloop()
使用image
属性来设置图片,图片不能直接通过文件名指定,需要通过Pillow库打开并转换为ImageTk.PhotoImage
对象才能被Label
直接使用
from PIL import Image,ImageTk
root = tkinter.Tk()
# 打开图片
img = Image.open("image/cona.jpg")
# 生成tkinter可以使用的图片
img_tk = ImageTk.PhotoImage(img)
tkinter.Label(root, text="显示图片").pack()
tkinter.Label(root, image=img_tk).pack()
root.mainloop()
Button
Button可以被视为一种增强型的Label
,即Label
支持的文字和图片设置Button
均支持,此外,Button
还支持通过command
属性来设置点击事件
属性 | 说明 |
---|---|
text | 显示的文本 |
image | 显示的图片(图片和文本只能指定一个) |
command | 点击时执行的命令 |
def click_event1():
print("点击了按钮")
root = tkinter.Tk()
img = Image.open("image/cona.jpg")
img_tk = ImageTk.PhotoImage(img)
label = tkinter.Label(root, text="下面是一个button").pack()
# 创建一个button
button = tkinter.Button(root, image=img_tk, command=click_event1).pack()
root.mainloop()
CheckButton
CheckButton用于实现复选框
属性 | 说明 |
---|---|
text | 显示的文本 |
variable | 用于存储该按钮选中状态的变量 |
command | 点击(选中/取消选中)该选择框时执行的命令 |
def click_event2():
print("Checkbutton state is %s"%(str(v.get())))
root = tk.Tk()
v = tk.IntVar()
b = tk.Checkbutton(root, text="点我啊", variable=v, command=click_event2)
b.pack()
root.mainloop()
CheckButton有如下常用方法
方法 | 描述 |
---|---|
deselect() | 清除单选按钮的状态 |
invoke() | 可以调用此方法来获得与用户单击单选按钮以更改其状态时发生的操作相同的操作 |
select() | 设置单选按钮为选中。 |
toggle() | 反选。当前被选中,则调用之后变为未选中,反之则为选中。 |
RatioButton
RationButton
用于实现单选框。RatioButton
通常是多个一组来使用,通过给多个RatioButton
的variable
属性指定相同的对象来将这些RatioButton
设置为同一组。
属性 | 说明 |
---|---|
text | 显示的文本 |
variable | 同一组的单选框设置相同的variable对象,variable对象中存储被选中的Radiobutton对应的value值 |
value | 该单选框对应的值,当选中该单选框时,variable绑定的变量将被设置为该值 |
command | 点击该选择框时执行的函数(已经选中后再次点击也会触发该函数) |
def click_event3():
selection = "You selected the option " + str(var.get())
print(selection)
root = tkinter.Tk()
#创建整型变量,用于绑定,相同的整型变量是为同一组
var = tkinter.IntVar()
tkinter.Radiobutton(root, text="男", variable=var, value=11,command=click_event3).pack( anchor = tkinter.W )
tkinter.Radiobutton(root, text="女",variable=var,value=22,command=click_event3).pack( anchor = tkinter.W )
tkinter.Radiobutton(root, text="保密", variable=var, value=33,command=click_event3).pack( anchor = tkinter.W)
root.mainloop()
Entry
Entry
是一个单行文本框,用于接收用户输入单行文本、密码等。通过show
属性可以指定显示的字符,例如对于密码输入框设置show = *
。通过textvariable
设置StringVar
对象可以设置该Entry
中存储的内容, 后续可以通过指定的StringVar
对象来获取和改变Entry
中的值, 也可以通过Entry.get()
方法来获取Entry
中保存的值。
属性 | 说明 |
---|---|
show | 指定输入字符后在文本框中显示的字符(主要用于遮挡输入内容) |
textvariable | 指定一个StringVar 对象来设置该Entry 中存储的内容 |
def show_input():
print("用户名:" + var.get())
print("密码:" + password_entry.get())
root = tkinter.Tk()
frame1 = tkinter.Frame(root)
var = tkinter.StringVar()
var.set("默认值")
tkinter.Label(frame1, text="用户名").pack(side="left")
tkinter.Entry(frame1, textvariable=var).pack(side="right")
frame1.pack()
frame2 = tkinter.Frame(root)
tkinter.Label(frame2, text="密码").pack(side="left")
password_entry = tkinter.Entry(frame2, show="*")
password_entry.pack()
frame2.pack()
tkinter.Button(text="按钮", command=show_input).pack()
root.mainloop()
方法 | 描述 |
---|---|
get() | 返回当前组件的字符串 |
Scale
Scale
是一个用于选择范围值的滑块控件
属性 | 说明 |
---|---|
orient | 滚动条方向,可以是水平(tk.HORIZONTAL)或者垂直(tk.VERTICAL) |
variable | 指定存储该控件对应数值的IntVar 对象,后续使用该对象可以获取Scale 控件中设置的值 |
length | 滑块长度(单位为像素) |
from_ | 最小值(from是关键字,所以在from后加了下划线) |
to | 最大值 |
tickinterval | 设置刻度值(设置该属性将在滑块旁边显示刻度值) |
def get_value():
print("滑块值: " + str(v.get()))
root = tkinter.Tk()
v = tkinter.IntVar()
tkinter.Scale(root, orient=tkinter.HORIZONTAL, variable=v, from_=0, to=200, tickinterval=50, length=200).pack()
tkinter.Button(root, text="获取滑块值", command=get_value).pack()
root.mainloop()
Text
Text
用于输入或者显示多行文本
属性 | 说明 |
---|---|
xscrollcommand | 该属性用于控制水平滚动条,将该属性设置为Scrollbar组件的set方法可以启用Text组件的水平方向滚动功能 |
yscrollcommand | 该属性用于控制垂直滚动条,将该属性设置为Scrollbar组件的set方法可以启用Text组件的垂直方向滚动功能 |
wrap | 该属性控制过长的行被分割为多行的方式, 设置为tk.CHAR则以字符为单位进行分割(即可能在任何字符断开成两行) 设置为tk.WORD则以单词为单位进行分割 设置为tk.NONE则不进行分割,通过提供水平滚动条查看超过窗口长度的行。 |
常用方法
方法 | 说明 |
---|---|
insert(index, chars) | 将chars插入到index之前 |
delete(index1, index2) | 删除index1和index2之间的字符(包括index1和index2的位置) |
index的表示方式
-
<line>.<column>
通过指定行列来表示index,例如
1.2
表示第一行第二列的字符。注意行索引从1开始,列索引从0开始 -
<line>.end
可以使用
end
代替表示列的数字来表示最后一列之后的位置 -
tk.INSERT
光标位置
-
tk.CURRENT
最接近鼠标指针的位置
data = '''床前明月光,疑是地上霜。
举头望明月,低头思故乡。
'''
# 清空Text
def clear():
text_area.delete("1.0", tkinter.END)
root = tkinter.Tk()
# 创建滚动条
y_bar = tkinter.Scrollbar(root, orient=tkinter.VERTICAL)
y_bar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
x_bar = tkinter.Scrollbar(root, orient=tkinter.HORIZONTAL)
x_bar.pack(side=tkinter.BOTTOM, fill=tkinter.X)
# 创建Text组件
text_area = tkinter.Text(root, wrap=tkinter.NONE)
# 设置滚动条的command属性为Text的xview和yview方法才能通过拖动滚动条来控制Text显示区域(滚动条控制Text),
# 仅设置上述xscrollcommand和yscrollcommand只能让,Text的滚动位置和滚动条单向绑定(即Text能控制滚动条,滚动
# 条无法控制Text)
y_bar["command"] = text_area.yview
x_bar["command"] = text_area.xview
text_area.pack()
# 插入文本内容
text_area.insert(tkinter.INSERT, data)
text_area.insert('4.0', "文本")
tkinter.Button(root, text="清空", command=clear).pack()
root.mainloop()
设置和获取控件的值
上边的一些控件中已经使用了一些*Var
对象,例如StringVar, IntVar
这些对象可以用于读取和设置控件的值。
注意,这些变量必须在创建根窗口之后才能进行创建,即这些变量需要在如下语句后才能创建和使用
root = tk.Tk()
tkinter提供了四种类型的变量对象,分别为
-
字符串型
s = tk.StringVar()
-
布尔型
b = tk.BooleanVar()
-
整型
i = tk.IntVar()
-
浮点型
d = tk.DoubleVar()
通过设置各个控件的属性可以将变量对象和控件绑定,从而实现读取(用户改变控件的值)和控制(程序改变控件的值)控件的值。变量对象通过以下get()
和set()
方法进行读写。
方法 | 说明 |
---|---|
get() | 读取变量对象中的值 |
set() | 更新变量对象中的值(同时更新其绑定的控件显示的内容) |
控件 | 绑定属性 |
---|---|
Entry | textvariable |
Checkbutton | variable |
Radiobutton | variable |
Scale | variable |
def check():
print("string: %s\n"
"bool: %s\n"
"int: %d\n"
"double: %.2f"%(s.get(), str(b.get()), i.get(), d.get()))
# 首先创建根窗口
root = tk.Tk()
# 之后才能创建变量对象
s = tk.StringVar()
b = tk.BooleanVar()
i = tk.IntVar()
d = tk.DoubleVar()
# 与控件绑定
tk.Entry(root, textvariable=s).pack()
tk.Checkbutton(root, text="选我", variable=b).pack()
# 使用Radiobutton必须通过value属性设置其代表的值
tk.Radiobutton(root, text="点我", value = 1, variable=i).pack()
tk.Scale(root, label="音量", variable=d).pack()
tk.Button(root, text="查看控件值", command=check).pack()
root.mainloop()