所以我正在为自己创建一个项目,我不是一个优秀的程序员或任何东西,但我想在OptionMenu类中添加一些格式。在典型的tk中,您使用列表调用optionmenu,然后迭代该列表以生成各种.add_commands。即。
Button >>
Sword
Dagger
Axe
Great Sword
Great Axe
我想要做的是添加一个视觉分隔符(不是tk的默认水平规则),它将通过'武器类'区分这些项目,即
Button >>
1-Hand --
Sword
Dagger
Axe
2-Hand --
Great Sword
Great Axe
显然,分隔符不是可选择的选项。所以我想我可以写一个新类'myOptionMenu2'。我可以生成一个看似与tk的'OptionMenu'相同的小部件,但我不确定如何最好地实现实际菜单本身的绘图。
如果它继承了tk的(MenuButton)类(就像optionmenu那样),我假设(?)我可以编写一个新的'add_separator()'函数,该函数将执行tk的默认add-separator函数,我可以使用那只是插入标签小部件
或者我可以继承一个框架,并删除所有需要搞乱tk的菜单/ menubutton编码。但我不确定tk()究竟是如何实现菜单的“顶级”框架(没有边框,投影等)我查看了实际的tk.py但是我仍然不确定我是否理解它是如何完成的它
我的总体愿望就是调用它:
baseList = [
[1-hand,[sword,dagger,axe, ...]],
[2-hand,[Great Sword, Great Axe, ...]]
[ ..., [...]] #as needed
]
myOptionMenu2(master, a_parent_IntVar(), baseList)
然后让类绘制'按钮',解析列表并处理点击。 任何帮助将不胜感激。
答案 0 :(得分:0)
您在菜单上可以做的事情很少。您唯一的选项是tk菜单小部件提供的选项。例如,您无法在菜单中添加标签。但是,您可以添加无效的命令,该命令可用作标签。
还有一个问题,即一个选项菜单实际上并不属于一个类。在tk(Tkinter建立在其上),选项菜单只是一个辅助函数,它构成了menubutton和菜单。因此,根本无法覆盖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)
您可以像这样使用它:
baseList = [
["1-Hand", ["sword", "dagger", "axe"]],
["2-Hand", ["Great Sword", "Great Axe"]]
]
weaponVar = tk.StringVar()
om = myOptionMenu2(self, weaponVar, baseList)
您还可以选择制作级联菜单。因此,下拉列表将包含" 1-Hand"和" 2-Hand",每个人都会有各种选项的菜单。您可以从上面的代码开始,而不是创建命令,您可以创建级联项。
最后,你可以在问题的最后部分做你建议的事情,并从顶层框架(overrideredirect
标志设置为True)创建自己的菜单式对象。然后,您可以完全控制下拉列表的内容。例如,您可以嵌入画布并绘制您想要的任何内容。但是,此解决方案需要相当数量的代码。