我编写了一个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为我的代码创建一个exe很容易。
我怎么错了!
因此,在阅读了一些评论之后,似乎有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仍然没有运气。
因此,我随后阅读了以下文章
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('{}: {} - {}\n'.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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句