Mam aplikację GUI Python-Tkinter, że próbowałem znaleźć jakiś sposób, aby dodać w niektórych funkcjonalności. Miałem nadzieję, że będzie drogi do kliknięcia prawym przyciskiem myszy przedmiot w obszarze Listbox App i wyświetli menu kontekstowe. Czy TKinter jest w stanie to osiągnąć? Czy będę lepiej wyglądać na GTK lub inny GUI-Toolkit?

28
tijko 18 sierpień 2012, 03:04

2 odpowiedzi

Najlepsza odpowiedź

Stworzyłbyś Menu Instancja i napisz funkcję, która wywołuje
jego {x0}} lub tk_popup() metoda.

Dokumentacja TKININ nie ma obecnie żadnych informacji o tk_popup().
.. Przeczytaj dokumentacja TK dla opisu lub źródła:

{x0}} W źródle TCl / TK:

::tk_popup --
This procedure pops up a menu and sets things up for traversing
the menu and its submenus.

Arguments:
menu  - Name of the menu to be popped up.
x, y  - Root coordinates at which to pop up the menu.  
entry - Index of a menu entry to center over (x,y).  
        If omitted or specified as {}, then menu's  
        upper-left corner goes at (x,y).  

tkinter/__init__.py W źródle Python:

def tk_popup(self, x, y, entry=""):
    """Post the menu at position X,Y with entry ENTRY."""
    self.tk.call('tk_popup', self._w, x, y, entry)

Skojarzysz funkcję wywołania menu kontekstowego z prawym przyciskiem myszy przez:
the_widget_clicked_on.bind("<Button-3>", your_function).

Jednak liczba powiązana z prawym przyciskiem myszy nie jest taka sama na każdej platformie.

{x0}} W źródle TCl / TK:

On Darwin/Aqua, buttons from left to right are 1,3,2.  
On Darwin/X11 with recent XQuartz as the X server, they are 1,2,3; 
other X servers may differ.

Oto przykład, który napisałem, który dodaje menu kontekstowe do listy:

import tkinter # Tkinter -> tkinter in Python 3

class FancyListbox(tkinter.Listbox):

    def __init__(self, parent, *args, **kwargs):
        tkinter.Listbox.__init__(self, parent, *args, **kwargs)

        self.popup_menu = tkinter.Menu(self, tearoff=0)
        self.popup_menu.add_command(label="Delete",
                                    command=self.delete_selected)
        self.popup_menu.add_command(label="Select All",
                                    command=self.select_all)

        self.bind("<Button-3>", self.popup) # Button-2 on Aqua

    def popup(self, event):
        try:
            self.popup_menu.tk_popup(event.x_root, event.y_root, 0)
        finally:
            self.popup_menu.grab_release()

    def delete_selected(self):
        for i in self.curselection()[::-1]:
            self.delete(i)

    def select_all(self):
        self.selection_set(0, 'end')


root = tkinter.Tk()
flb = FancyListbox(root, selectmode='multiple')
for n in range(10):
    flb.insert('end', n)
flb.pack()
root.mainloop()

Zaobserwowano użycie grab_release() ". Br / >. Jego efekt może nie być taki sam we wszystkich systemach.

38
Honest Abe 8 wrzesień 2019, 00:44
from tkinter import *
root=Tk()
root.geometry("500x400+200+100")

class Menu_Entry(Entry):
    def __init__(self,perant,*args,**kwargs):
        Entry.__init__(self,perant,*args,**kwargs)
        self.popup_menu=Menu(self,tearoff=0,background='#1c1b1a',fg='white',
                                     activebackground='#534c5c',
                             activeforeground='Yellow')
        self.popup_menu.add_command(label="Cut                     ",command=self.Cut,
                                    accelerator='Ctrl+V')
        self.popup_menu.add_command(label="Copy                    ",command=self.Copy,compound=LEFT,
                                    accelerator='Ctrl+C')
    
        self.popup_menu.add_command(label="Paste                   ",command=self.Paste,accelerator='Ctrl+V')
        self.popup_menu.add_separator()
        self.popup_menu.add_command(label="Select all",command=self.select_all,accelerator="Ctrl+A")
        self.popup_menu.add_command(label="Delete",command=self.delete_only,accelerator=" Delete")
        self.popup_menu.add_command(label="Delete all",command=self.delete_selected,accelerator="Ctrl+D")
        self.bind('<Button-3>',self.popup)
        self.bind("<Control-d>",self.delete_selected_with_e1)
        self.bind('<App>',self.popup)
        self.context_menu = Menu(self, tearoff=0)
        self.context_menu.add_command(label="Cut")
        self.context_menu.add_command(label="Copy")
        self.context_menu.add_command(label="Paste")
         
    def popup(self, event):
      try:
        self.popup_menu.tk_popup(event.x_root, event.y_root, 0)
      finally:
        self.popup_menu.grab_release()

    def Copy(self):
      self.event_generate('<<Copy>>')

    def Paste(self):
      self.event_generate('<<Paste>>')

    def Cut(self):
      self.event_generate('<<Cut>>')

    def delete_selected_with_e1(self,event):
      self.select_range(0, END)
      self.focus()
      self.event_generate("<Delete>")

    def delete_selected(self):
      self.select_range(0, END)
      self.focus()
      self.event_generate("<Delete>")

    def delete_only(self):
      self.event_generate("<BackSpace>")

    def select_all(self):
      self.select_range(0, END)
      self.focus()



ent=Menu_Entry(root)
ent.pack()


root.mainloop()
0
Xander L 15 lipiec 2020, 19:04