0

我正在开发一个小 gui wxPython

该程序的一部分连接到网页以获取一些更新。它将此信息打印到状态TextCtrl

现在,我可以在一个线程中简单地执行此操作,但是在向网页发出请求时,程序当然会变得无响应。因此,为了解决这个问题,我创建了两个额外的线程,它们在程序的开头开始并简单地阻塞,直到它们有一些工作要做。一个加载页面,一个写入状态框。

我正在使用一种生产者/消费者风格,其中所有内容都通过Queues 传递。

一级:

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 代码的一个非常特定的部分。

4

1 回答 1

1

我不一定会说它不正确,但是有更好的方法来设计应用程序视图和底层功能之间的交互。

您可能想研究 MVP 模式(模型-视图-演示者)

http://wiki.wxpython.org/ModelViewPresenter/

于 2013-06-07T16:12:59.757 回答