子菜单项不调用函数[带工作解决方案]

2024-10-05 12:16:55 发布

您现在位置:Python中文网/ 问答频道 /正文

    #submenu
    clearMenu = gtk.Menu()

    item = gtk.MenuItem("submenu item")
    item.connect("activate", lambda w: self.callBackFunction())
    clearMenu.append(item)
    item.show()


    '''TOP level'''
    menu = gtk.Menu()

    item = gtk.ImageMenuItem("Item1")
    img = gtk.Image()
    img.set_from_file('image1.png')
    item.set_image(img)
    menu.append(item)
    item.set_submenu(clearMenu) #attach submenu
    item.show()

    item = gtk.ImageMenuItem("Item2")
    img = gtk.Image()
    img.set_from_file('image2.png')
    item.set_image(img)   
    item.connect("activate", lambda w: self.callBackFunction())
    menu.append(item)
    item.show()

我的顶层项“Item2”调用定义的函数“callBackFunction”。但是为什么“子菜单项”没有? 我做错什么了?在


编辑

下面是我如何强制子菜单项启动所需操作的方法:

^{pr2}$

但我还是不明白为什么事件“激活”不能在子菜单项上工作,而在顶级菜单项上工作


Tags: lambdagtkimgshowconnectitemmenuactivate
2条回答

虽然"button-press-event"起作用,但它有一些缺点:

  • 它不适用于纯键盘导航
  • 如果回调阻塞,则整个X服务器被阻塞(参见gPodder bug 1778

对于我自己的应用程序(gPodder),我已经在commit a09b204a中解决了这个问题。在

我们想要的:

  1. "activate"信号作出反应(对于键盘导航和父菜单项也被单击的情况)
  2. "button-press-event"信号作出反应(以解决错误)
  3. 在下一个主循环迭代中运行回调(以避免阻塞X服务器)
  4. 确保回调只被调用一次("activate"和{}在某些情况下都可能发生)

为1。和2。我们可以简单地连接两个信号。 为3。我们可以使用gobject.idle_add()。 为4。我们可以使用threading.Semaphore。在

这将导致以下代码:

import threading
import gobject

def submenu_item_connect_hack(menu_item, callback, *args_for_callback):
    only_once = threading.Semaphore(1)

    def handle_event(item, event=None):
        if only_once.acquire(False):
            gobject.idle_add(callback, *args_for_callback)

    menu_item.connect('button-press-event', handle_event)
    menu_item.connect('activate', handle_event)

现在,可以在代码中按如下方式使用它:而不是调用其中一个:

^{pr2}$

你改为这样叫:

submenu_item_connect_hack(item, self.callBackFunction, argument1, argument2)

还有,GNOME Bugzilla中的filed bug 695488。在

这是子菜单焦点explained here固有的问题:

the submenu doesn't get focus until the menu item it's attached to is clicked (even though the submenu appears when the mouse is over the menu item.)

The upshot is that items in the sub menu don't emit the activate signal unless the parent menu item is clicked first.

这就解释了为什么键盘导航似乎有效。在

我已经花了一年多的时间来解决这个问题,但是我不知道有什么解决方法-只有你发现的"button-press-event"解决方法。在

相关问题 更多 >

    热门问题