如何删除tkinter菜单分隔符

时间:2020-07-03 13:06:58

标签: python 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)

如果有人可以帮助请帮助。 也希望在这场持续的大流行之时大家都平安无事。

2 个答案:

答案 0 :(得分:1)

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()

答案 1 :(得分:1)

您可以使用删除菜单上其他内容的方式删除分隔符-将分隔符的索引传递给delete方法。

例如,这将显示一个菜单,其中两个项目之间用分隔符分隔:

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

screenshot with separator

这将删除分隔符:

exampleMenu.delete(1)

screenshot after deleting separator

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

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

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