如何删除 tkinter 菜单分隔符

how to delete a tkinter menu separator

我正在做一个项目,如果打开一个模式,它会显示额外的一批选项,我想将它们与其他选项分开,所以我使用了 -:

add_separator()

python tkinter 的功能。但问题是,由于此菜单仅在该模式打开时呈现,所以我不能直接将这些东西添加到其中。

所以我有一个函数,在菜单打开时被称为后置命令。这是我渲染内容的功能。因此,如果我一次又一次地打开我的菜单,分隔符会堆叠在顶部并且不会被删除。

我已经能够弄清楚如何删除菜单的其他组件,但不是这个。 我也有一个想法,我在初始化菜单时添加了分隔符,但在这种情况下,即使模式关闭,它也会在菜单末尾显示一个分隔符。

编辑: 只是通知一下,我选择索引的问题是选项的数量有时不同。由于我正在做的是一个笔记程序,所以这是我只存储过去使用过的两支笔的笔历史的部分。

另外总推荐两支笔。这导致有时有 3 个,有时有 4 个笔选择选项。

所以如果我按照4项考虑索引,当只有3项时会报错

但是如果我按照3条来考虑,那么4条的时候就不好看了。 这是渲染笔历史的代码。这里有些事情不清楚,因为这里没有提交整个代码 -:

def show_pen_history() :
global pen_history, save_pen_history, pen_history_labels, pen_history_cascade

for j in pen_history_labels :
    m1.delete(j)
try :
    m1.delete(pen_history_cascade)
except :
    pass

pen_history_labels.clear()

if save_pen_history :
    k = 0
    for i in list(pen_history.keys()) :
        pen_definition = i + ' || size: ' + str(pen_history[i]['size']) + '| color: ' + pen_history[i]['color'] + '|'
        if pen_history[i]['size'] == pen_size and pen_history[i]['color'] == pen_color :
            pen_definition = pen_definition + '(currently selected)'
        elif pen_history[i]['type'] == 'recommended' :
            pen_definition = pen_definition + ' (recommended)'
        pen_history_labels.append(pen_definition)
        k += 1
    
    pen_history_cascade = 'Pen History'
    m1.add_cascade(label = 'Pen History')
    
    if len(pen_history) > 1 :
        m1.add_command(label = pen_history_labels[0], command = lambda : set_pen(0))
        m1.add_command(label = pen_history_labels[1], command = lambda : set_pen(1))
    if len(pen_history) > 2 :
        m1.add_command(label = pen_history_labels[2], command = lambda : set_pen(2))
    if len(pen_history) > 3 :
        m1.add_command(label = pen_history_labels[3], command = lambda : set_pen(3))
return

对于菜单部分我也是这样做的-:

m1 = tkinter.Menu(menu, tearoff = 0, postcommand = show_pen_history)

如果有人可以帮助请帮助。 也希望你们在这场持续的大流行期间都安全。

Menu 有一个名为 delete 的属性,您只需要将索引参数传递给它即可。

import tkinter as tk

def remove_the_sep():
    sub_menu_bar.delete(1)

app = tk.Tk()
app.geometry('100x100')
menubar = tk.Menu(app, tearoff=False)
sub_menu_bar = tk.Menu(menubar, tearoff=False)
sub_menu_bar.add_command(label="Option1")
sub_menu_bar.add_separator()
sub_menu_bar.add_command(label="Option2")
menubar.add_cascade(menu=sub_menu_bar, label="menu")
app.config(menu=menubar)

tk.Button(app, text="Remove", command=remove_the_sep).pack()

app.mainloop()

您可以像删除菜单上的任何其他内容一样删除分隔符 - 将分隔符的索引传递给 delete 方法。

例如,这将显示一个菜单,其中包含两个由分隔符分隔的项目:

exampleMenu = tk.Menu(menubar)
exampleMenu.add_command(label="foo")
exampleMenu.add_separator()
exampleMenu.add_command(label="bar")
exampleMenu.add_command(label="baz")

这将删除分隔符:

exampleMenu.delete(1)

如果不知道分隔符的索引,可以使用type方法获取每个索引的类型。您可以使用 .index('end') 获取最后一个项目的数字索引,以便迭代项目。

例如,这将删除找到的第一个分隔符:

end = int(exampleMenu.index("end"))
for index in range(end):
    if exampleMenu.type(index) == "separator":
        exampleMenu.delete(index)
        break