我正在开发一个小 gui wxPython
。
该程序的一部分连接到网页以获取一些更新。它将此信息打印到状态TextCtrl
。
现在,我可以在一个线程中简单地执行此操作,但是在向网页发出请求时,程序当然会变得无响应。因此,为了解决这个问题,我创建了两个额外的线程,它们在程序的开头开始并简单地阻塞,直到它们有一些工作要做。一个加载页面,一个写入状态框。
我正在使用一种生产者/消费者风格,其中所有内容都通过Queue
s 传递。
一级:
class Loader(threading.Thread):
def __init__(self, in_queue, msg_queue):
threading.Thread.__init__(self)
self.in_queue = in_queue
self.msg_queue = msg_queue
def run(self):
url = self.in_queue.get()
page = Page(url)
self.msg_queue.put('requested page %s' % page.get_title())
self.in_queue.task_done()
因此,它等待一个 url,然后打开 url(Page
是另一个自定义类,它只存储了一些用于处理返回的 html 的便捷方法)。然后它将要打印的任何内容推TextCtrl
送到msg_queue
.
二等舱接受msg_queue
。
class StatusWriter(threading.Thread):
def __init__(self, msg_queue, post_func):
threading.Thread.__init__(self)
self.msg_queue = msg_queue
self.post_message = post_func
def run(self):
while True:
messgae = self.msg_queue.get()
if messgae == 'quit':
self.msg_queue.task_done()
break
self.post_message(messgae)
self.msg_queue.task_done()
所以这就是我的问题所在。现在,我不确定如何从一个单独的类中控制我的各种 wx 小部件。我利用可以传递函数的事实解决了这个问题,但我不确定这是否是解决这个问题的正确方法。将一个小函数从一个类赋予另一个类似乎很奇怪。
有问题的功能是:
def post_status_update(self, msg=None):
self.status_box.AppendText(msg)
一切都设置为:
self.in_queue = Queue.Queue()
self.msg_queue = Queue.Queue()
self.loader = Loader(self.in_queue, self.msg_queue)
self.status_writer = StatusWriter(
self.in_queue,
self.msg_queue,
self.post_status_update()
)
所以,我的问题基本上是,这是一种“不正确”的方式吗?感觉就像它把这个类紧密耦合到 gui 代码的一个非常特定的部分。