布局

Pack布局管理器

Pack布局管理器是最简单的布局管理器之一,它会自动将组件紧密地堆叠在一起,从而形成一列或一行。可以使用side选项指定组件的排列方式,如LEFT、RIGHT、TOP、BOTTOM。

import tkinter

root = tkinter.Tk()
root.title("Pack Layout")
root.geometry('450x300')

label1 = tkinter.Label(root, text="Label 1", bg="yellow")
label1.pack(side=tkinter.LEFT)
label2 = tkinter.Label(root, text="Label 2", bg="blue")
label2.pack(side=tkinter.LEFT)
button = tkinter.Button(root, text="Button", bg="red")
button.pack(side=tkinter.LEFT)

root.mainloop()

Grid布局管理器

Grid布局管理器可以将组件放置在网格中,每个单元格可以放置一个组件。可以使用row和column选项指定组件的行号和列号,使用rowspan和columnspan选项指定组件占用的行数和列数。

import tkinter

root = tkinter.Tk()
root.title("Grid  Layout")
root.geometry('450x300')

label1 = tkinter.Label(root, text="Label 1", bg="yellow")
label1.grid(row=0, column=0)
label2 = tkinter.Label(root, text="Label 2", bg="blue")
label2.grid(row=0, column=1)
button = tkinter.Button(root, text="Button", bg="red")
button.grid(row=1, column=0, columnspan=2)

root.mainloop()

Place布局管理器

Place布局管理器可以直接指定组件的坐标和大小,适合于需要精细控制组件位置和大小的情况。

import tkinter

root = tkinter.Tk()
root.title("Place Layout")
root.geometry('450x300')

label1 = tkinter.Label(root, text="Label 1", bg="yellow")
label1.place(x=10, y=10)
label2 = tkinter.Label(root, text="Label 2", bg="blue")
label2.place(x=100, y=100)
button = tkinter.Button(root, text="Button", bg="red")
button.place(x=50, y=50, width=100, height=50)

root.mainloop()

Message Box

import tkinter
import tkinter.messagebox

root = tkinter.Tk()
root.title("Place Layout")
root.geometry('450x300')

def callback():
    result = tkinter.messagebox.askokcancel(title='title', message='message')

button = tkinter.Button(root, text='点击弹框', command=callback)
button.pack(pady=15)

root.mainloop()

tkinter-protocol

除事件绑定外,Tkinter还支持一种称为协议(protocol-)处理程序的机制。 协议是指应用程序与窗口管理器之间的交互。

WM_DELETE_WINDOW

一旦定义了自己的处理程序handler,Tkinter将不再自动关闭窗口。 相反,可以如显示一个消息框,询问用户是否应保存当前数据,或者在某些情况下,只需忽略请求即可。 要从此处理程序关闭窗口,只需调用窗口的destroy方法。

import tkinter
import tkinter.messagebox

root = tkinter.Tk()
def on_closing():
    if tkinter.messagebox.askokcancel("Quit", "Do you want to quit?"):
        root.destroy()

root.protocol('WM_DELETE_WINDOW', on_closing)
root.mainloop()