wxpython 按钮控件如何实现运行和中断状态_如何只在单击按钮时运行代码..python/wxpython/boa constru...

摘要

一般来说,这是wxPython中一种公认的方法,它直接来自the docs创建新的“数据”事件。

使控制器监听“数据”事件

让按下“开始”按钮启动一个线程,该线程增加一个计数器,并将一个“数据”事件发送到窗口并附加计数器值。

接收到事件后,将值添加到您的RichTextCtrl

示例

这里有一个例子。请特别注意使用Connect()来监听传入的值事件。在import wx

import wx.richtext

import threading

import time

EVT_ID_VALUE = wx.NewId()

class DataEvent(wx.PyEvent):

def __init__(self, data):

wx.PyEvent.__init__(self)

self.SetEventType(EVT_ID_VALUE)

self.data=data

class Frame3(wx.Frame):

def __init__(self, parent, title):

self.counter = 0

self.worker = None

wx.Frame.__init__(

self, name='',

parent=parent,

pos=wx.Point(579, 234),

size=wx.Size(414, 492),

style=wx.DEFAULT_FRAME_STYLE, title='Frame3'

)

self.panel1 = wx.Panel(

name='panel1',

parent=self,

pos=wx.Point(0, 0),

size=wx.Size(406, 458),

style=wx.TAB_TRAVERSAL

)

self.richTextCtrl1 = wx.richtext.RichTextCtrl(

parent=self.panel1,

pos=wx.Point(96, 96),

size=wx.Size(200, 100),

style=wx.richtext.RE_MULTILINE,

value=u''

)

self.richTextCtrl1.SetLabel(u'richText')

self.richTextCtrl1.SetScrollbars(20,20,50,50)

self.button2 = wx.Button(

label=u'STOP',

name='button2',

parent=self.panel1,

pos=wx.Point(256, 280),

size=wx.Size(75, 23),

style=0

)

self.button2.Bind(

wx.EVT_BUTTON,

self.OnStop

)

self.button1 = wx.Button(

label=u'START',

name='button1',

parent=self.panel1,

pos=wx.Point(88, 280),

size=wx.Size(75, 23),

style=0

)

self.button1.Bind(

wx.EVT_BUTTON,

self.OnStart

)

self.Connect(-1, -1, EVT_ID_VALUE, self.OnValue )

def OnValue(self, event):

self.richTextCtrl1.AppendText("%d\n"%event.data)

def OnStart(self, event): #START BUTTON

self.richTextCtrl1.AppendText("START\n")

if not self.worker:

self.worker = WorkerThread(self)

self.worker.start()

def OnStop(self, event): #STOP BUTTON

self.richTextCtrl1.AppendText("STOP\n")

if self.worker:

self.worker.stop()

class WorkerThread(threading.Thread):

def __init__(self, notify_window):

threading.Thread.__init__(self)

self.counter = 0

self._notify_window = notify_window

self.abort = False

def run(self):

while not self.abort:

self.counter += 1

wx.PostEvent(self._notify_window, DataEvent(self.counter))

time.sleep(1)

def stop(self):

self.abort = True

if __name__ == '__main__':

app = wx.App()

frame = Frame3(None, "My Hello App")

frame.Show(True)

app.MainLoop()


版权声明:本文为weixin_32150027原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。