日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

發(fā)布時間:2025/3/21 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 wxPython多线程界面卡死或在不同平台崩溃问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、測試程序界面

?

二、不使用多線程代碼如下(當(dāng)點擊開啟日志的時候,直接導(dǎo)致界面卡死)

#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="關(guān)閉日志", 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="關(guān)閉日志", 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進行線程之間消息通訊來實現(xiàn))

python3多線程threading功能強大,結(jié)合jion()和setDaemon()函數(shù)使用更靈活,使用多線程時首先想到了threading, 但wxpython是用python寫的一個UI框架,其本身自帶有多線程函數(shù):

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

其中,wx.CallLater是最抽象的線程安全函數(shù),其次是callAfter,最后是PostEvent。舍去這三個,直接使用threading導(dǎo)致UI出現(xiàn)卡頓,卡死等情況。結(jié)合wxpython自帶的多線程函數(shù)效果很好。

pubsub模塊中,pub.subscribe 可以理解為注冊一個接收消息的方法;pub.sendMessage 可以理解為發(fā)送消息給上一步注冊的方法

實現(xiàn)代碼:

#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="關(guān)閉日志", 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()

?

?

總結(jié)

以上是生活随笔為你收集整理的wxPython多线程界面卡死或在不同平台崩溃问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 茄子av在线 | 五月天爱爱 | 欧美激情亚洲综合 | 呦女精品 | 麻豆av免费观看 | 天天射天天 | 污片视频在线观看 | 丁香婷婷在线 | 99热最新网址 | 欧美成人自拍视频 | xxsm.com| 日本艳妇 | 久久精品免费在线观看 | 韩国三色电费2024免费吗怎么看 | 激情久久婷婷 | 日本亲与子乱xxx | 四虎成人免费视频 | 男女男精品视频网站 | 精品在线播放视频 | 91视频国产精品 | 狠狠狠狠狠狠干 | 黄色网占| 婷婷综合在线 | 欧美午夜理伦三级在线观看 | 亚洲天堂一区二区在线 | 亚洲又粗又长 | 欧美日韩精品 | 青青草香蕉 | 国产又粗又猛又黄又爽的视频 | 美腿丝袜亚洲色图 | 国产一线二线三线女 | 一区二区三区免费播放 | 亚洲精品国产成人av在线 | 欧美图片一区二区三区 | 欧美 亚洲 一区 | 青青操在线视频 | 麻豆av一区二区三区 | 日本中文字幕影院 | 三女警花合力承欢猎艳都市h | va在线视频 | 在线免费av观看 | 亚洲一区黄色 | 欧美精品一区二区免费 | 日韩视频网 | 亚洲午夜精品一区二区 | 热热热av | 亚洲一区二区三区四区 | 在线观看av网页 | 日本电影一区二区三区 | 免费在线黄 | 天天看夜夜 | 韩日av在线 | 超91在线| 国产精品无码一区 | 在线视频中文字幕 | 嫩草影院一区二区 | 欧美性色网站 | 性高潮在线观看 | 欧美zozo | av女大全列表 | 国产三级在线播放 | 亚洲成av人片一区二区梦乃 | 一级大片儿| 国产视频一区二区 | 伊人网在线播放 | 91精品国产一区二区三区蜜臀 | 国产经典三级 | 国产一级理论 | 91视频青青草 | 日本公妇乱淫免费视频一区三区 | 小柔好湿好紧太爽了国产网址 | 亚洲调教欧美在线 | 欧美极品在线播放 | 日产精品久久久久久久蜜臀 | 伊人网在线免费观看 | 天天爱天天干天天操 | 国产精品成人Av | 国产视频一区三区 | 欧美性受xxxx黑人xyx性 | 国产精品婷婷 | 国产一区二区三区 | 色综合久久精品亚洲国产 | 91香蕉视频污污 | 欧美丰满老妇熟乱xxxxyyy | 日韩色图视频 | 国产+日韩+欧美 | 欧美日韩精品久久久免费观看 | 国产日产久久高清欧美一区 | 色婷婷综合激情 | 国内自拍视频在线观看 | 久久久久久久人妻无码中文字幕爆 | 国产黄色片在线观看 | 亚欧美日韩 | 中文字幕乱码人妻无码久久95 | 99国产精品国产免费观看 | 欧美成本人视频 | 精品在线免费观看 | 国产精品178页 | 黄色片网站在线观看 |