0

最近、閉じたときに常に次のようなメッセージを 2 回表示するコードを作成しました。

(python:11712): LIBDBUSMENU-GLIB-WARNING **: 自分が親だと信じていない子を削除しようとしています。

私が望むのは、その警告から取り除くことです。このコードはそのような動作を再現します (メッセージは閉じたときに 1 回表示されます)。

import wx

class MyFrame(wx.Frame):
  def __init__(self, parent):
    wx.Frame.__init__(self, parent, title="Sample")
    menuBar = wx.MenuBar()
    filemenu = wx.Menu()
    filemenu.Append(wx.ID_ANY,"&Pass")
    menuBar.Append(filemenu,"&File")
    self.SetMenuBar(menuBar)

app = wx.PySimpleApp()
frame = MyFrame(None)
frame.Show()
app.MainLoop()

完全に機能しますが、アプリを閉じると警告メッセージが表示されます。これは Linux のみのメッセージです。Windows で試しても何も表示されません。

私が使用した回避策は、フレームに閉じるイベントハンドラーをバインドすることでした

  def __init__(self, parent):
    ... # Previous code here
    self.Bind(wx.EVT_CLOSE, self.OnClose)

そして、そのようなイベントハンドラーを次のようにします

  def OnClose(self, evt):
    for menu in self.GetMenuBar().GetMenus(): # (wx.Menu, caption) tuples
      menu[0].Destroy() # Bad parents won't remove you, you'll DIE before!!!
    evt.Skip()

Linux の単純なアプリでは問題なく動作しましたが、Windows で試したときにクラッシュしました。だから私はLinux上でランタイムで何が起こっていたのかを見たいと思っていました.

      menu[0].Destroy()

      print menu[0].Parent

そして、答えとして「なし」が表示されました。しかし、私はそれを作ることができませんでした:

      menu[0].Parent = self

どちらも:

      menu[0].Parent = self.GetMenuBar()

どちらも TypeError を発生させるため:

TypeError: メソッド 'Menu_SetParent' で、タイプ 'wxMenu *' の引数 2 が必要です

4

1 に答える 1

0

これは GTK の警告です。環境変数で実行することにより、デバッグできgdbます(GtkおよびGlibライブラリのデバッグバリアント-たとえばlibgtk-3-0-dbglibglib2.0-0-dbgUbuntuまたはDebianのパッケージ)

 export G_DEBUG=fatal-warnings

バグが Gtk 自体にあるのか、WxWidget にあるのか、Python の C グルーにあるのか、それとも Python コードにあるのか、私にはわかりません。

于 2012-07-22T07:01:19.420 に答える