Python GTK菜单项需要两次单击才能激活

时间:2010-11-12 23:00:27

标签: python gtk

好吧,首先我不太确定如何说出我的问题。这可能是缺乏睡眠,或者是Python和GTK的新手,或者是组合。为了帮助我,我在zetcode.com的教程的帮助下写了一个完整的简单例子。

问题,以及我可以说,它是一个菜单项 - 没有子菜单 - 需要两次点击才能激活。与单击时激活的子菜单项不同。这有点令人讨厌(可能会混淆未来的用户),但并不会导致我的应用程序出现任何问题。但是,我想解决它。

我的实际应用程序是在Ubuntu Quickly的帮助下创建的 - 但使用gtkBuilder或直接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 个答案:

答案 0 :(得分:2)

您可以通过连接到'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

但是,你为什么要这样做呢?我并不感到惊讶,你的原始代码没有按预期工作,因为那不是菜单的用途。你最好使用工具栏按钮或常规按钮。我认为滥用菜单作为按钮更容易让未来的用户感到困惑。

答案 1 :(得分:2)

我知道这是一个相当古老的主题。但是,为了其他任何试图完成此任务的人,最简单的解决方案是用“选择”信号替换“激活”信号。那应该解决它。至少,它在我的盒子上。

即。取代

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

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

为了清楚起见,我还会更改功能名称。

我希望能有所帮助。 =)