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 ttkdef 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 ttkclass 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 ttkclass 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 ttkdef 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 comboboxcombobox.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