我正在wxPython
处理一个小gui。
程序的一部分连接到网页以获得一些更新。它将此信息打印到状态TextCtrl
。
现在,我可以在一个帖子中做到这一点,但是当对网页的请求正在进行时,程序当然会变得没有响应。所以,为了解决这个问题,我已经创建了两个额外的线程,这些线程从程序开始时开始,只是阻塞直到他们完成一些工作。一个加载页面,一个写入状态框。
我正在使用一种生产者/消费者风格,其中所有内容都传递给Queue
。
头等舱:
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代码的一个非常特定的部分。
答案 0 :(得分:1)
我不一定称它不正确,但有更好的方法来设计应用程序视图和底层功能之间的交互。
您可能需要查看MVP模式(模型 - 视图 - 演示者)