[Python] Uso simple de tkinter (objeto Tk, tres diseños principales, variables, eventos)

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 tkinterpara 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

Supongo que te gusta

Origin blog.csdn.net/qq_39147299/article/details/130149255
Recomendado
Clasificación