Skip to main content
 首页 » 编程设计

Python tkinter : Sorting the contents of an OptionMenu widget

2025年05月04日10findumars

大家好,提前致谢!

我用谷歌搜索了几乎所有的结果,但我还是想不通
它出来了,所以请至少给我指出一些方向!
我阅读了有关 pmw 的信息,但我想看看是否有任何方法可以先使用 tkinter 来完成。

我正在为 DnD 掷骰子编写一个足够简单的程序,并且我有一个 OptionMenu
包含某人需要玩的一些骰子。我还有一个用于输入的输入字段
我的默认选项中不包含的模具。我的问题是,即使新的
选项添加成功,选项未排序。

我在某个时候通过在添加新选项时销毁 OptionMenu 来解决它,
对我的列表进行排序,然后从头开始重建 OptionMenu,但我使用的是
place manager method 当时我不得不重写程序,因为我有
一些分辨率问题。我现在正在使用包管理器并销毁/重建
除非我想“重新”打包我所有的小部件或为它们制作专属标签,否则这不是一个选择!

这是我的代码的工作示例:

from tkinter import * 
 
class DropdownExample(Frame): 
    def __init__(self, master = None): 
        Frame.__init__(self, master) 
        self.pack(fill = 'both', expand = True) 
 
        # Add Option Button 
        self.addOptBtn = Button(self, text = "Add Option", command = self.add_option) 
 
        # Option Input Field 
        self.newOpt = IntVar() 
        self.newOpt.set("Type a number") 
 
        self.optIn = Entry(self) 
        self.optIn['textvariable'] = self.newOpt 
 
        # Dropdown Menu 
        self.myOptions = [0, 1, 2] 
 
        self.selOpt = IntVar() 
        self.selOpt.set("Options") 
 
        self.optMenu = OptionMenu(self, self.selOpt, *self.myOptions) 
 
        # Positioning 
        self.addOptBtn.pack(side = 'left', padx = 5) 
        self.optIn.pack(side = 'left', padx = 5) 
        self.optMenu.pack(side = 'left', padx = 5) 
 
 
    def add_option(self): 
        self.numToAdd = "" 
        self.counter = 0 
 
        try: 
            self.numToAdd = int(self.optIn.get())                                           # Integer validation 
 
            while self.counter < len(self.myOptions):                                       # Comparison loop & error handling 
                if self.numToAdd == self.myOptions[self.counter]: 
                    print("Already exists!")                     
                    break; 
 
                elif self.numToAdd < 0: 
                    print("No less than 0!") 
                    break; 
 
                elif self.counter < len(self.myOptions)-1: 
                    self.counter += 1 
 
                else:                                                                       # Dropdown menu option addition 
                    self.myOptions.append(self.numToAdd) 
                    self.myOptions.sort() 
 
                    self.optMenu['menu'].add_command(label = self.numToAdd) 
 
                    self.selOpt.set(self.numToAdd) 
 
                    print("Added succesfully!") 
 
                    self.counter += 2 
 
        except ValueError: 
            print("Type ONLY numbers!") 
 
 
def runme(): 
    app = DropdownExample() 
    app.master.title("Dropdown Menu Example") 
    app.master.resizable(0, 0) 
    app.mainloop() 
 
runme() 

我在 Windows 7 上使用 Python 3.3

请您参考如下方法:

有一组insert_something() Menu 中的方法。您必须在每次插入时对列表进行排序(bisect 模块)。

from tkinter import * 
import bisect 
 
... 
                else:                                                                       # Dropdown menu option addition 
                    index = bisect.bisect(self.myOptions, self.numToAdd) 
                    self.myOptions.insert(index, self.numToAdd) 
                    self.optMenu['menu'].insert_command(index, label=self.numToAdd) 
                    self.selOpt.set(self.numToAdd) 
                    print("Added succesfully!", self.myOptions) 
                    self.counter += 2