Este directorio de artículos
1.tkinter
tkinter es una interfaz Python estándar del kit de herramientas GUI Tcl/Tk (es decir, que utiliza el lenguaje Tcl para desarrollar la biblioteca de gráficos Tk), que admite la operación multiplataforma en Windows, macOS y Linux.
tkinter es una biblioteca estándar que viene con Python y no requiere instalación adicional. Si su Python no tiene tkinter, verifique si su Python es una versión estándar. Actualmente, la última versión de tkinter es 8.6, puede usar el comando python -m tkinter
para ver la versión.
Documentación oficial de Tkinter: https://docs.python.org/3/library/tkinter.html
2. objeto TK
Un objeto Tk es una ventana, y llamar a su método mainloop() después de instanciar un objeto Tk mostrará la ventana. Los siguientes son algunos de los métodos más utilizados de objetos Tk
método | ilustrar |
---|---|
título() | establecer el título de la ventana |
geometría() | Establecer el tamaño y la posición de la ventana |
redimensionable() | Si el ancho y la altura se pueden estirar |
tamaño mínimo() | El ancho y la altura mínimos estirables |
tamaño máximo() | Anchura y altura máximas estirables |
iconobitmap() | Establecer icono de formato ico |
iconofoto() | Establecer icono en formato png |
actualizar() | Actualizar la ventana (para evitar problemas como ancho y alto de ventana incorrectos) |
winfo_ancho() | Obtener ancho de ventana |
winfo_altura() | obtener la altura de la ventana |
winfo_ancho de pantalla() | Obtener ancho de pantalla |
winfo_screenheight() | Obtener la altura de la pantalla |
winfo_x() | Obtener la distancia desde la ventana a la izquierda de la pantalla |
winfo_y() | Obtener la distancia desde la ventana hasta la parte superior de la pantalla |
atributos() | Configure la información de la ventana (vea el código a continuación para obtener más detalles) |
estado() | Establecer u obtener el estado de la ventana, normal, icono (minimizado), ampliado (maximizado) |
iconificar() | minimizar ventana |
deiconificar() | restaurar ventanas minimizadas |
protocolo() | Protocolo de llamada, como el protocolo WM_DELETE_WINDOW |
retirar() | ocultar la ventana sin destruirla |
abandonar() | Salir de la ventana actual (finalizar el bucle principal actual) |
destruir() | Destruye la ventana (completamente cerrada) |
bucle principal() | Ingrese al bucle de eventos, es decir, muestre la ventana |
ejemplo
import tkinter as ttk
root = ttk.Tk()
root.title("主窗口") # 设置窗口标题
root.geometry("500x200") # 设置窗口大小
root.geometry("+300+300") # 设置窗口与屏幕左边和上边的距离,即窗口位置
root.resizable(True, True) # 宽、高是否可以拉伸
root.minsize(100, 60) # 可拉伸的最小值
root.maxsize(1000, 500) # 可拉伸的最大值
# root.iconbitmap("test_ico.ico") # 设置ico格式图标
# root.iconphoto(False, ttk.PhotoImage(file="test_ico.png")) # 设置png格式图标
root.update() # 刷新窗口(可避免获取窗口宽高不准等问题)
print(root.winfo_width()) # 获取窗口宽度
print(root.winfo_height()) # 获取窗口高度
print(root.winfo_screenwidth()) # 获取屏幕宽度
print(root.winfo_screenheight()) # 获取屏幕高度
print(root.winfo_x()) # 获取窗口距离屏幕左边的距离
print(root.winfo_y()) # 获取窗口距离屏幕上边的距离
# root.attributes("-alpha", 0.5) # 设置透明度
# root.attributes("-fullscreen", True) # 设置全屏,没做退出全屏按钮前慎用
# root.attributes("-topmost", True) # 是否置顶
# root.attributes("-toolwindow", True) # 取消最大最小
# root.attributes("-disabled", True) # 是否禁用窗口,禁用后不可交互
# root.state() # 设置或获取窗口状态, normal、icon(最小化)、zoomed(最大化)
# root.iconify() # 最小化窗口
# root.deiconify() # 还原最小化窗口
# root.withdraw() # 隐藏窗口但不会销毁
# root.quit() # 退出当前窗口(结束当前循环)
# root.destroy() # 销毁窗口(彻底退出)
def on_closing():
print("监听到关闭窗口")
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_closing) # 监听协议事件
root.mainloop() # 显示窗口
3. Tres diseños principales
Diseño de paquete 3.1
El diseño del paquete es un método de diseño secuencial. El diseño predeterminado es de arriba hacia abajo centrado (diferentes filas), y también se puede cambiar al diseño de izquierda a derecha (misma fila).
parámetro | ilustrar |
---|---|
lado | Disposición, arriba opcional (predeterminado), abajo, izquierda, derecha |
ancla | Alineación, centro opcional (predeterminado), e, n, w, s o su combinación, como nw, sw |
ipadx | El valor de sangría en la dirección x, similar al relleno del extremo frontal |
ipads | El valor de sangría en la dirección y, similar al relleno del extremo frontal |
Padx | El valor de desplazamiento en la dirección x, similar al margen del extremo frontal |
Arrozal | El valor de compensación en la dirección y, similar al margen del extremo frontal |
llenar | Rellene el área restante, opcional x, y, ambos, Ninguno, como el diseño superior e inferior, establezca en x, luego el control ocupará una línea completa |
expandir | Área extendida, opcional Verdadero, Falso (predeterminado), si es Verdadero ocupará el área deshabilitada del componente padre tanto como sea posible (es decir, el efecto de centrado) |
ejemplo
import tkinter as ttk
root = ttk.Tk()
root.geometry('500x300')
ttk.Label(root, text="冰冷的希望1", bg="#ffffff").pack(side="bottom") # 在下边对齐
ttk.Label(root, text="冰冷的希望2", bg="#ccffcc").pack(anchor="e") # 居东对齐
ttk.Label(root, text="冰冷的希望3", bg="#ccffff").pack(fill='x') # x方向填充
ttk.Label(root, text="冰冷的希望4", bg="#99cccc").pack(fill='y') # y方向填充,但这是上下排版,故不起作用
ttk.Label(root, text="冰冷的希望5", bg="#99cc99").pack(fill='y', expand=True) # 改为可扩展则y填充起作用
ttk.Label(root, text="冰冷的希望6", bg="#99cc99").pack(ipadx=20, pady=10)
root.mainloop()
El resultado de la operación es el siguiente
3.2 diseño de cuadrícula
El diseño de la cuadrícula se organiza de acuerdo con las filas y columnas de la tabla, y los elementos se colocan en las celdas, por lo que este método de diseño es muy flexible y más fácil de organizar de forma ordenada.
parámetro | ilustrar |
---|---|
fila | número de línea |
columna | número de columna |
filas | número de líneas a fusionar |
intervalo de columnas | número de columnas a fusionar |
pegajoso | Alineación, opcional e, n, w, s o su combinación como nw, sw |
ejemplo
import tkinter as ttk
root = ttk.Tk()
ttk.Label(root, text="冰冷的希望1", bg="#ffffff").grid(row=0, column=0) # 默认
ttk.Label(root, text="冰冷的希望2", bg="#ccffcc").grid(row=0, column=1, columnspan=2, padx=200) # 合并第1、2列
ttk.Label(root, text="冰冷的希望3", bg="#ccffff").grid(row=0, column=3, rowspan=2) # 合并第0、1行
ttk.Label(root, text="冰冷的希望4", bg="#99cccc").grid(row=1, column=0, ipadx=5, ipady=10) # 内
ttk.Label(root, text="冰冷的希望5", bg="#99cc99").grid(row=1, column=1, pady=5, padx=5)
ttk.Label(root, text="冰冷的希望6", bg="#996699").grid(row=1, column=2, sticky="sw")
root.mainloop()
El efecto de la operación es el siguiente
3.3 disposición del lugar
El diseño del lugar puede ser tanto absoluto como relativo. La flexibilidad es muy alta. Puede especificar directamente las coordenadas x e y del elemento (el origen es la esquina superior izquierda de la ventana o el contenedor principal). Tenga en cuenta que si la posición de los elementos se superponen, los elementos del diseño posterior cubrirán los elementos del diseño anterior.
parámetro | ilustrar |
---|---|
X | La posición absoluta desde la izquierda de la ventana. |
y | La posición absoluta desde la parte superior de la ventana. |
relajarse | La posición relativa desde la izquierda de la ventana (u otros controles) (0~1) |
confiar | La posición relativa desde la parte superior de la ventana (u otros controles) (0~1) |
ancho | ancho del elemento |
altura | la altura del elemento |
relancho | El ancho del elemento relativo a la ventana (0~1) |
altura | La altura del elemento en relación con la ventana (0~1) |
ancla | 对齐方式,可选center(默认)、w、n、e、s及其组合,如nw |
如果使用相对宽度或相对高度,它们会随窗口大小的改变而实时改变
举例
import tkinter as ttk
root = ttk.Tk()
root.geometry('600x300')
ttk.Label(root, text="冰冷的希望1", bg="#ffffff").place(x=20, y=20) # 绝对位置(20, 20)
ttk.Label(root, text="冰冷的希望2", bg="#ccffcc").place(x=20, y=50, width=200, height=30) # 设置元素的宽度和高度
ttk.Label(root, text="冰冷的希望3", bg="#ccffff").place(x=30, y=90, anchor="nw") # 设置左上角对齐
ttk.Label(root, text="冰冷的希望4", bg="#99cccc").place(x=20, relx=0.5, rely=0) # 左边偏移20后再偏移窗口宽度的50%
ttk.Label(root, text="冰冷的希望5", bg="#99cc99").place(x=20, y=150, relwidth=0.2, relheight=0.2) # 宽度高度都为窗口的20%
root.mainloop()
运行效果如下
4.变量
tkinter的变量用于更新GUI,比如说按钮显示的文本、输入框输入的文本内容等,变量发生改变它会更新到UI上。一共有四种变量类型,分别是strVar、intVar、doubleVar、booleanVar,分别对应Python的str、int、float、bool。
这几种变量都有get和set方法用于获取和修改它们的值
import tkinter as ttk
root = ttk.Tk()
root.geometry('600x300')
strVar = ttk.StringVar(value="点击改变") # 默认值是空字符,此处指定为“点击改变”
intVar = ttk.IntVar(value=1) # 默认值是10,此处指定为10
doubleVar = ttk.DoubleVar(value=0.5) # 默认值是0.0,此处指定为0.5
booleanVar = ttk.BooleanVar(value=True) # 默认值是False,此处指定为True
ttk.Label(root, textvariable=intVar).pack()
ttk.Label(root, textvariable=doubleVar).pack()
ttk.Label(root, textvariable=booleanVar).pack()
def on_click():
print("原strVar:", type(strVar.get()), strVar.get()) # 原strVar: <class 'str'> 点击改变
print("原intVar:", type(intVar.get()), intVar.get()) # 原intVar: <class 'int'> 1
print("原doubleVar:", type(doubleVar.get()), doubleVar.get()) # 原doubleVar: <class 'float'> 0.5
print("原booleanVar:", type(booleanVar.get()), booleanVar.get()) # 原booleanVar: <class 'bool'> True
strVar.set("已改变")
intVar.set(1000)
doubleVar.set(3.14)
booleanVar.set(False)
ttk.Button(root, text="改变", textvariable=strVar, command=on_click).pack()
root.mainloop()
5.事件
tkinter的元素控件或窗口都可以调用bind()、unbind()绑定、解绑事件,第一个参数是事件的描述,第二个参数是要回调的函数名
事件的描述是一个字符串,<modifier-type-detail>
,其中type是必须要的,modifier和detail是可选的
modifier 是对事件的修饰,比如说需要的辅助按键,双击还是三击等
modifier | 说明 |
---|---|
Any | 按下任何按键时 |
Control | 按下Ctrl键时 |
Shift | 按下shift键时 |
Lock | 在大写状态下 |
Double | 连续两次事件发生(比如说双击) |
Triple | 连续三次事件发生(比如说双击) |
type(事件类型)大概分为鼠标事件、键盘事件以及一些元素的互动事件
type | 说明 |
---|---|
Button、ButtonRelease | 按下鼠标、释放鼠标时触发 |
KeyPress、KeyRelease | 按下某个键、释放某个键时触发,KeyPress可以简写为Key |
Enter、Leave | 鼠标进入、离开时触发 |
FocusIn、FocusOut | 获取、失去焦点时触发,可调用focus_set()获取焦点 |
Motion | 当鼠标在元素内移动时触发 |
Configure | 元素大小发生变化时触发 |
MouseWheel | 当在元素内滑动滚轮时触发 |
Destroy | 元素销毁时触发 |
detail 指的是更详细的描述,比如说按下了哪个字母、哪个数字、哪个鼠标键等
比如说Button-1表示鼠标左键,Button-2表示鼠标中键、Button-3表示鼠标右键,Key-a表示按下了字母a键,因为太多组合了所以这里不进行赘述
事件举例
import tkinter as ttk
root = ttk.Tk()
root.geometry('600x300')
strVar = ttk.StringVar(value="点击触发") # 默认值是空字符,此处指定为“点击改变”
ttk.Label(root, textvariable=strVar).pack()
def handle_event(event):
print(event, event.type, event.keysym)
strVar.set("已触发事件")
ttk.Button(root, text="按钮").pack()
btn = ttk.Button(root, text="改变", textvariable=strVar, width=20, height=5)
# btn.bind("<ButtonRelease-1>", handle_event) # 单击鼠标左键
btn.bind("<Double-Button-1>", handle_event) # 双击鼠标左键
# btn.bind("<KeyPress>", handle_event) # 按下任何按键
# btn.bind("<KeyPress-c>", handle_event) # 按下小写c键
# btn.bind("<KeyPress-C>", handle_event) # 按下大写C键
# btn.bind("<Key-Return>", handle_event) # 按下回车键
# btn.bind("<Control-Shift-KeyPress-A>", handle_event) # 按下Ctrl+Shit+Alt+A键
# btn.bind("<Motion>", handle_event) # 鼠标在元素内移动
btn.focus_set()
btn.pack()
toplevel = ttk.Toplevel(root, width=100, height=60)
toplevel.bind("<FocusIn>", handle_event) # 获得焦点时
toplevel.bind("<FocusOut>", handle_event) # 失去焦点时
root.bind("<Configure>", handle_event)
root.mainloop()
如果是按钮类型的元素,除了可以使用bind()方法,还可以在实例化组件的时候指定command参数
...
def handle_event():
strVar.set("已出发事件")
ttk.Button(root, text="按钮", command=lambda: handle_event).pack()
btn = ttk.Button(root, text="改变", textvariable=strVar, width=20, height=5)
root.mainloop()
更详细的描述可以参考
https://manpages.debian.org/bullseye/tk8.6-doc/bind.3tk.en.html