来自进程的简单wxPython post事件

2024-09-30 06:15:53 发布

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

我试图创建一个窗口,从进程接收简单的事件通知。以下是我目前掌握的代码:

import wx, wx.lib.newevent, time, sys
from multiprocessing import Process

size_width = 320
size_height = 240
background_color = (226,223,206)

SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()


class StatusWindow(wx.Frame):
    def __init__(self, parent):
        super(StatusWindow, self).__init__(parent, title='Monitor', size=(size_width, size_height))

        self.Bind(EVT_SOME_NEW_EVENT, self.updateStatus)

        staticBox = wx.StaticBox(self, label='Monitor Status:', pos=(5, 105), size=(size_width - 28, size_height/3))
        self.statusLabel = wx.StaticText(staticBox, label='None', pos=(10, 35), size=(size_width, 20), style=wx.ALIGN_LEFT)
        self.count = 0
        self.InitUI()

        self.monitor = cMonitor()
        self.monitor.start()

    def InitUI(self):
        panel = wx.Panel(self)    
        self.SetBackgroundColour(background_color)
        self.Centre()
        self.Show()

    def updateStatus(self, evt):
        self.statusLabel.SetLabel(evt.attr1)

class cMonitor(Process):
    def __init__(self):
        super(cMonitor, self).__init__()

    def run(self):
        time.sleep(2)
        print 'This is an update'
        #create the event
        evt = SomeNewEvent(attr1="Some event has just occured")
        #post the event
        wx.PostEvent(EVT_SOME_NEW_EVENT, evt)

if __name__ == '__main__':
    app = wx.App()
    window = StatusWindow(None)
    app.MainLoop()

窗口已创建,但进程似乎未正确执行或发送事件后通知。我应该注意到run方法中的print语句也没有出现。是什么原因导致GUI不能更新??这是我用来作为参考的:

http://wiki.wxpython.org/CustomEventClasses


Tags: selfeventnewsizeinitdefsomewidth
1条回答
网友
1楼 · 发布于 2024-09-30 06:15:53

首先,您的代码抛出一个错误:

Traceback (most recent call last):
  File "C:\Python27\lib\multiprocessing\process.py", line 232, in _bootstrap
    self.run()
  File "C:\PyProgs\stackoverflow_answers\wx_answers\wx_events1.py", line 44, in run
    wx.PostEvent(EVT_SOME_NEW_EVENT, evt)
  File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\_core.py", line 8410, in PostEvent
    return _core_.PostEvent(*args, **kwargs)
TypeError: in method 'PostEvent', expected argument 1 of type 'wxEvtHandler *'

根据docsPostEvent(dest, event)发送一个事件到一个窗口或其他{}稍后处理,但在代码中,第一个参数的类型是PyEventBinder。你的代码应该是这样的:

^{pr2}$

其中self.wxWindow-类的对象。但是还有一个问题:不能将wxPython对象用作多处理器参数(link)。在

一种方法是使用线程模块而不是多处理:

import wx, wx.lib.newevent, time, sys
from threading import *
size_width = 320
size_height = 240
background_color = (226,223,206)

SomeNewEvent, EVT_SOME_NEW_EVENT = wx.lib.newevent.NewEvent()


class StatusWindow(wx.Frame):
    def __init__(self, parent):
        super(StatusWindow, self).__init__(parent, title='Monitor', size=(size_width, size_height))

        self.Bind(EVT_SOME_NEW_EVENT, self.updateStatus)

        staticBox = wx.StaticBox(self, label='Monitor Status:', pos=(5, 105), size=(size_width - 28, size_height/3))
        self.statusLabel = wx.StaticText(staticBox, label='None', pos=(10, 35), size=(size_width, 20), style=wx.ALIGN_LEFT)
        self.count = 0
        self.InitUI()

        # Set up event handler for any worker thread results
        self.monitor = cMonitor(self)
        self.monitor.start()

    def InitUI(self):
        panel = wx.Panel(self)    
        self.SetBackgroundColour(background_color)
        self.Centre()
        self.Show()

    def updateStatus(self, evt):
        self.statusLabel.SetLabel(evt.attr1)



class cMonitor(Thread):
    def __init__(self, wxWindow):
        super(cMonitor, self).__init__()
        self.wxWindow = wxWindow


    def run(self):
        time.sleep(2)
        print 'This is an update'
        #create the event
        evt = SomeNewEvent(attr1="Some event has just occured")
        #post the event
        wx.PostEvent(self.wxWindow, evt)

if __name__ == '__main__':

    app = wx.App()
    window = StatusWindow(None)
    app.MainLoop()

相关问题 更多 >

    热门问题