扭曲的+wxPython的不洁存在

2024-10-03 19:30:37 发布

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

我正在使用twistd。以下是应用程序中的唯一服务:

class GameClientService(internet.TCPClient):
    def __init__(self, serverHost, serverPort):
        self.wxApp = wx.App(False)
        reactor.registerWxApp(self.wxApp)
        self.lobbyFrame = gui.LobbyFrame()

        internet.TCPClient.__init__(self, serverHost, serverPort, LobbyProtocolFactory(self.lobbyFrame))

    def stopService(self):
        internet.TCPClient.stopService(self)
        print "Stop service!"
        destroyedD = defer.Deferred()
        self.lobbyFrame.CloseWithCallback(destroyedD.callback, True)
        print "close called!"
        def fired(result):
            print "'Destroyed' deferred has fired with %s" % (result,)
        destroyedD.addCallback(fired)
        return destroyedD

CloseWithCallbackwx.Frame上定义如下:

^{pr2}$

LobbyProtocol的工厂中,如果连接失败,我会停止反应器:

def clientConnectionFailed(self, connector, reason):
    print "Client connection failed: %s" % reason.getErrorMessage()
    reactor.stop()

我在没有监听服务器的情况下运行客户端,因此连接失败,但有时(可能超过一半,但并非总是):

2012-11-12 18:43:29-0500 [-] Started connecting <twisted.internet.tcp.Connector instance at 0x030E3800>
2012-11-12 18:43:30-0500 [Uninitialized] Client connection failed: Connection was refused by other side: 10061: No connection could be made because the target machine actively refused it..
2012-11-12 18:43:30-0500 [Uninitialized] Stopping factory <network.LobbyProtocol.LobbyProtocolFactory instance at 0x030E3698>
2012-11-12 18:43:30-0500 [-] Stop service!
2012-11-12 18:43:30-0500 [-] 'Destroyed' deferred has fired with True
2012-11-12 18:43:30-0500 [-] Traceback (most recent call last):
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\site-packages\wx-2.8-msw-unicode\wx\_core.py", line 14669, in <lambda>
2012-11-12 18:43:30-0500 [-]     lambda event: event.callable(*event.args, **event.kw) )
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\site-packages\twisted\internet\_threadedselect.py", line 232, in _interleave
2012-11-12 18:43:30-0500 [-]     msg, args = self.toMainThread.get_nowait()
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\Queue.py", line 190, in get_nowait
2012-11-12 18:43:30-0500 [-]     return self.get(False)
2012-11-12 18:43:30-0500 [-]   File "C:\Python26\lib\Queue.py", line 165, in get
2012-11-12 18:43:30-0500 [-]     raise Empty
2012-11-12 18:43:30-0500 [-] Queue.Empty
2012-11-12 18:43:30-0500 [-] Server Shut Down.
2012-11-12 18:43:30-0500 [-] Server Shut Down.

这让我很不舒服。我怎样才能确保回溯永远不会运行?我做错了什么?在


Tags: inpyselfeventgetlibdefline
1条回答
网友
1楼 · 发布于 2024-10-03 19:30:37

我已经进行了适当的洗礼,因此我的代码现在得到了净化:

class CleanExitApp(wx.App):
    def __init__(self, *args, **kwargs):
        wx.App.__init__(self, *args, **kwargs)

        self.exitDeferreds = []

    def AddExitDeferred(self, exitDeferred):
        self.exitDeferreds.append(exitDeferred)

    def OnExit(self):
        print "OnExit"
        for exitDeferred in self.exitDeferreds:
            exitDeferred.callback(True)

class GameClientService(internet.TCPClient):
    def __init__(self, serverHost, serverPort):
        self.wxApp = CleanExitApp(False)
        reactor.registerWxApp(self.wxApp)
        self.lobbyFrame = gui.LobbyFrame() 

        internet.TCPClient.__init__(self, serverHost, serverPort, LobbyProtocolFactory(self.lobbyFrame))

    def stopService(self):
        internet.TCPClient.stopService(self)
        print "Stop service!"
        exitD = defer.Deferred()
        self.wxApp.AddExitDeferred(exitD)
        self.lobbyFrame.Close()
        print "close called!"
        def fired(result):
            print "'Destroyed' deferred has fired with %s" % (result,)
        exitD.addCallback(fired)
        return exitD

这使我们的输出更加优雅:

^{pr2}$

赞美主!在

人们只想知道上帝是否有不同的想法。。。一个更为内置的,不需要如此严苛的代码?在

相关问题 更多 >