一、测试程序界面

二、不使用多线程代码如下(当点击开启日志的时候,直接导致界面卡死)

#coding:utf-8
import sys
import threading
import time
import wxclass MyWindow():def __init__(self):self.app = Noneself.frame = Noneself.logObj = Noneself.main()def main(self):self.app = wx.App()self.frame = wx.Frame(None, -1, title='线程安全测试', size=wx.Size(1100, 700))self.createMainPanel()def show(self):self.frame.Show()self.app.MainLoop()def createMainPanel(self):mainPanel = wx.Panel(self.frame)startButton = wx.Button(mainPanel, label="启动", pos=(5, 5))openLogButton = wx.Button(mainPanel, label="开启日志", pos=(95, 5))closeLogButton = wx.Button(mainPanel, label="关闭日志", pos=(180, 5))self.logTextCtr = wx.TextCtrl(mainPanel, size=wx.Size(1000, 500), pos=(5,50),style=wx.TE_MULTILINE)self.frame.Bind(wx.EVT_BUTTON, lambda evt, textArea=self.logTextCtr: self.startBut(evt,self.logTextCtr),startButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.startLog(evt),openLogButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.closeLog(evt),closeLogButton)def startBut(self,evt,textArea):self.logObj = LogPrint(textArea)def startLog(self,evt):self.logObj.toPrint()def closeLog(self,evt):self.logObj.setIsPrint(0)class LogPrint():def __init__(self,textArea):self.isPrint = 0self.textArea = textAreadef toPrint(self):self.isPrint = 1i = 0while self.isPrint == 1:j = str(i) + " this is log!"self.textArea.WriteText(j + "\n")i = i + 1time.sleep(1)def setIsPrint(self,data):self.isPrint = dataif __name__ == "__main__":MyWindow().show()

三、使用threading多线程后,界面不会卡死,在windows下运行启动后界面可正常操作不会阻塞;但是在linux或mac下面点击开启日志后程序直接崩溃,代码如下:

#coding:utf-8
import sys
import threading
import time
import wxclass MyWindow():def __init__(self):self.app = Noneself.frame = Noneself.logObj = Noneself.main()def main(self):self.app = wx.App()self.frame = wx.Frame(None, -1, title='线程安全测试', size=wx.Size(1100, 700))self.createMainPanel()def show(self):self.frame.Show()self.app.MainLoop()def createMainPanel(self):mainPanel = wx.Panel(self.frame)startButton = wx.Button(mainPanel, label="启动", pos=(5, 5))openLogButton = wx.Button(mainPanel, label="开启日志", pos=(95, 5))closeLogButton = wx.Button(mainPanel, label="关闭日志", pos=(180, 5))self.logTextCtr = wx.TextCtrl(mainPanel, size=wx.Size(1000, 500), pos=(5,50),style=wx.TE_MULTILINE)self.frame.Bind(wx.EVT_BUTTON, lambda evt, textArea=self.logTextCtr: self.startBut(evt,self.logTextCtr),startButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.startLog(evt),openLogButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.closeLog(evt),closeLogButton)def startBut(self,evt,textArea):self.logObj = LogPrint(textArea)def startLog(self,evt):threadObj = threading.Thread(target=self.dolog, args=())threadObj.start()#self.logObj.toPrint()def dolog(self):self.logObj.toPrint()def closeLog(self,evt):self.logObj.setIsPrint(0)class LogPrint():def __init__(self,textArea):self.isPrint = 0self.textArea = textAreadef toPrint(self):self.isPrint = 1i = 0while self.isPrint == 1:j = str(i) + " this is log!"self.textArea.WriteText(j + "\n")i = i + 1time.sleep(1)def setIsPrint(self,data):self.isPrint = dataif __name__ == "__main__":MyWindow().show()

四、解决卡死或不同平台崩溃问题(使用wxpython中CallAfter自带多线程,以及pubsub进行线程之间消息通讯来实现)

python3多线程threading功能强大,结合jion()和setDaemon()函数使用更灵活,使用多线程时首先想到了threading, 但wxpython是用python写的一个UI框架,其本身自带有多线程函数:

  • wx.PostEvent
  • wx.CallAfter
  • wx.CallLater

其中,wx.CallLater是最抽象的线程安全函数,其次是callAfter,最后是PostEvent。舍去这三个,直接使用threading导致UI出现卡顿,卡死等情况。结合wxpython自带的多线程函数效果很好。

pubsub模块中,pub.subscribe 可以理解为注册一个接收消息的方法;pub.sendMessage 可以理解为发送消息给上一步注册的方法

实现代码:

#coding:utf-8import sys
import threading
import timeimport wx
from wx.lib.pubsub import pubclass MyWindow():def __init__(self):self.app = Noneself.frame = Noneself.logObj = Noneself.main()def main(self):self.app = wx.App()self.frame = wx.Frame(None, -1, title='线程安全测试', size=wx.Size(1100, 700))self.createMainPanel()def show(self):self.frame.Show()self.app.MainLoop()def createMainPanel(self):mainPanel = wx.Panel(self.frame)startButton = wx.Button(mainPanel, label="启动", pos=(5, 5))openLogButton = wx.Button(mainPanel, label="开启日志", pos=(95, 5))closeLogButton = wx.Button(mainPanel, label="关闭日志", pos=(180, 5))self.logTextCtr = wx.TextCtrl(mainPanel, size=wx.Size(1000, 500), pos=(5,50),style=wx.TE_MULTILINE)self.frame.Bind(wx.EVT_BUTTON, lambda evt, textArea=self.logTextCtr: self.startBut(evt,self.logTextCtr),startButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.startLog(evt),openLogButton)self.frame.Bind(wx.EVT_BUTTON, lambda evt: self.closeLog(evt),closeLogButton)pub.subscribe(self.updateDisplay, "update")def startBut(self,evt,textArea):self.logObj = LogPrint()def startLog(self,evt):threadObj = threading.Thread(target=self.dolog, args=())threadObj.start()def dolog(self):self.logObj.toPrint()def updateDisplay(self, msg):t = msgself.logTextCtr.WriteText(t + "\n")def closeLog(self,evt):self.logObj.setIsPrint(0)class LogPrint():def __init__(self):self.isPrint = 0def toPrint(self):self.isPrint = 1i = 0while self.isPrint == 1:j = str(i) + " this is log!"wx.CallAfter(pub.sendMessage, "update", msg=j)print(j)i = i + 1time.sleep(1)def setIsPrint(self,data):self.isPrint = dataif __name__ == "__main__":MyWindow().show()

wxPython多线程界面卡死或在不同平台崩溃问题相关推荐

  1. c#多线程防止界面卡死

    当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时,为了让程序执行中不出现界面 卡死 的现像,最好的方法就是 多线程 来解决 一个主线程来 创建 界面,使用一个子线程来执 ...

  2. c# 多线程界面卡顿_C#多线程解决界面卡死问题的完美解决方案

    文章下最方有源码下载 问题描述: 当我们的界面需要在程序运行中不断更新数据时,当一个textbox的数据需要变化时. 为了让程序执行中不出现界面卡死的现像,最好的方法就是更新主界面,这样就不会出现卡死 ...

  3. 二、UI线程和界面卡死

    上回说到,在Windows窗体程序中,响应Windows消息的线程就被称做Windows窗体程序的UI线程.UI线程还有一个重要的功能是创建和管理窗体和窗体中的各种控件,负责他们的实时刷新,如果UI线 ...

  4. VB.Net 解决winForm界面卡死

    问题,利用多线程解决界面卡死时,控件不能在新建的线程中访问. 解决方法, 可使用Invoke或BeginInvoke,在拥有此控件的基础窗口句柄的线程上执行指定的委托. Invoke 方法 (Dele ...

  5. Centos7解决图形界面卡死问题

    Centos7解决图形界面卡死问题 参考文章: (1)Centos7解决图形界面卡死问题 (2)https://www.cnblogs.com/yzfdjzwl/p/6636274.html 备忘一下 ...

  6. python窗体设计插件_Python 界面生成器 wxFormBuilder 的入门使用(wxPython的界面设计工具的初学笔记)...

    环境,Win10,python3.7.3,wxPython 4.0.4,wxFormBuilder 3.9 1.准备一个窗体. 点击wxformbuilder上方的标签"forms" ...

  7. wxpython多线程 假死_wxpython多线程防假死与线程间传递消息实例详解

    wxpython中启用线程的方法,将GUI和功能的执行分开. 网上关于python多线程防假死与线程传递消息是几年前的,这里由于wxpython和threading模块已经更新最新,因此给出最新修改代 ...

  8. Pytorch 多线程 运行卡死

    Pytorch多线程运行卡死,在github上面有类似问题https://github.com/pytorch/pytorch/issues/1355 2类问题问题及解决方案如下 1.由opencv引 ...

  9. 微信团队披露:微信界面卡死超级bug“15。。。。”的来龙去脉

    1.微信超级Bug 大家好,给大家介绍一下,这是Bug: 应该有很多Android的用户熟悉上面这图. (本文同步发布于:http://www.52im.net/thread-1099-1-1.htm ...

最新文章

  1. Python自动化开发学习6
  2. 数学,对人工智能开发者意味着什么
  3. vue中利用scss实现整体换肤和字体大小设置
  4. Redis 面试连环炮,看看你能撑到哪一步?
  5. 如何实现label长度固定,文字分散分布的效果
  6. python islice_python文件操作细节
  7. 键盘enter按钮出发登陆事件
  8. java 常量区存放 new_java---堆、栈、常量池的存储数据
  9. 智能互联网之数据存储实践
  10. object byte java_Object转byte[];byte[]转Object
  11. Leaflet JS add GeoJSON shape as a hole in a polygon(外多边形内有内多边形)
  12. win10禁用计算机维护,win10哪些服务可以禁用 服务哪些可以禁止启动
  13. win10任务栏透明_Win10 美化软件(简洁篇)
  14. DotNetBar控件的多文档界面的实现
  15. [spm操作] VBM分析中,modulation的作用
  16. 调用百度地图API实现连线高铁线路的调用示例
  17. jinjia2中for循环索引
  18. Win10双击任务栏的QQ图标就会自动隐藏的解决方案
  19. 黑盒测试中的因果图约束条件解释
  20. 软件项目量化管理(CMMI高成熟度)实践经验谈——之项目管理过程监督与控制篇

热门文章

  1. 中国计算机学会CCF推荐国际学术会议和期刊目录(PDF版,2015年)
  2. Angel Borja博士教你如何撰写科学论文三:Writing the first draft of your science paper — some dos and don’ts
  3. Python脱产8期 Day09 2019/4/23
  4. ReactNative用指定的设备/模拟器运行项目
  5. 网内病毒问题快速排除集锦
  6. Linux操作系统上的mysql安装
  7. DNS的子域授权和转发机制,view设置
  8. Javascript右键菜单类
  9. Linux命令行下登录ssl加密的ftp
  10. 基于USES_CONVERSION的W2A用法之CString转char