Python GTK菜单项需双击才能激活

2 投票
2 回答
2414 浏览
提问于 2025-04-16 07:00

首先,我不太确定该怎么描述我的问题。这可能是因为我没睡好,或者我对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 个回答

2

我知道这个讨论已经有点老了。不过,为了帮助其他想完成这个任务的人,最简单的解决办法就是把“激活”信号换成“选择”信号。这样应该就能解决问题。至少在我的电脑上是这样。

也就是说,把

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

替换成

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

我还建议改一下函数的名字,这样更清楚明了。

希望这能帮到某个人。=)

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

不过,为什么你想这么做呢?我并不奇怪你原来的代码没有按预期工作,因为菜单其实不是用来做这个的。你用工具栏按钮或者普通按钮会更好。我觉得把菜单当作按钮来用,可能会让以后的用户感到困惑。

撰写回答