Меню правой кнопки мыши на виджете Tkinter Treeview - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь отобразить всплывающее меню, уникальное для каждой строки, при щелчке правой кнопкой мыши по указанной строке c в таблице Treeview с TTK.

Я нашел здесь некоторый код , который делает то, что я ищу, но я не уверен, возможно ли, чтобы код различал щелчки правой кнопкой мыши в той или иной строке. Ниже мой полный код.

from tkinter import *
from tkinter import ttk
import sys

class Main:
    def __init__(self, root):
        pass

    def treeview_sort_column(self, tv, col, reverse):
        l = [(tv.set(k, col), k) for k in tv.get_children('')]
        try:
            l.sort(key=lambda t: int(t[0]), reverse=reverse)

        except ValueError:
            l.sort(reverse=reverse)

        for index, (val, k) in enumerate(l):
            tv.move(k, '', index)
        tv.heading(col, command=lambda: self.treeview_sort_column(tv, col, not reverse))

    def createWindow(self):
        self.popup = Menu(root, tearoff=0)
        self.popup.add_command(label="Shutdown") # , command=next) etc...
        self.popup.add_command(label="Edit Name")
        self.popup.add_separator()
        self.popup.add_command(label="Exit", command=lambda: self.closeWindow())

        Button(root, text="Exit", command=lambda: self.closeWindow()).pack()

        self.columns = ('Name', 'Age', 'Height')
        self.treeview = ttk.Treeview(root, columns=self.columns, show='headings')
        self.treeview.pack()
        self.treeview.insert('', 'end', values=("Josh", "18", "198"))
        self.treeview.insert('', 'end', values=("LJ", "36", "167"))
        self.treeview.insert('', 'end', values=("Klaudia", "12", "200"))
        self.treeview.insert('', 'end', values=("David", "74", "134"))

        self.treeview.bind("<Button-3>", self.do_popup)

        for col in self.columns:
            self.treeview.heading(col, text=col, command=lambda _col=col: \
                             self.treeview_sort_column(self.treeview, _col, False))

    def closeWindow(self):
        root.destroy()
        sys.exit()

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

root = Tk()
X = Main(root)
X.createWindow()

root.mainloop()

1 Ответ

1 голос
/ 05 февраля 2020

То, что вы ищете, это identify_row() метод древовидной структуры:

def do_popup(self, event):
    item = self.treeview.identify_row(event.y)
    print('clicked item:', item)
    try:
        self.popup.tk_popup(event.x_root, event.y_root, 0)
    finally:
        self.popup.grab_release()
...