• <tfoot id='yeMMY'></tfoot>
  • <i id='yeMMY'><tr id='yeMMY'><dt id='yeMMY'><q id='yeMMY'><span id='yeMMY'><b id='yeMMY'><form id='yeMMY'><ins id='yeMMY'></ins><ul id='yeMMY'></ul><sub id='yeMMY'></sub></form><legend id='yeMMY'></legend><bdo id='yeMMY'><pre id='yeMMY'><center id='yeMMY'></center></pre></bdo></b><th id='yeMMY'></th></span></q></dt></tr></i><div id='yeMMY'><tfoot id='yeMMY'></tfoot><dl id='yeMMY'><fieldset id='yeMMY'></fieldset></dl></div>

    <small id='yeMMY'></small><noframes id='yeMMY'>

    <legend id='yeMMY'><style id='yeMMY'><dir id='yeMMY'><q id='yeMMY'></q></dir></style></legend>
      <bdo id='yeMMY'></bdo><ul id='yeMMY'></ul>

      1. python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

        时间:2023-12-15

      2. <i id='U23Wf'><tr id='U23Wf'><dt id='U23Wf'><q id='U23Wf'><span id='U23Wf'><b id='U23Wf'><form id='U23Wf'><ins id='U23Wf'></ins><ul id='U23Wf'></ul><sub id='U23Wf'></sub></form><legend id='U23Wf'></legend><bdo id='U23Wf'><pre id='U23Wf'><center id='U23Wf'></center></pre></bdo></b><th id='U23Wf'></th></span></q></dt></tr></i><div id='U23Wf'><tfoot id='U23Wf'></tfoot><dl id='U23Wf'><fieldset id='U23Wf'></fieldset></dl></div>

          <tfoot id='U23Wf'></tfoot>

          <small id='U23Wf'></small><noframes id='U23Wf'>

            <bdo id='U23Wf'></bdo><ul id='U23Wf'></ul>
            <legend id='U23Wf'><style id='U23Wf'><dir id='U23Wf'><q id='U23Wf'></q></dir></style></legend>

                <tbody id='U23Wf'></tbody>
                • 下面是详细的攻略。

                  Python GUI库图形界面开发之PyQt5线程类QThread详细使用方法

                  在PyQt5中,线程类QThread被用来处理一些耗时的操作,以避免把这些操作放在主线程中引起其卡顿或者假死。下面我们详细讲解QThread的使用方法。

                  QThread的使用方法

                  1.导入必要的模块和类

                  import sys
                  from PyQt5.QtCore import QThread, pyqtSignal
                  from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar
                  

                  2.自定义线程类

                  需要继承QThread,并添加需要执行的方法,使用pyqtSignal来发射信号。

                  class MyThread(QThread):
                      # 自定义信号,代表运算完毕后传递的参数类型为int
                      result = pyqtSignal(int)
                  
                      def __init__(self, parent=None):
                          super().__init__(parent)
                  
                      def run(self):
                          # 这里面是需要执行的代码,可以新开一个线程去执行
                          for i in range(101):
                              self.result.emit(i)
                              self.msleep(100) # 线程休眠0.1s
                  

                  3.创建窗口类

                  创建一个窗口类,添加需要的控件。

                  class MainWindow(QMainWindow):
                      def __init__(self, parent=None):
                          super().__init__(parent)
                  
                          # 添加按钮和进度条
                          self.btn_start = QPushButton('Start', self)
                          self.btn_start.setGeometry(10, 10, 60, 30)
                          self.progress_bar = QProgressBar(self)
                          self.progress_bar.setGeometry(80, 10, 200, 30)
                  

                  4.创建槽函数和信号连接

                  创建槽函数,即当接收到信号时执行的函数。通过如下代码来连接自定义信号和槽函数:

                  self.thread = MyThread(self)
                  self.thread.result.connect(self.step)
                  

                  5.添加槽函数的实现代码

                  实现槽函数代码,在其中更新进度条。

                  def step(self, val):
                      self.progress_bar.setValue(val)
                  

                  6.启动线程

                  点击按钮,启动线程,执行自定义线程类的代码。

                  def start_thread(self):
                      self.thread.start()
                  

                  到此,使用QThread来实现多线程的基本过程就完成了,下面可以看两个示例:

                  示例1:线程内部执行自带循环

                  这里我们在自定义线程类中使用了while循环,开启线程后便会不断运行。每次运行都会发射一个信号,用于更新窗口中的进度条。

                  import sys
                  from PyQt5.QtCore import QThread, pyqtSignal
                  from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar
                  
                  class MyThread(QThread):
                      result = pyqtSignal(int)
                  
                      def __init__(self, parent=None):
                          super().__init__(parent)
                  
                      def run(self):
                          i = 0
                          while True:
                              i = i + 1 if i < 100 else 1
                              self.result.emit(i)
                              self.msleep(100)
                  
                  class MainWindow(QMainWindow):
                      def __init__(self, parent=None):
                          super().__init__(parent)
                  
                          self.btn_start = QPushButton('Start', self)
                          self.btn_start.setGeometry(10, 10, 60, 30)
                  
                          self.progress_bar = QProgressBar(self)
                          self.progress_bar.setGeometry(80, 10, 200, 30)
                  
                          self.thread = MyThread(self)
                          self.thread.result.connect(self.step)
                          self.btn_start.clicked.connect(self.start_thread)
                  
                      def step(self, val):
                          self.progress_bar.setValue(val)
                  
                      def start_thread(self):
                          self.thread.start()
                  
                  app = QApplication(sys.argv)
                  main_win = MainWindow()
                  main_win.show()
                  app.exec_()
                  

                  示例2:线程使用参数

                  这里我们在线程类中创建一个参数,启动线程时传入,线程运行时使用该参数执行操作,并将操作结果作为信号传递给窗口类中的槽函数更新进度条。

                  import sys
                  from PyQt5.QtCore import QThread, pyqtSignal
                  from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QProgressBar
                  
                  class MyThread(QThread):
                      result = pyqtSignal(int)
                  
                      def __init__(self, parent=None):
                          super().__init__(parent)
                          self._loop_cnt = 0
                  
                      def set_cnt(self, cnt):
                          self._loop_cnt = cnt
                  
                      def run(self):
                          for i in range(1, self._loop_cnt+1):
                              self.result.emit(i)
                              self.msleep(100)
                  
                  class MainWindow(QMainWindow):
                      def __init__(self, parent=None):
                          super().__init__(parent)
                  
                          self.btn_start = QPushButton('Start', self)
                          self.btn_start.setGeometry(10, 10, 60, 30)
                  
                          self.progress_bar = QProgressBar(self)
                          self.progress_bar.setGeometry(80, 10, 200, 30)
                  
                          self.thread = MyThread(self)
                          self.thread.result.connect(self.step)
                          self.btn_start.clicked.connect(self.start_thread)
                  
                      def step(self, val):
                          self.progress_bar.setValue(val)
                  
                      def start_thread(self):
                          self.thread.set_cnt(100)
                          self.thread.start()
                  
                  app = QApplication(sys.argv)
                  main_win = MainWindow()
                  main_win.show()
                  app.exec_()
                  

                  这两个示例都是非常实用的,希望对大家有所帮助。

                  上一篇:Python自定义线程池实现方法分析 下一篇:Python实现读取文件最后n行的方法

                  相关文章

                • <tfoot id='LyYh0'></tfoot>

                    <i id='LyYh0'><tr id='LyYh0'><dt id='LyYh0'><q id='LyYh0'><span id='LyYh0'><b id='LyYh0'><form id='LyYh0'><ins id='LyYh0'></ins><ul id='LyYh0'></ul><sub id='LyYh0'></sub></form><legend id='LyYh0'></legend><bdo id='LyYh0'><pre id='LyYh0'><center id='LyYh0'></center></pre></bdo></b><th id='LyYh0'></th></span></q></dt></tr></i><div id='LyYh0'><tfoot id='LyYh0'></tfoot><dl id='LyYh0'><fieldset id='LyYh0'></fieldset></dl></div>
                        <bdo id='LyYh0'></bdo><ul id='LyYh0'></ul>

                    1. <small id='LyYh0'></small><noframes id='LyYh0'>

                    2. <legend id='LyYh0'><style id='LyYh0'><dir id='LyYh0'><q id='LyYh0'></q></dir></style></legend>