Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

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

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

请注意,某些控件在两个模块中都存在(如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)

如图所示:

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

完整代码如下:

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

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

以上插图的代码如下:

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

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

自定义类 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本身不支持多项选择,变通方法:引入一个列表,用于存放已选项,奇数次选择一个项则存入列表、反之偶数次选择则移除。

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

代码如下:

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

这样子可能更像一个多项选择框,如下图:

Python tkinter控件全集之组合选择框 ttk.ComboBox-LMLPHP

代码如下:

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全部控件的英文帮助全集下载地址:

 https://download.csdn.net/download/boysoft2002/88640897

12-21 00:39