带有pubsub的pyinstaller exe [英] pyinstaller exe with pubsub

查看:32
本文介绍了带有pubsub的pyinstaller exe的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经编写了一个wxpython应用程序,它使用几个不同的线程,所有这些线程都需要写入日志窗口(textctrl框)。正因为如此,我遵循了本教程

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

并使用wx.CallAfter和PubSub。

这是我的原始代码

from wx.lib.pubsub import Publisher

Publisher().subscribe(self.messenger, "update")

wx.CallAfter(Publisher().sendMessage, "update", "Thread finished!")

def messenger(self, msg):
    self.logtxtctrl.WriteText(msg.data)

此代码运行出色,我认为使用pyinstaller为我的代码创建可执行文件会很容易。

我大错特错了!!

所以在阅读了一些评论之后,似乎有两个版本的pubSub API,所以使用这个

http://wiki.wxpython.org/WxLibPubSub

我将代码调整为以下内容

from wx.lib.pubsub import setuparg1

from wx.lib.pubsub import pub

pub.subscribe(self.messenger, "update")

wx.CallAfter(pub.sendMessage, "update", data="Program success")

def messenger(self, data):
    self.logtxtctrl.WriteText(data)

此代码现在可以工作了,我再次尝试使用pyinstaller,但仍然没有成功。

于是我阅读了以下文章

How to get pubsub to work with pyinstaller?

http://www.pyinstaller.org/ticket/312

这两个都非常有用,我尝试了所有更改钩子文件和不同规范文件的不同变体,但仍然无法正常工作。

这些帖子差不多是2年前的事了,我本以为添加pubsub就可以解决了。

谁能解释一下我需要哪些钩子、规范文件中应该有哪些内容以及我需要执行哪些其他元素才能使其正常工作的流程?

如果没有解决方案,我还能如何与小工具进行线程安全通信?

推荐答案

尝试

from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub

我有一个程序,它完全可以实现您想要的功能。下面是我使用的相关代码片段。我建议创建一个像Logger这样的函数,而不是使用WriteText,它可以为我在以后的更改中省去一些痛苦。

class Frame(wx.Frame):
    def __init__(self, *args, **kwargs):
        super(Frame, self).__init__(*args, **kwargs)
        self.InitUI()
        self.SetSize((380,340))
        self.Show()
        self.count = 0
        self.threads = []
        pub.subscribe(self.__StatusChanged, 'status.changed')

    def __StatusChanged(self, asset, time, status):
        if status:
            msg = 'Online'
        else:
            msg = 'Offline'
        self.Logger('{}: {} - {}
'.format(time, asset, msg))

    def Logger(self, msg):
        self.txtresults.AppendText(msg)

class PingAssets(threading.Thread):
    def __init__(self, threadNum, asset, window):
        threading.Thread.__init__(self)
        self.threadNum = threadNum
        self.window = window
        self.asset = asset
        self.signal = True
        self.status = None

    def run(self):
        while self.signal:
            logging.debug("Thread {} started run sequence.".format(self.threadNum))
            start_time = datetime.now().strftime(self.fmt)
            try:
                newstatus = onlinecheck.check_status(self.asset)
                if newstatus != self.status or self.verbose:
                    self.status = newstatus
                    pub.sendMessage('status.changed', asset=self.asset,
                                    time=start_time, status=self.status)

这篇关于带有pubsub的pyinstaller exe的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆