Tkinter标准库
Tkinter是Python的标准GUI库,也是最常用的Python GUI库之一,提供了丰富的组件和功能,包括窗口、按钮、标签、文本框、列表框、滚动条、画布、菜单等,方便开发者进行图形界面的开发。Tkinter库基于Tk for Unix/Windows/macOS,由Tcl语言编写。使用Tkinter,可以快速创建桌面应用程序,并支持多平台Windows、macOS、Linux等。
tkinter控件全集
在python中导入tkinter库后,有18种控件(也称组件):
导入方式:import tkinter as tk
Button、Canvas、Checkbutton、Entry、Frame、Label、LabelFrame、Listbox、Menu、Menubutton、Message、OptionMenu、PanedWindow、Radiobutton、Scale、Scrollbar、Spinbox、Text
最学见的按钮、文本框、标签、列表框等都在里边,唯独没看到组合框ComboBox。查过资料后才知道,tkinter库中还有一子模块tkinter.ttk,它包含有包括Combobox在内的20种控件:
导入方式:from tkinter import ttk
Button、Checkbutton、Combobox、Entry、Frame、Label、LabelFrame、LabeledScale、Labelframe、Menubutton、Notebook、OptionMenu、PanedWindow、Progressbar、Radiobutton、Scale、Scrollbar、Separator、Sizegrip、Spinbox、Treeview
请注意,某些控件在两个模块中都存在(如Button, Checkbutton, Entry等),但它们在外观和行为上可能会有所不同,ttk模块中的控件可以提供更加现代和可定制的外观。以Button为例,都以简单的方式表达,运行后的外观和行为都有些不同。
import tkinter as tk
from tkinter import ttk
button1 = tk.Button(root, text="Click Me", command=button_click)
button2 = ttk.Button(root, text="Click Me", command=button_click)
如图所示:
完整代码如下:
import tkinter as tk
from tkinter import ttk
def button_click():
print("Button clicked!")
if __name__=='__main__':
root = tk.Tk()
root.title("Button vs ttk.Button")
root.geometry("400x300")
button1 = tk.Button(root, text="Click Me", command=button_click)
button1.pack(pady=60)
button2 = ttk.Button(root, text="Click Me", command=button_click)
button2.pack(pady=20)
root.mainloop()
以下将介绍今天的主角:ttk.Combobox 组合选择框。
ComboBox 组合选择框
ComboBox 将几个文本字段组合成为一个可弹出的选择列表。它的原版帮助有3万多字呢,以下挑一些主要的操作方法简单介绍一下:
创建并设置选择项
values = ["Option 1", "Option 2", "Option 3", "Option 4"]
combobox = ttk.Combobox(root, values=values)
combobox.pack()
绑定事件ComboboxSelected
combobox.bind("<<ComboboxSelected>>", on_select)
获取当前选择项combobox.get()
combobox.get()
以上插图的代码如下:
import tkinter as tk
from tkinter import ttk
def on_select(event):
label.config(text = "当前选择为:" + combobox.get())
if __name__=='__main__':
# 创建主窗口
root = tk.Tk()
root.title("Combobox Example")
root.geometry("400x300")
label = tk.Label(root, text="请点击下拉框选择:")
label.pack()
# 创建多选下拉框
values = ["Option 1", "Option 2", "Option 3", "Option 4"]
combobox = ttk.Combobox(root, values=values)
combobox.pack()
combobox.bind("<<ComboboxSelected>>", on_select)
# 运行主循环
root.mainloop()
设置当前显示项combobox.set()
combobox.set()
自定义类 SelectCombobox
把以上内容综合起来,自定义一个组合框类:
import tkinter as tk
from tkinter import ttk
class SelectCombobox(ttk.Combobox):
def __init__(self, master=None, values=None):
super().__init__(master, values=values)
self.bind("<<ComboboxSelected>>", self.on_select)
def on_select(self, event):
label.config(text = "当前选择为:" + self.get())
if __name__=='__main__':
# 创建主窗口
root = tk.Tk()
root.title("Combobox Example")
root.geometry("400x300")
label = tk.Label(root, text="请点击下拉框选择:")
label.pack()
# 创建多选下拉框
values = ["Option 1", "Option 2", "Option 3", "Option 4"]
combobox = SelectCombobox(root, values=values)
combobox.pack()
# 运行主循环
root.mainloop()
扩展Combobox组合框
拓展成多项选择
Combobox本身不支持多项选择,变通方法:引入一个列表,用于存放已选项,奇数次选择一个项则存入列表、反之偶数次选择则移除。
代码如下:
import tkinter as tk
from tkinter import ttk
class MultiSelectCombobox(ttk.Combobox):
def __init__(self, master=None, values=None, **kwargs):
super().__init__(master, values=values, **kwargs)
self.bind("<<ComboboxSelected>>", self.on_select)
self.selected_values = []
def on_select(self, event):
selected_value = self.get() # 使用 get 方法获取选中项的值
if selected_value in self.selected_values:
self.selected_values.remove(selected_value) # 如果已选中,则移除该选项
else:
self.selected_values.append(selected_value) # 如果未选中,则添加到已选项列表
self.selected_values.sort()
if self.selected_values:
text = '、'.join(self.selected_values)
else:
text = '空'
label2.config(text = "当前选择为:" + text)
if __name__=='__main__':
# 创建主窗口
root = tk.Tk()
root.title("Multi-Select Combobox Example")
root.geometry("400x300")
label = tk.Label(root, text="请选择:")
label.pack()
# 创建多选下拉框
values = ["Option 1", "Option 2", "Option 3", "Option 4"]
combobox = MultiSelectCombobox(root, values=values)
combobox.pack()
text = "当前选择为:空"
label2 = tk.Label(root, text=text)
label2.pack()
# 运行主循环
root.mainloop()
选项前添加符号
Combobox本身不支持修改选择项,变通方法:在每次变更选项时都重建一个新的组合框,同时把所有的选项前都加上一个全角空格(\u3000),对于已选中的选项,则把前面的全角空格替换成对勾符号(\u2713)。
这样子可能更像一个多项选择框,如下图:
代码如下:
import tkinter as tk
from tkinter import ttk
def on_select(event):
selected_value = combobox.get()
selected_value = selected_value.replace("\u2713","\u3000")
if selected_value in selected_values:
selected_values.remove(selected_value)
else:
selected_values.append(selected_value)
selected_values.sort()
if selected_values:
text = '、'.join(selected_values).replace('tion ','')
else:
text = '空'
label.config(text = "当前选择为:" + text)
update_combobox_options()
def update_combobox_options():
global combobox
combobox.grid_forget()
new_values = []
for v in values:
if v in selected_values:
new_values.append(v.replace("\u3000","\u2713"))
else:
new_values.append(v)
combobox = ttk.Combobox(root, values=new_values, state='readonly')
combobox.place(x=100, y=30)
combobox.set('请点击选择:')
combobox.bind("<<ComboboxSelected>>", on_select)
if __name__=='__main__':
# 创建主窗口
root = tk.Tk()
root.title("Multi-Select Combobox Example")
root.geometry("400x300")
# 创建多选下拉框
values = ["Option 1", "Option 2", "Option 3", "Option 4"]
values = ["\u3000"+v for v in values]
selected_values = []
combobox = ttk.Combobox(root, values=values, state='readonly')
combobox.place(x=100, y=30)
combobox.set('请点击选择:')
combobox.bind("<<ComboboxSelected>>", on_select)
text = "当前选择为:空"
label = tk.Label(root, text=text)
label.pack(side=tk.BOTTOM)
# 运行主循环
root.mainloop()
题外话
以上这些是我自己瞎写的变通代码,可能有更好的办法来实现这些功能,也有可能ttk模块本身就有这些功能,只是我没发现而已。另外:如果选择项不至是四个而是有很多,最好能在最前面设置两个选项,全部选择和取消全选,它们不参与进入已选项列表,点击它们只为在其它选项上标注对勾同时填满或清空已选项列表。感兴趣的朋友,可以自己动手实现这两个功能。
附件一
Combobox 英文帮助
附件二
tkinter.rar下载
tkinter全部控件的英文帮助全集下载地址: