PyQt5界面显示无响应的实现

  

在GUI程序中,主线程也叫GUI线程,因为它是唯一被允许执行GUI相关操作的线程。对于一些耗时的操作,如果放在主线程中,就是出现界面无法响应的问题。

  

  

在编写QT的界面程序时,当我们调用QApplication.exec()时,我们就启动了QT的事件循环。在开始的时候,QT会发出一些事件来显示和绘制窗口部件。在这之后,事件循环就开始运行,不断地检查是不是有事件发生并且把这些事件发送给应用程序中的QObject。

  

当一个事件被处理时,其他事件也可能会产生并且追加到QT的事件队列中。如果我们在处理一个特定的事件上耗费过多的时间,用户界面就会变得不能够响应,例如在口服保存一个观测流程的过程中,一直到文件保存完毕,窗口系统产生的一些事件才会被处
  理。在保存过程中,这个应用程序就不能响应窗口系统的请求来重绘自己。

  

  
      <李>方式一使用多线程:一个处理应用程序用户界面的线程,另外一个执行文件保存的线程。   <李>方法二:调用QApplication.processEvents()   
  

博主推荐使用第二种方法,该方法是在事件处理程序中调用QApplication.processEvents ()。

  

这个函数告诉QT处理来处理任何没有被处理的事件,并且将控制权返回给调用者。实际上,QApplication.exec()就是一个不停调用QApplication.processEvents()函数的小而循环。这种方式的危险性在于,也许用户在观测流程未保存好之前就关闭了主窗口,或者在界面上通过鼠标或键盘执行了其它的输入,以至于观测流程未保存好就企图被程序使用。对于这个问题的解决办法是把qApp→processEvents ();替换为qApp→eventLoop ()→processEvents (QEventLoop:: ExcludeUserInput);通过这个调用告诉QT忽略鼠标和键盘事件。

        …   def downfile(自我、文件、url):   打印(“开始下载:“文件、url)   试一试:   r=请求。get (url,流=True)   张开fd(文件,“世界银行”):   块的r.iter_content ():   fd.write(块)   QApplication.processEvents ()   除了例外e:   打印(“下载失败了”,e)   …      

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -补充一下方法一- - - - - - - - - - - - - - - - - - - - - - - - - - - -》》》》》

  

说实话快有大半年没怎么使用过python了,关于多线程的处理方式,解释可能不是那么清楚。(目前是一个PHP,上半年基本是补PHP方面的基础知识,也就是够用还不精通的一个状态)

  

先上一个半年前的小作品,是关于微信公众号方面的一些。

  

 PyQt5界面显示无响应的实现

  

这里就不谈用途与使用方法了,大概的讲一下,遇到界面假死的处理方法之一。话不多说,先上代码

        从PyQt5。QtCore进口QThread pyqtSignal      类接口(QMainWindow Ui_MainWindow):   ”“”   类文档。   ”“”   def xxxx ():   “此处省略无数行代码……”   self.Work ()      def工作(自我):   自我。线程=RunThread ()   self.thread.start ()      类RunThread (QThread):   # python3, pyqt5与之前的版本有些不一样   #通过类成员对象定义信号对象   # _signal=pyqtSignal (str)      触发=pyqtSignal ()      def __init__(自我,父=None):   超级(RunThread自我). __init__ ()      def __del__(自我):   self.wait ()      def运行(自我):   #处理你要做的业务逻辑,这里是通过一个回调来处理数据,这里的逻辑处理写自己的方法   了解地理。配置(“用户”)=dlg.check_account(“帐户”)   了解地理。配置(“passwd”)=dlg.check_account['密码']   了解地理。配置(jk的)=' http://xxx.com '   如果了解。num !=1:   dlg.operato.config_item (dlg)。配置,dlg.wx_update) #初始化配置   其他:   dlg.operato.config_item (dlg)。配置,dlg.wx_create) #初始化配置      self.trigger.emit ()      

说实话还是蛮喜欢python的这种简洁的写法的,所以在很长的一段时间里,一直是比较注重代码的简洁度与良好的注释.em…,不过在其它语言中很难保持这种初心,现在是比较注重性能,响应时间,并发,安全等问题。

  

这里的接口是主窗口类,如果想在自己的窗口中实现,加一个RunThread类,并在主窗口中定义一个函数,用于调用工作类方法就可以了。通过代码可以看的到,不到50行的代码就实现了方法一中的功能了.pyqt5有很多自己的方法,包括多线程等等。这里提供的是一种思路。当然还有很多种方式实现,大家可以去探索一下,好的方法可以一起分享讨论。

PyQt5界面显示无响应的实现