У меня действующий код

from tkinter import *

top = Tk()

mb=  Menubutton ( top, text="CheckComboBox", relief=RAISED )
mb.grid()
mb.menu  =  Menu ( mb, tearoff = 0 )
mb["menu"]  =  mb.menu

Item0 = IntVar()
Item1 = IntVar()
Item2 = IntVar()

mb.menu.add_checkbutton ( label="Item0", variable=Item0)
mb.menu.add_checkbutton ( label="Item1", variable=Item1)
mb.menu.add_checkbutton ( label="Item2", variable=Item2)

mb.pack()
top.mainloop()

Когда я нажимаю «CheckComboBox», я вижу список элементов. Затем я нажимаю «Item1» и список элементов, и мне приходится нажимать «CheckComboBox» много раз, если я хочу выбрать несколько элементов.

Я хочу, чтобы «список раз» не пропадал после нажатия на элемент.

enter image description here

2
swor 25 Фев 2021 в 00:35

2 ответа

Лучший ответ

Решил это:

import tkinter as tk

root = tk.Tk()
root.geometry("%ix%i" % (50, 50))

def raise_menubutton(*args):
    # Open the menu again. Taken from:
    # https://stackoverflow.com/a/38676204/11106801
    menubutton.menu.post(menubutton.winfo_rootx(), 
                menubutton.winfo_rooty() + menubutton.winfo_height())

menubutton = tk.Menubutton(root, text="CheckComboBox", relief="raised")
menubutton.grid()
menubutton.menu = tk.Menu(menubutton, tearoff=0)
menubutton["menu"] = menubutton.menu

menubutton.menu.bind("<Button-1>", raise_menubutton)

Item0 = tk.IntVar()
Item1 = tk.IntVar()
Item2 = tk.IntVar()

# Bind to variables changing
Item0.trace("w", raise_menubutton)
Item1.trace("w", raise_menubutton)
Item2.trace("w", raise_menubutton)

menubutton.menu.add_checkbutton(label="Item0", variable=Item0)
menubutton.menu.add_checkbutton(label="Item1", variable=Item1)
menubutton.menu.add_checkbutton(label="Item2", variable=Item2)

menubutton.pack()

root.mainloop()

По крайней мере, работает на Windows.

1
TheLizzard 24 Фев 2021 в 22:14

Такое поведение меню определяется диспетчером ОС / окон, и tkinter не предоставляет никакого способа его контролировать.

0
Bryan Oakley 24 Фев 2021 в 22:13