【问题标题】:Gtk MenuBar kills MenuItems after the pointer hovers over themGtk MenuBar 在指针悬停在它们上方后杀死 MenuItems
【发布时间】:2013-10-25 17:32:25
【问题描述】:

我在下面有一个普通的gtk.MenuBar 框架。每当鼠标悬停在某个项目上,并且该子菜单由于失去焦点而被隐藏时,在重新访问该子菜单时,所有项目都会丢失。

预期的行为是,每次使用指针激活“文件”、“游戏”和“帮助”时,菜单项会按照添加到菜单和子菜单的顺序重新出现。

这个感知错误的原因是什么? gtk.MenuBar 是否需要更多“实现”才能正常运行?

不想要的结果如下图所示:

#!/usr/bin/python
import gtk

def callbackz(*argv):
    print str(*argv)

class ChessMenuBar(gtk.MenuBar):
    def __init__(self):
        super(ChessMenuBar, self).__init__()

        menu_file = gtk.Menu()

        item_open = gtk.MenuItem('Open')
        item_save = gtk.MenuItem('Save')
        item_quit = gtk.MenuItem('Quit')
        menu_file.append(item_open)
        menu_file.append(item_save)
        menu_file.append(item_quit)

        menu_game = gtk.Menu()
        item_newg = gtk.MenuItem('Star New Game')
        menu_game.append(item_newg)

        menu_help = gtk.Menu()
        item_help = gtk.MenuItem('Help')
        menu_help.append(item_help)

        # --  main categories
        item_file = gtk.MenuItem('File')
        item_game = gtk.MenuItem('Game')
        item_help = gtk.MenuItem('Help')

        item_file.set_submenu(menu_file)
        item_game.set_submenu(menu_game)
        item_help.set_submenu(menu_help)

        self.append(item_file)
        self.append(item_game)
        self.append(item_help)


        for _ in [ item_file, item_game, item_help,
                item_help, item_newg, item_open, 
                item_quit, item_save]:
            _.connect('activate', callbackz)

class PyApp(gtk.Window):

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

        self.set_title("Simple menu")
        self.set_size_request(250, 200)
        self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440))
        self.set_position(gtk.WIN_POS_CENTER)

        mb = ChessMenuBar()

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

        self.add(vbox)

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


PyApp()
gtk.main()

$ winPython --version
Python 2.7.3

$ cat /cygdrive/c/Python27/Lib/site-packages/gtk-2.0/pygtk-2.22.0-py2.7.egg-info
Metadata-Version: 1.1
Name: pygtk
Version: 2.22.0
( abbreviated )
Platform: MS Windows
Requires: pycairo (>=1.0.2)
Requires: pygobject (>=2.21.3)
Provides: p
Provides: y
Provides: g
Provides: t
Provides: k

【问题讨论】:

    标签: python user-interface pygtk


    【解决方案1】:

    如果您将菜单项存储在某个地方会有帮助吗?在self 中,通过替换

    item_open = gtk.MenuItem('Open')
    

    self.item_open = gtk.MenuItem('Open')
    

    (对于其他菜单项也是如此)?

    我不太了解 PyGTK,但我怀疑它会创建与 GTK 菜单项对象/结构相对应的 Python 对象。这些 Python 对象可能在构造函数结束时被垃圾收集,当它们被垃圾收集时,它们可能会删除底层的 GTK C/C++ 对象。我怀疑菜单项正在消失,因为它们被删除了。

    通过存储 Python 对象,您可以防止它们被垃圾回收,从而防止相应的 C/C++ 对象被删除。

    不过,这只是猜测;我没有测试你的代码来验证这个建议是否有效,所以我可能完全错了。

    【讨论】:

    • 有趣的建议,但即使指向项目和菜单对象的指针作为属性保留在self 上,结果也是一样的。
    【解决方案2】:

    该错误可能是由于同时安装了多个 pygtk 一体式捆绑包。

    例如

    pygtk-all-in-one-2.24.2.win32-py2.7.msi
    (and)
    pygtk-all-in-one-2.22.6.win32-py2.7.msi
    

    要解决此问题,请使用安装程序或控制面板卸载所有版本并仅安装一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多