Python tkinter : Sorting the contents of an OptionMenu widget

标签 python sorting drop-down-menu tkinter optionmenu

大家好,提前致谢!

我用谷歌搜索了几乎所有的结果,但我还是想不通
它出来了,所以请至少给我指出一些方向!
我阅读了有关 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

关于Python tkinter : Sorting the contents of an OptionMenu widget,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473291/

相关文章:

linux - 使用 grep 查找两个大词表之间的差异

java - 按优先级队列排序整数

css - YouTube 是如何创建这种下拉效果的?

Python:检查两个变量之间相同类型的最佳方法

python - Flask 的请求和基本分析信息

python - Python 是否支持自由间距的正则表达式?

javascript - 基于彼此显示两个下拉列表的项目

python - 为什么 struct.pack 会抛出一个看似没有类型的异常?

javascript - 在 JavaScript 中对多维数组进行排序时行为不一致

html - CSS 下拉子菜单宽度