亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解pyqt5 動畫在QThread線程中無法運行問題

 更新時間:2018年05月05日 08:47:34   作者:蟬時雨  
這篇文章主要介紹了詳解pyqt5 動畫在QThread線程中無法運行問題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

自己做了一個tcp工具,在學(xué)習(xí)動畫的時候踩了坑,需求是根據(jù)上線變綠色,離線變灰色,如果連接斷開了,則變?yōu)榛疑?/p>

問題現(xiàn)象:

可以看到點擊“連接”,“離線”的時候動畫是正常的,但是當(dāng)tcp超時斷開后,雖然離線按鈕變?yōu)檫B接了,卻沒有執(zhí)行離線動畫

關(guān)鍵源代碼如下

class BSJTcpThread(QtCore.QThread):
  recv_signal = QtCore.pyqtSignal(str)
  send_signal = QtCore.pyqtSignal(str)

  def __init__(self, socketcp, onBtn, heartcheck, senBtn, scene):
    super().__init__()
    self.s = socketcp
    self.yqtool = Bianlifunction()
    self.onBtn = onBtn
    self.heartcheck = heartcheck
    self.sendBtn = senBtn
    self.scene1 = scene

  def run(self):
    """線程"""
    global stopsingle
    stopsingle = 0
    while 1:
      btcpreceive = self.s.recv(1024)
      tcpreceive1 = str(binascii.b2a_hex(btcpreceive), encoding="utf-8")

      tcpreceive = ""
      i = 0
      while i < len(tcpreceive1) - 1: # 十六進(jìn)制數(shù)據(jù)處理,兩個字節(jié)隔開
        if i == len(tcpreceive1) - 2:
          tcpreceive += tcpreceive1[i:i + 2]
          i += 2
        else:
          tcpreceive += tcpreceive1[i:i + 2] + " "
          i += 2

      if tcpreceive == "":
        stopsingle = 1
        self.s.shutdown(2)
        self.s.close()
        self.onBtn.setText("連接")
        self.scene1.offlineCol.start() # 啟動離線動畫
        self.heartcheck.setChecked(False)
        self.heartcheck.setVisible(False)
        self.sendBtn.setDisabled(True)
      else:
        self.recv_signal.emit(tcpreceive)
      if stopsingle == 1:
        break

然后再啟動線程

      self.tcpth = BSJTcpThread(self.s, self.onBtn, self.heartcheck, self.sendBtn, self.scene)
      self.tcpth.recv_signal.connect(self.fillrecvmsg)
      self.tcpth.send_signal.connect(self.fillsendmsg)
      self.tcpth.start()

問題點:

經(jīng)過谷爹搜索,終于找到了問題原因詳見https://stackoverflow.com/questions/44328750/pyqt-qgraphicscene-move-item-in-background-thread

大致原因就是QGraphics Scene 不是一個安全的線程對象,我們不能直接在線程中去改變主程序的狀態(tài),我們必須通過信號的方式去更新QGraphics

解決方法:

首先,我們編輯一個信號方法

  def threadAnimate(self, message):
    if message == "1":
      self.scene.offlineCol.start()

然后添加相關(guān)信號槽

self.tcpth = BSJTcpThread(self.s, self.onBtn, self.heartcheck, self.sendBtn)
      self.tcpth.recv_signal.connect(self.fillrecvmsg)
      self.tcpth.send_signal.connect(self.fillsendmsg)
      self.tcpth.animate_signal.connect(self.threadAnimate) # 添加一個動畫信號
      self.tcpth.start()

在線程中發(fā)出離線動畫的信號

class BSJTcpThread(QtCore.QThread):
  recv_signal = QtCore.pyqtSignal(str)
  send_signal = QtCore.pyqtSignal(str)
  animate_signal = QtCore.pyqtSignal(str)

  def __init__(self, socketcp, onBtn, heartcheck, senBtn):
    super().__init__()
    self.s = socketcp
    self.yqtool = Bianlifunction()
    self.onBtn = onBtn
    self.heartcheck = heartcheck
    self.sendBtn = senBtn

  def run(self):
    """線程"""
    global stopsingle
    stopsingle = 0
    while 1:
      btcpreceive = self.s.recv(1024)
      tcpreceive1 = str(binascii.b2a_hex(btcpreceive), encoding="utf-8")

      tcpreceive = ""
      i = 0
      while i < len(tcpreceive1) - 1: # 十六進(jìn)制數(shù)據(jù)處理,兩個字節(jié)隔開
        if i == len(tcpreceive1) - 2:
          tcpreceive += tcpreceive1[i:i + 2]
          i += 2
        else:
          tcpreceive += tcpreceive1[i:i + 2] + " "
          i += 2

      if tcpreceive == "":
        stopsingle = 1
        self.s.shutdown(2)
        self.s.close()
        self.onBtn.setText("連接")
        self.animate_signal.emit("1")
        self.heartcheck.setChecked(False)
        self.heartcheck.setVisible(False)
        self.sendBtn.setDisabled(True)
      else:
        self.recv_signal.emit(tcpreceive)
      if stopsingle == 1:
        break

然后就可以了,這個和QThread多線程收發(fā)消息原理一樣

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • python中virtualenvwrapper安裝與使用

    python中virtualenvwrapper安裝與使用

    本篇文章給大家介紹了python環(huán)境神器virtualenvwrapper安裝與使用,對此有需要的朋友可以跟著操作一下。
    2018-05-05
  • Python通過文本和圖片生成詞云圖

    Python通過文本和圖片生成詞云圖

    這篇文章主要介紹了Python通過文本和圖片生成詞云圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-05-05
  • pycharm?使用conda虛擬環(huán)境的詳細(xì)配置過程

    pycharm?使用conda虛擬環(huán)境的詳細(xì)配置過程

    這篇文章主要介紹了pycharm?使用conda虛擬環(huán)境,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Python中np.argmax()函數(shù)用法示例

    Python中np.argmax()函數(shù)用法示例

    np.argmax是用于取得數(shù)組中每一行或者每一列的的最大值,常用于機器學(xué)習(xí)中獲取分類結(jié)果、計算精確度等,下面這篇文章主要給大家介紹了關(guān)于Python中np.argmax()函數(shù)用法的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • pandas解決數(shù)據(jù)缺失、重復(fù)的方法與實踐過程

    pandas解決數(shù)據(jù)缺失、重復(fù)的方法與實踐過程

    這篇文章主要介紹了pandas解決數(shù)據(jù)缺失、重復(fù)的方法與實踐過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • 利用Python的Django框架生成PDF文件的教程

    利用Python的Django框架生成PDF文件的教程

    這篇文章主要介紹了利用Python的Django框架生成PDF文件的教程,用ReportLab API動態(tài)生成PDF文件,需要的朋友可以參考下
    2015-07-07
  • Python 函數(shù)裝飾器詳解

    Python 函數(shù)裝飾器詳解

    這篇文章主要介紹了Python函數(shù)裝飾器,結(jié)合實例形式詳細(xì)分析了Python裝飾器的原理、功能、分類、常見操作技巧與使用注意事項,需要的朋友可以參考下
    2021-10-10
  • pytorch hook 鉤子函數(shù)的用法

    pytorch hook 鉤子函數(shù)的用法

    這篇文章主要介紹了pytorch hook 鉤子函數(shù)的用法,Hook 是 PyTorch 中一個十分有用的特性,使用后可以不必改變網(wǎng)絡(luò)輸入輸出的結(jié)構(gòu),方便地獲取、改變網(wǎng)絡(luò)中間層變量的值和梯度,下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-03-03
  • Python編程不要再使用print調(diào)試代碼了

    Python編程不要再使用print調(diào)試代碼了

    這篇文章主要為大家介紹了Python編程中代碼的調(diào)試技巧,不要只會用print調(diào)試哦~其他的Python調(diào)試技巧,大家來一起共同學(xué)習(xí)下吧,祝大家多多進(jìn)步,早日升職加薪
    2021-10-10
  • 下載官網(wǎng)python并安裝的步驟詳解

    下載官網(wǎng)python并安裝的步驟詳解

    在本篇文章里小編給大家整理了關(guān)于下載官網(wǎng)python并安裝的步驟詳解,需要的朋友們參考學(xué)習(xí)下。
    2019-10-10

最新評論