Пункт меню Python GTK для активации занимает два клика - PullRequest
1 голос
/ 13 ноября 2010

Хорошо, во-первых, я не совсем уверен, как сформулировать мою проблему.Это может быть недостаток сна, или быть довольно новым для Python и GTK, или их комбинация.Чтобы помочь мне, я написал полный простой пример с помощью учебных пособий zetcode.com.

Проблема, как я могу сказать, заключается в пункте меню - без подменю -занимает два клика для активации.В отличие от пункта подменю, активирующегося одним кликом.Это слегка раздражает (и может запутать будущих пользователей), но не вызывает проблем с моим приложением.Однако я хотел бы решить эту проблему.

Мое настоящее приложение создается с помощью Ubuntu Quickly - но проблема существует при использовании gtkBuilder или direct-gtk.

Вот простой пример:

#!/usr/bin/python

import gtk


class MenuTest(gtk.Window):

    def __init__(self):
        super(MenuTest, self).__init__()

        self.set_title("Menus, how do they work?!")
        self.set_size_request(350, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = gtk.MenuBar()

        filemenu = gtk.Menu()
        filem = gtk.MenuItem("Some Action")
        filem.connect("activate", self.on_file_activate)

        mb.append(filem)

        vbox = gtk.VBox(False, 2)
        vbox.pack_start(mb, False, False, 0)

        self.add(vbox)

        self.connect("destroy", gtk.main_quit)
        self.show_all()

    def on_file_activate(self, widget):
        md = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, "herp derp, took two clicks to show me")
        md.run()
        md.destroy()


MenuTest()
gtk.main()

Надеюсь, кто-то может помочь, но не может полностью запутать этого нуба одновременно.

Ответы [ 2 ]

2 голосов
/ 06 июня 2011

Я знаю, что это довольно старая тема. Но для того, чтобы кто-то еще пытался выполнить эту задачу, самое простое решение - заменить сигнал «активировать» на сигнал «выбора». Это должно исправить это. По крайней мере, на моей коробке.

т. замена

filem.connect("activate", self.on_file_activate)

с

filem.connect("select", self.on_file_activate)

Для ясности я бы также изменил имя функции.

Надеюсь, это кому-нибудь поможет. =)

2 голосов
/ 13 ноября 2010

Вы можете решить свою проблему, подключившись к сигналу 'button-press-event' вместо сигнала 'activate', и сделав обратный вызов следующим образом:

def on_file_activate(self, widget, event):
    if event.button != 1:
        return False  #only intercept left mouse button
    md = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, "herp derp, I only needed one click")
    md.run()
    md.destroy()
    return True

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...