是否有一种模式可以帮助避免此代码中的紧耦合?

时间:2013-06-07 16:10:00

标签: python wxpython

我正在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)。然后它将要打印的任何内容推送到TextCtrlmsg_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代码的一个非常特定的部分。

1 个答案:

答案 0 :(得分:1)

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

您可能需要查看MVP模式(模型 - 视图 - 演示者)

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