2

新しい子フレームを作成するか、すでに作成されたものを表示するボタンがあります。Show()を単独で使用しようとすると、問題が発生しました。ユーザーが子フレームを終了した場合、存在しなくなったフレームにアクセスしていたため、エラーが発生しました。私は現在、これを回避するためにtry /exceptを使用していますが、より良い方法はありますか?おそらく、これを処理するRaise()のような関数、またはフレームが存在するかどうかを確認する方法ですか?

コード:

#!/usr/bin/env python

import wx

class LogWindow(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        self.logger = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.TE_READONLY)

    def Print(self):
        self.Raise()
        self.logger.AppendText("Hello, world\n")

class MainWindow(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title)
        panel=wx.Panel(self)

        label = wx.StaticText(panel, -1, "Log this message:", pos=(10,10))
        goButton = wx.Button(panel, label="Log", pos=(10,50))
        self.Bind(wx.EVT_BUTTON, self.OnClick, goButton)
        self.logWin = LogWindow(self)

    #++++++++++++++++++++++++++
    def OnClick(self, event):
        try:
            self.logWin.Show()
        except:
            self.logWin = LogWindow(self)
            self.logWin.Show()

        self.logWin.Print()
    #++++++++++++++++++++++++++

class MyApp(wx.App):
    def OnInit(self):
        frame = MainWindow(None, -1, "MyApp")
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

#************************************************

if __name__ == "__main__":
    app = MyApp(0)
    app.MainLoop()

self.logWin.Show() try/exceptなしで受け取るエラーは

wx._core.PyDeadObjectError: The C++ part of the LogWindow object has been deleted, attribute access no longer allowed.

4

1 に答える 1

2

isinstance を使用して、まだ存在するかどうかを確認できます。詳細については、このスレッドを参照してください: https://groups.google.com/forum/?fromgroups#!topic/wxpython-users/lMAylDnC7vM

または、次のことを試すこともできます。

if self.logWin:
    self.logWin.Show()

http://wxpython-users.1045709.n5.nabble.com/is-there-a-method-to-test-if-an-wx-object-exists-td2356531.html

于 2012-07-16T20:46:17.290 に答える