简介

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!"

例如

Label

tk.Label(root, text="Hi tkinter").pack()
tk.Label(root, text="Hi tkinter", bg="green", fg="white", font=("Courier New", 12)).pack()

Refs:

Button

def on_click():
    print("Clicked me!")

tk.Button(root, text="Click me", command=on_click).pack()

Entry

通过这个控件获取用户的输入

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

Combobox

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")  # 可以是列表外的值

ScrolledText

该组件提供展示大段文本的功能,可以包含不同字体颜色的文本,也支持内置图片和窗口。控件还能当成文本编辑器来用。

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)

Checkbutton

复选框

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 里面只能包含文本元素,而且所有的文章都只能长一个样子。

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") 

MessageBox

from tkinter import messagebox
messagebox.showinfo(title="This is title", message="This is body")

Refs: http://interactivepython.org/runestone/static/thinkcspy/GUIandEventDrivenProgramming/02_standard_dialog_boxes.html

TODO 还有很多常用的空间没写,有时间再补上。

Frame

Frame 是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器.

f = tk.Frame(root)
f.pack()
tk.Label(f, text="Inside frame").pack()

参考资料


↙↙↙阅读原文可查看相关链接,并与作者交流