Tkinter 是 python 自带的 GUI 库,用法简洁,容易上手,但是却缺乏文档。很多人因此只能转向 wxpython 或者 pyqt。
有段时间开源社区流行 tldr 类型的文档。tldr is short for "Too Long, Didn't Read" (太长了,不想读)。
这种 tldr 类型的文档的特点就是简单实用,没有多余的废话。下面我也按照这种模式来写 tkinter 的常用组件文档
假设在运行代码之前你已经运行了下面的代码
import tkinter as tk
root = tk.Tk()
并且在想要看到效果的时候运行
root.title("Demo") # 设置标题
root.geometry('200x100') # 设置宽高
root.destroy() # 退出应用
root.mainloop() # 显示主界面,该函数必须运行在主线程中
控件是属性设置,一般有两种方法
lbl = tk.Label(root, text="Hi tkinter")
lbl.configure(txt="Hi TK !") # 等同于 lbl.config(txt="Hi TK !")
或者
lbl["text"] = "Hi TK!"
例如
tk.Label(root, text="Hi tkinter").pack()
tk.Label(root, text="Hi tkinter", bg="green", fg="white", font=("Courier New", 12)).pack()
Refs:
def on_click():
print("Clicked me!")
tk.Button(root, text="Click me", command=on_click).pack()
通过这个控件获取用户的输入
txt = tk.Entry(root, width=10).pack()
def clicked():
print("Welcome " + txt.get()
txt.focus()
# Disable entry widget
txt = Entry(window, width=10, state='disabled') # 不可输入状态
txt.configure(state="normal") # 恢复可输入状态
Refs: http://effbot.org/tkinterbook/entry.htm
import tkinter.ttk as ttk
combo = ttk.Combobox(root, state="readonly") # 默认为可编辑状态
combo['value'] = ("A", 9, 8, 7, "Text")
combo.current(2) # Select index=2 (value:8)
combo.pack()
# Get value
combo.get() # 返回的始终是str类型
combo.set("abc") # 可以是列表外的值
该组件提供展示大段文本的功能,可以包含不同字体颜色的文本,也支持内置图片和窗口。控件还能当成文本编辑器来用。
from tkinter.scrolledtext import ScrolledText
stxt = ScrolledText(root, width=40, height=10)
stxt.grid(column=0, row=0)
Text 的坐标使用"{line}.{column}"这样的格式。行的下标从 1 开始,列 (Column) 从 0 开始
# 首行开头插入文本
stxt.insert("1.0", "Hello world") # Format "%d.%d" % (line, column)
# 选择第一行
stxt.mark_set(tk.SEL, "1.0", "1.end")
# 结尾插入
stxt.insert(tk.END, "Final")
# 光标处插入
stxt.insert(tk.CURRENT, "Insert some text")
# 删除所有文本
stxt.delete(1.0, tk.END) # 1.0 is same as "1.0"
# 获取文本
contents = stxt.get(1.0, tk.END)
复选框
v = tk.BooleanVar()
cb = tk.Checkbutton(root, variable=cbstate)
cb.select() # 模拟选中
print(cbstate.get()) # Expect True
cb.deselect() # 模拟取消选中
print(cbstate.get()) # Expect False
Refs: https://infohost.nmt.edu/tcc/help/pubs/tkinter/web/checkbutton.html
ListBox 里面只能包含文本元素,而且所有的文章都只能长一个样子。
listbox = tk.Listbox(root)
listbox.pack()
for item in ["one", "two", "three", "four"]:
listbox.insert(tk.END, item)
listbox.config(selectmode=tk.EXTENDED) # 支持多选模式,默认单选
listbox.delete(0, END) # 清空列表
listbox.delete(tk.ANCHOR) # 删除选中
print(list.curselection())
listbox.get(1) # Expect "one"
# 设置指定行的前景背景和选中时的前景背景
listbox.itemconfig(1, fg="green", bg="white", selectbackground="blue", selectforeground="white")
from tkinter import messagebox
messagebox.showinfo(title="This is title", message="This is body")
TODO 还有很多常用的空间没写,有时间再补上。
Frame 是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器.
f = tk.Frame(root)
f.pack()
tk.Label(f, text="Inside frame").pack()