使用tkinter实现下拉多选框

效果如图:

1、选择一些选项:

2、全选选项:

代码如下:

import tkinterfrom ComBoPicker import Combopickerlist = ["全选", "选项1", "选项2", "选项3", "选项4", "选项5", "选项6"]
root = tkinter.Tk()
co = Combopicker(root, values=list)
co.pack()
root.geometry("800x600")root.mainloop()

ComBoPicker.py代码:

'''自定义多选下拉列表
'''
import tkinter.ttk as ttk
from tkinter import *class Picker(ttk.Frame):#选择器def __init__(self, master=None, activebackground='#b1dcfb', values=[], entry_wid=None, activeforeground='black',selectbackground='#003eff', selectforeground='white', command=None, borderwidth=1, relief="solid"):self._selected_item = Noneself._values = valuesself._entry_wid = entry_widself._sel_bg = selectbackgroundself._sel_fg = selectforegroundself._act_bg = activebackgroundself._act_fg = activeforegroundself._command = commandself.index = 0ttk.Frame.__init__(self, master, borderwidth=borderwidth, height=10, relief=relief)self.bind("<FocusIn>", lambda event: self.event_generate('<<PickerFocusIn>>'))self.bind("<FocusOut>", lambda event: self.event_generate('<<PickerFocusOut>>'))F = LabelFrame(self)F.pack(fill='x')self.canvas = Canvas(F, scrollregion=(0, 0, 500, (len(self._values) * 23)))vbar = Scrollbar(F, orient=VERTICAL)vbar.pack(side=RIGHT, fill=Y)frame = Frame(self.canvas) #创建框架vbar.config(command=self.canvas.yview)sbar2 = Scrollbar(F, orient=HORIZONTAL)sbar2.pack(side=BOTTOM, fill=X)sbar2.config(command=self.canvas.yview)# self.canvas.pack(side='left',fill='x',expand=True)self.canvas.create_window((0, 0,), window=frame, anchor='nw', tags='frame')self.canvas.config(highlightthickness=0)  # 去掉选中边框vbar.config(command=self.canvas.yview)sbar2.config(command=self.canvas.xview)self.canvas.config(width=300, height=150)self.canvas.config(yscrollcommand=vbar.set,xscrollcommand=sbar2.set)# self.canvas.config(scrollregion=self.canvas.bbox('all'))# self._font = tkFont.Font()self.dict_checkbutton = {}self.dict_checkbutton_var = {}self.dict_intvar_item = {}for index, item in enumerate(self._values):self.dict_intvar_item[item] = IntVar()self.dict_checkbutton[item] = ttk.Checkbutton(frame, text=item, variable=self.dict_intvar_item[item],command=lambda ITEM=item: self._command(ITEM))self.dict_checkbutton[item].grid(row=index, column=0, sticky=NSEW, padx=5)self.dict_intvar_item[item].set(0)if item in self._entry_wid.get().split(','):self.dict_intvar_item[item].set(1)self.canvas.pack(side=LEFT, expand=True, fill=BOTH)self.canvas.bind("<MouseWheel>", self.processWheel)frame.bind("<MouseWheel>", self.processWheel)for i in self.dict_checkbutton:self.dict_checkbutton[i].bind("<MouseWheel>", self.processWheel)self.bind("<MouseWheel>", self.processWheel)def processWheel(self, event):a = int(-(event.delta))if a > 0:self.canvas.yview_scroll(1, UNITS)else:self.canvas.yview_scroll(-1, UNITS)class Combopicker(ttk.Combobox, Picker):def __init__(self, master, values=[], entryvar=None, entrywidth=None, entrystyle=None, onselect=None,activebackground='#ef476f', activeforeground='red', selectbackground='#ffd166',selectforeground='green', borderwidth=1, relief="solid"):self.values = valuesself.master = masterself.activeforeground = activeforegroundself.activebackground = activebackgroundself.selectbackground = selectbackgroundself.selectforeground = selectforegroundif entryvar is not None:self.entry_var = entryvarelse:self.entry_var = StringVar()entry_config = {}if entrywidth is not None:entry_config["width"] = entrywidthif entrystyle is not None:entry_config["style"] = entrystylettk.Entry.__init__(self, master, textvariable=self.entry_var, **entry_config, state="")self._is_menuoptions_visible = Falseself.picker_frame = Picker(self.winfo_toplevel(), values=values, entry_wid=self.entry_var,activebackground=activebackground, activeforeground=activeforeground,selectbackground=selectbackground, selectforeground=selectforeground,command=self._on_selected_check)self.bind_all("<1>", self._on_click, "+")self.bind("<Escape>", lambda event: self.hide_picker())@propertydef current_value(self):try:value = self.entry_var.get()return valueexcept ValueError:return None@current_value.setterdef current_value(self, INDEX):self.entry_var.set(self.values.index(INDEX))def _on_selected_check(self, SELECTED):value = []if self.entry_var.get() != "" and self.entry_var.get() != None:temp_value = self.entry_var.get()value = temp_value.split(",")if str(SELECTED) in value:if '全选' == str(SELECTED):value.clear()  # 清空选项else:value.remove(str(SELECTED))value.sort()else:if '全选' == str(SELECTED):value = self.valueselse:value.append(str(SELECTED))value.sort()temp_value = ""for index, item in enumerate(value):if item != "":if index != 0:temp_value += ","temp_value += str(item)self.entry_var.set(temp_value)# 可以通过复选框的variable来让勾选中或取消,但下面也行,问题不大if '全选' == str(SELECTED):self.hide_picker()self.show_picker()def _on_click(self, event):str_widget = str(event.widget)if str_widget == str(self):if not self._is_menuoptions_visible:self.show_picker()else:if not str_widget.startswith(str(self.picker_frame)) and self._is_menuoptions_visible:self.hide_picker()def show_picker(self):if not self._is_menuoptions_visible:self.picker_frame = Picker(self.winfo_toplevel(), values=self.values, entry_wid=self.entry_var,activebackground=self.activebackground,activeforeground=self.activeforeground, selectbackground=self.selectbackground,selectforeground=self.selectforeground, command=self._on_selected_check)self.bind_all("<1>", self._on_click, "+")self.bind("<Escape>", lambda event: self.hide_picker())self.picker_frame.lift()self.picker_frame.place(in_=self, relx=0, rely=1, relwidth=1)self._is_menuoptions_visible = Truedef hide_picker(self):if self._is_menuoptions_visible:self.picker_frame.place_forget()  # 不知道为什么这个方式在mac下不起作用,所以就直接销毁这个控件# self.picker_frame.destroy()self._is_menuoptions_visible = False

tkinter自定义下拉多选框相关推荐

  1. el select 清空_解决element-ui里的下拉多选框 el-select 时,默认值不可删除问题

    这是一个项目中常见的需求,el-select 为下拉多选,默认值不可删除,或者指定值不可删除. 实现效果: el-select 如下源码中 tag closable 属性为 el-select 的 d ...

  2. flask-wtf优雅实现下拉多选框

    flask-wtf实现下拉多选框 一般实现 一般情况下,我们用flask-wtf来实现下拉多选框的时候,大概是这样子操作的 定义Form类 forms.py from flask_wtf import ...

  3. html 下拉多选框代码,js实现下拉复选框效果(代码实例)

    本章给大家带来用js实现下拉复选框效果(代码实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 先看看效果: 下面我们看看代码: HTML代码: HTML CSS JavaScri ...

  4. Java - EasyExcel结合VBA实现Excel导出下拉多选框与单选框

    需求:导出一个带有单选下拉框与多选下拉框的excel模板 思路:1.使用VBA脚本设置带有多选框的模板2.使用EasyExcel给字段填充单选下拉框数据源 一.创建带有多选框宏的excel模板 *.x ...

  5. easyui下拉多选框的创建、获取值、赋值

    EasyUI后台往前端赋值的时候要用JSON格式,不然容易引起特殊符号导致的不显示 easyui下拉多选Demo: <select class="easyui-combobox&quo ...

  6. DevExpress下拉多选框 CheckComboboxEdit、CheckedListBoxControl

    CheckComboboxEdit //清空项             checkedComboBoxEdit1.Properties.Items.Clear(); //自定义数组           ...

  7. php下拉多选框,excel下拉框多选打勾的设置方法

    excel下拉框多选打勾的设置方法 一.显示"开发工具"选项卡.打开Excel2010,点击左上方"文件"图标.点击"选项",弹出" ...

  8. 在 jquery repeater 中添加设置日期,下拉,复选框等控件

    JQueryElement 更新到了 3.5.1, 今天给大家主要讲下如何在 Repeater 的模板中添加设置一些控件. 由于精力有限, 不能在多个博客中保证文章的同步, 可在如下地址查看最新内容, ...

  9. java 下拉复选框_JAVA个人小程序GUI篇-收银(标签、按钮、复选框、下拉标、文本域、表格······)...

    1 //导入包 2 importjava.awt.BorderLayout;3 importjava.awt.EventQueue;4 5 importjavax.swing.JFrame;6 imp ...

最新文章

  1. 24个必须掌握的数据库面试问题~
  2. log4j2_使用log4j监视和筛选应用程序日志到邮件
  3. android10 内部存储,Android的内部存储和外部存储
  4. javac手动编译servlet
  5. webjs求数组的中位数‘_算法:一道常见的数组题,但很多人却写不出来(JAVA)...
  6. ElasticSearch破解x-pack 6.0+和更新许可证(License)
  7. 开源改变世界概括_为什么任何开源社区都很难改变
  8. BZOJ 1006 神奇的国度(弦图的染色数)
  9. python中组合数据类型、函数和代码复用的难点_Python电子教案5-2 函数和代码复用...
  10. 面向对象三大特征之多态——Java笔记(七)
  11. 免费视频压缩软件实现压缩视频不损画质的技巧
  12. 设计模式:个人理解关于代理和委托模式的一点区别
  13. php去除字符串中的HTML标签
  14. win10查询计算机显卡,windows10系统电脑查看显卡型号的两种方法
  15. 大恒相机(MER)驱动配置注意事项:
  16. Html制作知识库管理系统,知识库管理系统(源码+数据)
  17. 机器自动翻译古文拼音 - 十大宋词 - 声声慢 寻寻觅觅 李清照
  18. 很短,很文艺,很唯美。这才是真正的英文经典
  19. 微信表情图像代表什么意思_微信里的表情每个头像代表什么意思
  20. Layui动态渲染下拉框

热门文章

  1. Excel中如何快速输入☑和☒
  2. 自媒体助手软件开发需具备哪些功能?
  3. c#WinForm使用OpencvSharp4实现简易抓边
  4. LiveNVR监控摄像头Onvif/RTSP接入流媒体平台如何配置默认用户账户及用户密码
  5. 报表工具使用教程-FineReport决策报表导出Plus
  6. pe下找不到ssd硬盘_进入pe后找不到固态硬盘怎么解决
  7. 联诚发龙显P1.25系列LED大屏亮相宝安区区政府会议室
  8. SQL FULL OUTER JOIN
  9. 算法 - 求一个数组的最长递减子序列(C++)
  10. 黄河金岸诗词大赛获奖作品选登(1)