Tkinter 是 Python 的标准 GUI 库,基于 Tcl/Tk 工具包封装而成,具有跨平台性、轻量级、开发效率高的特点,适合快速开发原型和小型应用 [^1]。以下是 Tkinter 的详细使用教程。
### 显示窗口
创建一个简单的 Tkinter 窗口,需要定义窗口和其属性,最后执行 `mainloop` 方法让窗口运行起来。
```python
import tkinter as tk
window = tk.Tk()
window.title('my window')
window.geometry('500x500') # 注意是 x 不是 *
window.mainloop()
```
### 核心组件使用
#### 标签(Label)
标签用来显示文字或图片。
```python
import tkinter as tk
root = tk.Tk()
label = tk.Label(root, text="Hello, Tkinter!", font=("Arial", 16), bg="lightgray", padx=10, pady=10)
label.pack()
root.mainloop()
```
#### 按钮(Button)
按钮类似标签,但提供额外的功能,例如鼠标掠过、按下、释放以及键盘操作、事件。
```python
import tkinter as tk
def button_clicked():
print("Button clicked!")
root = tk.Tk()
button = tk.Button(root, text="Click me", command=button_clicked)
button.pack()
root.mainloop()
```
#### 单行文字域(Entry)
单行文字域用来收集键盘输入。
```python
import tkinter as tk
root = tk.Tk()
entry = tk.Entry(root)
entry.pack()
def get_input():
print(entry.get())
button = tk.Button(root, text="Get Input", command=get_input)
button.pack()
root.mainloop()
```
#### 多行文字区域(Text)
多行文字区域可用来收集(或显示)用户输入的文字。
```python
import tkinter as tk
root = tk.Tk()
text = tk.Text(root)
text.pack()
def get_text():
print(text.get("1.0", tk.END))
button = tk.Button(root, text="Get Text", command=get_text)
button.pack()
root.mainloop()
```
#### 框架(Frame)
框架是包含其他组件的纯容器。
```python
import tkinter as tk
root = tk.Tk()
frame = tk.Frame(root, bg="lightblue")
frame.pack(padx=20, pady=20)
label = tk.Label(frame, text="This is inside a frame")
label.pack()
root.mainloop()
```
#### 选择按钮(Checkbutton)
选择按钮是一组方框,可以选择其中的任意个。
```python
import tkinter as tk
root = tk.Tk()
var1 = tk.IntVar()
var2 = tk.IntVar()
checkbutton1 = tk.Checkbutton(root, text="Option 1", variable=var1)
checkbutton2 = tk.Checkbutton(root, text="Option 2", variable=var2)
checkbutton1.pack()
checkbutton2.pack()
def show_selection():
print(f"Option 1: {var1.get()}, Option 2: {var2.get()}")
button = tk.Button(root, text="Show Selection", command=show_selection)
button.pack()
root.mainloop()
```
#### 列表框(Listbox)
列表框是一个选项列表,用户可以从中选择。
```python
import tkinter as tk
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack()
items = ["Item 1", "Item 2", "Item 3"]
for item in items:
listbox.insert(tk.END, item)
def show_selected():
selected_index = listbox.curselection()
if selected_index:
print(listbox.get(selected_index))
button = tk.Button(root, text="Show Selected", command=show_selected)
button.pack()
root.mainloop()
```
#### 菜单(Menu)
菜单点下菜单按钮后弹出的一个选项列表,用户可以从中选择。
```python
import tkinter as tk
root = tk.Tk()
menubar = tk.Menu(root)
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="Open")
filemenu.add_command(label="Save")
filemenu.add_separator()
filemenu.add_command(label="Exit", command=root.quit)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
root.mainloop()
```
#### 菜单按钮(Menubutton)
菜单按钮用来包含菜单的组件(有下拉式、层叠式等等)。
```python
import tkinter as tk
root = tk.Tk()
menubutton = tk.Menubutton(root, text="Menu")
menubutton.pack()
menu = tk.Menu(menubutton, tearoff=0)
menu.add_command(label="Option 1")
menu.add_command(label="Option 2")
menubutton.config(menu=menu)
root.mainloop()
```
#### 消息框(Message)
消息框类似于标签,但可以显示多行文本。
```python
import tkinter as tk
root = tk.Tk()
message = tk.Message(root, text="This is a multi-line message.\nIt can span multiple lines.")
message.pack()
root.mainloop()
```
#### 单选按钮(Radiobutton)
单选按钮组按钮,其中只有一个可被“按下”(类似 HTML 中的 radio)。
```python
import tkinter as tk
root = tk.Tk()
var = tk.StringVar()
var.set("Option 1")
radiobutton1 = tk.Radiobutton(root, text="Option 1", variable=var, value="Option 1")
radiobutton2 = tk.Radiobutton(root, text="Option 2", variable=var, value="Option 2")
radiobutton1.pack()
radiobutton2.pack()
def show_selection():
print(var.get())
button = tk.Button(root, text="Show Selection", command=show_selection)
button.pack()
root.mainloop()
```
#### 进度条(Scale)
进度条是线性“滑块”组件,可设定起始值和结束值,会显示当前位置的精确值。
```python
import tkinter as tk
root = tk.Tk()
def show_value(value):
print(value)
scale = tk.Scale(root, from_=0, to=100, orient=tk.HORIZONTAL, command=show_value)
scale.pack()
root.mainloop()
```
#### 滚动条(Scrollbar)
滚动条对其支持的组件(文本域、画布、列表框、文本框)提供滚动功能。
```python
import tkinter as tk
root = tk.Tk()
text = tk.Text(root)
scrollbar = tk.Scrollbar(root, command=text.yview)
text.config(yscrollcommand=scrollbar.set)
text.pack(side=tk.LEFT, fill=tk.Y)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
root.mainloop()
```
#### 顶级(Toplevel)
顶级类似框架,但提供一个独立的窗口容器。
```python
import tkinter as tk
root = tk.Tk()
def open_new_window():
top = tk.Toplevel(root)
label = tk.Label(top, text="This is a new window")
label.pack()
button = tk.Button(root, text="Open New Window", command=open_new_window)
button.pack()
root.mainloop()
```
#### 画布(Canvas)
画布提供绘图功能(直线、椭圆、多边形、矩形),可以包含图形或位图。
```python
import tkinter as tk
root = tk.Tk()
canvas = tk.Canvas(root, width=200, height=200)
canvas.pack()
canvas.create_line(0, 0, 200, 200)
canvas.create_rectangle(50, 50, 150, 150, fill="blue")
root.mainloop()
```