J'ai un code valide

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

Lorsque je clique sur "CheckComboBox", je vois la liste des éléments. Ensuite, je clique sur "Item1" et la liste des éléments disparaît et je dois cliquer sur "CheckComboBox" plusieurs fois si je veux choisir quelques éléments.

Je veux que la "liste des heures" ne disparaisse pas après avoir cliqué sur l'élément.

enter image description here

2
swor 25 févr. 2021 à 00:35

2 réponses

Meilleure réponse

Résolu:

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

Fonctionne au moins sur Windows.

1
TheLizzard 24 févr. 2021 à 22:14

Un comportement de menu comme celui-ci est défini par le gestionnaire du système d'exploitation / de fenêtres, et tkinter ne fournit aucun moyen de le contrôler.

0
Bryan Oakley 24 févr. 2021 à 22:13