0

下に無地の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
4

2 に答える 2

0

selfメニュー項目をどこかに保存すると役に立ちますか?

item_open = gtk.MenuItem('Open')

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

(他のメニュー項目も同様)?

PyGTK についてはよくわかりませんが、GTK メニュー項目オブジェクト/構造に対応する Python オブジェクトを作成するのではないかと思います。これらの Python オブジェクトは、コンストラクターの最後でガベージ コレクションを取得する可能性があり、ガベージ コレクションを取得すると、基になる GTK C/C++ オブジェクトを削除する可能性があります。私の疑いは、メニュー項目が削除されているために消えているということです。

Python オブジェクトを保存することで、それらがガベージ コレクションされるのを防ぎます。これにより、対応する C/C++ オブジェクトが削除されるのを防ぐことができます。

ただし、これは憶測です。この提案が機能することを確認するためにコードをテストしていないため、完全に間違っている可能性があります。

于 2013-10-25T18:37:17.857 に答える