创建一个新的tk OptionMenu类以添加所需的格式

2024-06-25 23:21:57 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我正在为自己做一个项目,我不是一个优秀的程序员或者其他什么,但是我想给OptionMenu类添加一些格式。在典型的tk中,您用一个列表调用optionmenu,然后它遍历该列表,生成各种.add_命令。i、 e

Button >>
  Sword
  Dagger
  Axe
  Great Sword
  Great Axe

不过,我想做的是添加一个可视分隔符(不是tk默认的水平规则),通过一个“武器类”来区分这些项目

^{pr2}$

很明显,分隔符不是可选的。所以我想我可以写一个新的类“myOptionMenu2”。我可以生成一个与tk的“OptionMenu”完全相同的小部件,但我不确定如何最好地实现实际菜单本身的绘制。在

如果它继承了tk的(MenuButton)类(像optionmenu那样),我假设是(?)我可以编写一个新的'add_separator()'函数,它将步进tk的默认add separator函数,我可以使用它来插入标签小部件

或者,我可以继承一个框架,省去了所有对tk菜单/菜单按钮编码的麻烦。但我不确定tk()是如何实现菜单的“顶层”框架的(没有边框、阴影等等),我在实际中看到的tk.py公司但我还是不确定我能理解它是如何实现的。在

我的总体愿望是这样引用它:

baseList = [
           [1-hand,[sword,dagger,axe, ...]],
           [2-hand,[Great Sword, Great Axe, ...]]
           [ ..., [...]] #as needed
           ]


myOptionMenu2(master, a_parent_IntVar(), baseList)

然后让类绘制“按钮”,解析列表并处理单击。 任何帮助都将不胜感激。在


Tags: 项目add列表部件菜单绘制tk分隔符
1条回答
网友
1楼 · 发布于 2024-06-25 23:21:57

你在菜单上能做的事几乎没有回旋余地。您唯一的选项是tk菜单小部件提供的选项。例如,不能在菜单中添加标签。但是,您可以添加一个不执行任何操作的命令,它可以用作标签。在

还有一个问题是optionmenu实际上并不是一个隐藏的类。在tk(Tkinter是基于它构建的)中,option menu只是一个辅助函数,它构造了一个menubutton和一个menu。因此,根本没有办法重写add_separator方法。在

也就是说,编写自己的类来创建menubutton和相关联的菜单是非常容易的。然后,您可以执行标准小部件允许您做的任何事情,例如使用不起作用的命令作为标签。在

下面是一个简单的例子:

class myOptionMenu2(tk.Menubutton):
    def __init__(self, parent, var, data):
        tk.Menubutton.__init__(self, parent, borderwidth=1, relief="raised",
                               textvariable=var, indicatoron=True)
        self.menu = tk.Menu(self, tearoff=False)
        self.configure(menu=self.menu)

        default = None
        for (category, weapons) in data:
            self.menu.add_command(label=category, command=None)
            if default is None:
                default = weapons[0]
                var.set(default)

            for weapon in weapons:
                self.menu.add_radiobutton(indicatoron=True, value=weapon,
                    label=weapon, variable=var)

你可以这样使用它:

^{pr2}$

你也可以选择制作级联菜单。因此,下拉列表中会有“1-Hand”和“2-Hand”的条目,并且每个条目都有一个用于各种选项的菜单。您可以从上面的代码开始,而不是生成命令,您可以创建级联项。在

最后,您可以按照问题最后一部分中的建议,在顶层框架(将overrideredirect标志设置为True)中创建自己的菜单式对象。然后,您可以完全控制下拉列表的外观。例如,你可以嵌入一个画布,然后画出你想要的任何东西。不过,这个解决方案需要相当数量的代码。在

相关问题 更多 >