Меню правой кнопки мыши (контекстное меню) с использованием PyGTK

Итак, я все еще новичок в Python и учился пару месяцев, но я пытаюсь понять одну вещь: скажем, у вас есть базовое окно ...

#!/usr/bin/env python

import sys, os
import pygtk, gtk, gobject

class app:

   def __init__(self):
    window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    window.set_title("TestApp")
    window.set_default_size(320, 240)
    window.connect("destroy", gtk.main_quit)
    window.show_all()

app()
gtk.main()

Я хочу щелкнуть правой кнопкой мыши внутри этого окна, и появится всплывающее меню, такое как предупреждение, копирование, выход, все, что я хочу отложить.

Как мне этого добиться?


person Michael Schwartz    schedule 07.07.2011    source источник
comment
Прежде всего, вы должны прочитать, как GTK использует события. Начните с того, что щелкните правой кнопкой мыши, чтобы что-то сделать, а затем прочитайте, как создавать контекстные меню. Я никогда не использовал PyGTK или GTK, но, вероятно, для этого есть виджет.   -  person JAB    schedule 08.07.2011


Ответы (1)


Пример этого можно найти на http://www.pygtk.org/pygtk2tutorial/sec-ManualMenuExample.html

Он показывает вам, как создать меню, прикрепить его к строке меню, а также прослушать событие нажатия кнопки мыши и вызвать то же самое меню, которое было создано.

Я думаю, это то, что вам нужно.

РЕДАКТИРОВАТЬ: (добавлено дополнительное объяснение, чтобы показать, как реагировать только на события правой кнопки мыши)

Обобщить.

Создайте виджет для прослушивания событий мыши. В данном случае это кнопка.

button = gtk.Button("A Button")

Создать меню

menu = gtk.Menu()

Наполните его пунктами меню

menu_item = gtk.MenuItem("A menu item")
menu.append(menu_item)
menu_item.show()

Заставьте виджет прослушивать события нажатия мыши, прикрепляя к нему меню.

button.connect_object("event", self.button_press, menu)

Затем определите метод, обрабатывающий эти события. Как указано в примере в ссылке, виджет, переданный этому методу, - это меню, которое вы хотите вывести, а не виджет, который отслеживает эти события.

def button_press(self, widget, event):
    if event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
        #make widget popup
        widget.popup(None, None, None, event.button, event.time)
        pass

Вы увидите, что оператор if проверяет, была ли нажата кнопка, если это правда, он затем проверяет, какая из кнопок была нажата. Event.button - это целочисленное значение, представляющее, какая кнопка мыши была нажата. Итак, 1 - левая кнопка, 2 - средняя и 3 - правая кнопка мыши. Проверяя, установлено ли для event.button значение 3, вы отвечаете только на события нажатия правой кнопки мыши.

person James Hurford    schedule 07.07.2011
comment
Спасибо! Это почти именно то, что я пытался выяснить. Единственная проблема в том, что меню отображается как при левом клике, так и при правом. В котором я не хочу, чтобы он отображался при щелчке левой кнопкой мыши, но я смогу это исправить. Спасибо! - person Michael Schwartz; 08.07.2011
comment
@ mikethedj4: не могли бы вы сказать, удалось ли / как вам определить щелчок, запускающий всплывающее меню? Спасибо. - person neydroydrec; 23.08.2011
comment
@Benjamin: Думаю, теперь ответ должен охватывать то, что вам нужно. - person James Hurford; 24.08.2011
comment
Да, и прошу прощения за длинный ответ. - person Michael Schwartz; 30.08.2011
comment
popup прототип теперь выглядит как popup(parent_menu_shell, parent_menu_item, func, data, button, activate_time). - person jackw11111; 11.09.2020
comment
Вполне может быть правдой, но этот ответ предназначен для PyGTK, а не для последнего PyGObject. - person James Hurford; 12.09.2020