lawsie / guizero

A Python 3 library to allow learners to quickly and easily create GUIs.
https://lawsie.github.io/guizero
BSD 3-Clause "New" or "Revised" License
402 stars 81 forks source link

Create right-click context menu for copy-paste with app.add_tk_widget #464

Closed frenchfaso closed 1 year ago

frenchfaso commented 1 year ago

Hy there, I'm trying to add a context menu to a simple app with this code:

from guizero import App, MenuBar, etc..
from tkinter import Menu

# my app code..

context_menu = Menu(tearoff = 0)
context_menu.add_command(label ="Paste")
app.add_tk_widget(context_menu)

but I get this error:

tkinter.TclError: can't pack ".!menu2": it's a top-level window

frenchfaso commented 1 year ago

I found a solution, adding the menu widget to a Box widget instead of the root app widget seems to work:

from guizero import App, Box, TextBox #etc..
from tkinter import Menu

# This function gets called when you right-click on the 'text_box' TextBox
def show_context_menu(event):
    try:
        context_menu.tk_popup(event.display_x, event.display_y)
    finally:
        context_menu.grab_release()

# This function gets called when you click on "Paste" on the context-menu
def paste_data():
    text_box.tk.event_generate("<<Paste>>")

app = App(title="My Awesome Guizero App")
box = Box(app, width="fill")
text_box = TextBox(box, width="fill")
text_box.when_right_button_pressed=show_context_menu
context_menu = Menu(box.tk, tearoff = 0)
context_menu.add_command(label ="Paste", command=paste_data)
app.display()

image