2015-09-05 46 views
0

您好我是python的新手,并已开始使用wxpython开发GUI。我只想知道wxpython中的基本线程操作。我有一个主要的过程,它具有OK &取消按钮和一个从主导出的子过程,使用OK和Cancel按钮。我想实现线程这样一种方式,在主进程上单击确定按钮必须向子进程发送消息,并且子进程必须查找是否有任何进程正在运行,如果是,则必须等待该进程完成,然后接收来自主进程的消息。类似于主进程中的取消按钮。 基本上我想看看子进程如何接收来自主进程的消息,并且两者并行工作。 我正在尝试使用wx.CallAfter和wx.PostEvent,并且我对这里的线程概念感到困惑。请有人帮助我。 在此先感谢线程在wxpython

+0

我喜欢wx.lib.delayedresult这类问题。 “在没有线程的情况下在wx Python中执行长进程”http://showmedo.com/videotutorials/video?name=8770000&fromSeriesID=877 – otterb

回答

0

wxpython中的多线程与python没有区别。 wx.CallAfter and threading example显示您如何使用两者。 wx.CallAfter等待事件完成并在主线程中运行处理程序。另外,您可以使用定时器(wx.Timer)来检查子进程并发送/接收数据。

这是一个链接wx.PostEvent显示如何使用它。在这个例子中,你创建自定义事件,将它绑定到主线程中的处理程序。之后,您将该事件发布到工作线程中并附加一些数据。您的事件处理程序接收事件并在主线程中执行一些操作。

因此,有产生重要的问题,当你使用多线程

  1. 当启动子线程,
  2. 这是线程之间使用的通信机制,
  3. 如何停止线程安全这样在必要的时候,

我会预fer wx.Timer +队列模块。我可以定期用定时器或用户事件检查队列,并通过队列发送一些内容(即无)来停止线程。

注意:主线程中长时间运行的作业会导致GUI无响应。

+0

我试过上面的代码,但是我无法得到预期的结果。 – PythonDev

+0

谢谢@ozy ..我说得对。还有一个问题是我如何让一个子进程等待另一个进程(任何)来完成,然后弹出一个'Ok button pressed'消息对话框? – PythonDev

+0

你跳到另一个主题,多处理? :)请详细询问它作为一个新问题,我会在今天回答。 – ozy

0

我说得对。 THanks to @ozy

import threading 
import wx 
from threading import Thread 

ID_RUN = 101 
ID_RUN2 = 102 


class ChildThread(Thread): 
    def __init__(self, myframe): 
    """Init Worker Thread Class.""" 
     Thread.__init__(self) 
     self.myframe = myframe 

    def run(self): 
     wx.CallAfter(self.myframe.AfterRun, 'Ok button pressed') 


class MyFrame(wx.Frame): 
    def __init__(self, parent, ID, title): 
     wx.Frame.__init__(self, parent, ID, title) 
     panel = wx.Panel(self, -1) 
     mainSizer = wx.BoxSizer(wx.HORIZONTAL) 
     mainSizer.Add(wx.Button(panel, ID_RUN, "OK")) 
     mainSizer.Add(wx.Button(panel, ID_RUN2, "Cancel")) 
     panel.SetSizer(mainSizer) 
     mainSizer.Fit(self) 
     wx.EVT_BUTTON(self, ID_RUN, self.onRun) 
     wx.EVT_BUTTON(self, ID_RUN2, self.onRun2) 

    def onRun(self, event): 
     self.child = ChildThread(myframe=self) 
     self.child.daemon = True 
     self.child.start() 

    def onRun2(self, event): 
     self.child2 = threading.Thread(None, self.__run) 
     self.child2.daemon = True 
     self.child2.start() 

    def __run(self): 
     wx.CallAfter(self.AfterRun, "Cancel button pressed") 

    def AfterRun(self, msg): 
     dlg = wx.MessageDialog(self, msg, "Message", wx.OK | wx.ICON_INFORMATION) 
     dlg.ShowModal() 
     dlg.Destroy() 


class MyApp(wx.App): 
    def OnInit(self): 
     frame = MyFrame(None, -1, "My GUI") 
     frame.Show(True) 
     frame.Centre() 
     return True 

app = MyApp(0) 
app.MainLoop() 
+0

我如何让一个ChildThread等待一个进程(任何)完成,然后继续显示一个对话框? – PythonDev