最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

tkinter自定義下拉多選框問(wèn)題

 更新時(shí)間:2023年01月28日 10:17:12   作者:奮斗中的打工人  
這篇文章主要介紹了tkinter自定義下拉多選框問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

使用tkinter實(shí)現(xiàn)下拉多選框

效果如圖:

1、選擇一些選項(xiàng)

2、全選選項(xiàng)

代碼如下:

import tkinter
 
from ComBoPicker import Combopicker
 
list = ["全選", "選項(xiàng)1", "選項(xiàng)2", "選項(xiàng)3", "選項(xiàng)4", "選項(xiàng)5", "選項(xiàng)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 = None
 
        self._values = values
 
        self._entry_wid = entry_wid
 
        self._sel_bg = selectbackground
        self._sel_fg = selectforeground
 
        self._act_bg = activebackground
        self._act_fg = activeforeground
 
        self._command = command
        self.index = 0
        ttk.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) #創(chuàng)建框架
        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 = values
        self.master = master
        self.activeforeground = activeforeground
        self.activebackground = activebackground
        self.selectbackground = selectbackground
        self.selectforeground = selectforeground
 
        if entryvar is not None:
            self.entry_var = entryvar
        else:
            self.entry_var = StringVar()
 
        entry_config = {}
        if entrywidth is not None:
            entry_config["width"] = entrywidth
 
 
 
 
        if entrystyle is not None:
            entry_config["style"] = entrystyle
 
        ttk.Entry.__init__(self, master, textvariable=self.entry_var, **entry_config, state="")
 
        self._is_menuoptions_visible = False
 
        self.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())
 
    @property
    def current_value(self):
        try:
            value = self.entry_var.get()
            return value
        except ValueError:
            return None
 
    @current_value.setter
    def 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()  # 清空選項(xiàng)
            else:
                value.remove(str(SELECTED))
                value.sort()
        else:
            if '全選' == str(SELECTED):
                value = self.values
            else:
                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)
        # 可以通過(guò)復(fù)選框的variable來(lái)讓勾選中或取消,但下面也行,問(wèn)題不大
        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 = True
 
    def hide_picker(self):
        if self._is_menuoptions_visible:
            self.picker_frame.place_forget()  # 不知道為什么這個(gè)方式在mac下不起作用,所以就直接銷毀這個(gè)控件
            # self.picker_frame.destroy()
 
        self._is_menuoptions_visible = False

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • python3+PyQt5實(shí)現(xiàn)自定義分?jǐn)?shù)滑塊部件

    python3+PyQt5實(shí)現(xiàn)自定義分?jǐn)?shù)滑塊部件

    這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)自定義分?jǐn)?shù)滑塊部件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python設(shè)置 matplotlib 正確顯示中文的四種方式

    python設(shè)置 matplotlib 正確顯示中文的四種方式

    這篇文章主要介紹了python設(shè)置 matplotlib 正確顯示中文的四種方式,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-05-05
  • Python實(shí)現(xiàn)的爬取百度貼吧圖片功能完整示例

    Python實(shí)現(xiàn)的爬取百度貼吧圖片功能完整示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的爬取百度貼吧圖片功能,結(jié)合完整實(shí)例形式分析了Python實(shí)現(xiàn)的百度貼吧圖片爬蟲(chóng)相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • 使用Djongo模塊在Django中使用MongoDB數(shù)據(jù)庫(kù)

    使用Djongo模塊在Django中使用MongoDB數(shù)據(jù)庫(kù)

    Django框架為我們提供了簡(jiǎn)潔方便的ORM模型供我們對(duì)數(shù)據(jù)庫(kù)進(jìn)行各種操作,但是這個(gè)“數(shù)據(jù)庫(kù)”卻并不包括NoSQL的典型——MongoDB。不少Django初學(xué)者也會(huì)到處詢問(wèn),如何才能在Django中使用MongoDB。本文將介紹使用Djongo來(lái)在Django中集成MongoDB數(shù)據(jù)庫(kù)
    2021-06-06
  • Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享

    Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享

    今天小編就為大家分享一篇Python實(shí)現(xiàn)爬蟲(chóng)設(shè)置代理IP和偽裝成瀏覽器的方法分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Python必備shelve與dbm本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具

    Python必備shelve與dbm本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具

    當(dāng)涉及存儲(chǔ)大量數(shù)據(jù)并且需要高效訪問(wèn)時(shí),shelve和dbm模塊是Python中用于本地持久化存儲(chǔ)數(shù)據(jù)的兩個(gè)強(qiáng)大工具,它們?cè)试S開(kāi)發(fā)人員以鍵值對(duì)的形式存儲(chǔ)數(shù)據(jù),并支持快速的檢索和更新操作,在本文將深入探討這兩個(gè)模塊,展示它們的優(yōu)勢(shì)和應(yīng)用場(chǎng)景
    2024-01-01
  • Python上下文管理器用法及實(shí)例解析

    Python上下文管理器用法及實(shí)例解析

    這篇文章主要介紹了Python上下文管理器用法及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 一篇文章帶你了解Python中的裝飾器

    一篇文章帶你了解Python中的裝飾器

    Python中的裝飾器是你進(jìn)入Python大門的一道坎,不管你跨不跨過(guò)去它都在那里,下面這篇文章主要給大家介紹了關(guān)于Python中裝飾器的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • Python使用matplotlib繪制圖形大全(曲線圖、條形圖、餅圖等)

    Python使用matplotlib繪制圖形大全(曲線圖、條形圖、餅圖等)

    matplotlib 是一個(gè)用于創(chuàng)建靜態(tài)、動(dòng)態(tài)和交互式可視化圖形的 Python 庫(kù),它被廣泛用于數(shù)據(jù)可視化,并且可以與多種操作系統(tǒng)和圖形后端一起工作,本文給大家介紹了Python使用matplotlib繪制圖形大全,需要的朋友可以參考下
    2024-06-06
  • Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能

    本篇文章主要介紹了Python 正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能的示例。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04

最新評(píng)論

涞源县| 图木舒克市| 赣榆县| 板桥市| 景德镇市| 宁德市| 额尔古纳市| 临沭县| 宁波市| 塘沽区| 日照市| 常德市| 印江| 芜湖市| 潞西市| 沂水县| 宁乡县| 中西区| 长治市| 庄浪县| 牟定县| 民丰县| 乐业县| 湖北省| 朝阳县| 丰宁| 通州市| 宁武县| 得荣县| 宁国市| 吴旗县| 谢通门县| 张家港市| 黎城县| 梁河县| 太仓市| 汉中市| 阿城市| 泸西县| 明星| 娄底市|