首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

PyQt5: QMainWindow在调用长时间运行的函数时冻结

PyQt5是一个用于创建图形用户界面(GUI)的Python库。它是Qt框架的Python绑定,Qt是一个跨平台的应用程序开发框架,可以用于开发桌面应用程序、移动应用程序和嵌入式系统。

QMainWindow是PyQt5中的一个类,用于创建主窗口。在调用长时间运行的函数时,如果没有采取措施,主窗口可能会被冻结,导致用户无法与应用程序进行交互。为了避免这种情况,可以使用多线程或异步编程来处理长时间运行的函数。

一种常见的方法是使用多线程。可以创建一个新的线程,在该线程中运行长时间运行的函数,这样主线程就不会被阻塞。在PyQt5中,可以使用QThread类来创建新的线程,并使用信号(signal)和槽(slot)机制在主线程和子线程之间进行通信。

以下是一个使用多线程处理长时间运行的函数的示例代码:

代码语言:txt
复制
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt5.QtCore import QThread, pyqtSignal

class WorkerThread(QThread):
    finished = pyqtSignal()  # 定义一个信号,用于通知主线程任务完成

    def run(self):
        # 长时间运行的函数
        self.long_running_function()
        self.finished.emit()  # 发送信号,通知主线程任务完成

    def long_running_function(self):
        # 长时间运行的代码
        pass

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.button = QPushButton("Run", self)
        self.button.clicked.connect(self.start_long_running_function)

    def start_long_running_function(self):
        self.button.setEnabled(False)  # 禁用按钮,避免重复点击
        self.thread = WorkerThread()
        self.thread.finished.connect(self.on_thread_finished)
        self.thread.start()

    def on_thread_finished(self):
        self.button.setEnabled(True)  # 启用按钮
        # 长时间运行的函数完成后的处理

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在上述代码中,创建了一个WorkerThread类,继承自QThread。在run方法中运行长时间运行的函数,并在完成后发送finished信号。在MainWindow类中,创建了一个按钮,点击按钮时会启动一个新的线程来处理长时间运行的函数。在长时间运行的函数完成后,会调用on_thread_finished方法进行处理。

除了多线程,还可以使用异步编程来处理长时间运行的函数。在Python中,可以使用asyncio库来实现异步编程。可以将长时间运行的函数定义为一个协程,并使用await关键字来等待其完成。在PyQt5中,可以使用QEventLoop类来创建事件循环,以便在主线程中运行协程。

以下是一个使用异步编程处理长时间运行的函数的示例代码:

代码语言:txt
复制
import asyncio
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton
from PyQt5.QtCore import QEventLoop

async def long_running_function():
    # 长时间运行的代码
    await asyncio.sleep(5)  # 模拟长时间运行

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.button = QPushButton("Run", self)
        self.button.clicked.connect(self.start_long_running_function)

    def start_long_running_function(self):
        self.button.setEnabled(False)  # 禁用按钮,避免重复点击
        loop = QEventLoop(self)
        asyncio.set_event_loop(loop)
        loop.run_until_complete(long_running_function())
        loop.close()
        self.button.setEnabled(True)  # 启用按钮
        # 长时间运行的函数完成后的处理

if __name__ == "__main__":
    app = QApplication([])
    window = MainWindow()
    window.show()
    app.exec_()

在上述代码中,定义了一个long_running_function协程,使用async关键字定义,并使用await关键字等待其完成。在MainWindow类中,创建了一个按钮,点击按钮时会禁用按钮,并创建一个QEventLoop对象来运行协程。在协程完成后,启用按钮,并进行长时间运行的函数完成后的处理。

总结起来,为了避免在调用长时间运行的函数时冻结QMainWindow,可以使用多线程或异步编程来处理。使用多线程时,可以创建一个新的线程来运行长时间运行的函数,并使用信号和槽机制在主线程和子线程之间进行通信。使用异步编程时,可以将长时间运行的函数定义为一个协程,并使用await关键字等待其完成,使用QEventLoop来运行协程。这样可以确保长时间运行的函数在后台运行,不会阻塞主线程,从而保持QMainWindow的响应性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

python GUI库图形界面开发之PyQt5QMainWindow, QWidget以及QDialog区别和选择

Qt界面分类 Qt Designer设计界面,首先需要选择界面模板,主要分为三个类: Main Window Widget Dialog 2....继承使创建当用户点击菜单项或者工具条按钮调用槽成为可能。你也可以使用Qt设计器来创建主窗口。我们将简要地回顾一下有关添加菜单项和工具条按钮,然后描述QMainWindow自己便捷。...QWidget有很多成员函数,但是它们中一些有少量直接功能:例如,QWidget有一个字体属性,但是它自己从来不用。...Qt中,QMainWindow和和不同QDialog子类是最普通顶级窗口。 一个没有父窗口部件窗口部件一直是顶级窗口部件。 3....如何选择QMainWindow,QWidget,QDialog 大致理解是: QMainWindow是完整窗体,window上可以加入widget,适合于完整项目,因为它封装了toolbar,statusbar

2.8K11

用QT来做工具

界面与业务逻辑分离实现 这一步主要实现业务逻辑,也就是点击登录和退出按钮后程序要执行操作。为了后续维护方便,采用界面与业务逻辑相分离来实现。也就是通过创建主程序调用界面文件方式实现。这有2个好处。...#导入程序运行必须模块 import sys #PyQt5中使用基本控件都在PyQt5.QtWidgets模块中 from PyQt5.QtWidgets import QApplication, QMainWindow...#导入程序运行必须模块 import sys #PyQt5中使用基本控件都在PyQt5.QtWidgets模块中 from PyQt5.QtWidgets import QApplication, QMainWindow...调用close函数 self.cancel_Button.clicked.connect(self.close) def display(self): #利用line...不是所有人电脑上都安装有python软件或者对应python版本以及PyQt5工具。那么如何让程序在这些未安装python软件机子上运行呢?

81320

『PyQt5-基础篇』| 01 简单基础了解

QtGui基本图形功能类,如窗口集、事件处理、2D图形、基本图像和界面、字体和文本类等QtWidgets一整套UI元素控件,用于建立符合系统风格Classic界面,可在安装选择是否使用此功能QtMultimedia...网络编程类库,提供TCP/IP及UDPC/S代码集合QtPositioning 获取位置信息,比如卫星、无线网、文字信息等Enginio构建客户端应用程序库,运行时访问Qt Cloud 服务器托管应用程序...基于WebKit1网络浏览器QtXml用于处理XML类库,为SAX和DOM API 实现提供了函数QtSvg一组类库,为显示矢量图形文件内容提供了函数QtSql数据库对象接口QtTest单元测试...使用PyQt扩展Qt DesignerQt将所有模块中类综合到一个单一模块中 uic 处理.ui文件2.2 PyQt5主要类PyQt5 API拥有620多个类和6000个函数;以下是主要类和说明:...,用于弹出列表QMenuBar横向菜单栏 QStatusBar适合呈现状态信息水平条,通常放在QMainWindow底部QToolBar工具栏,可以包含多个命令按钮,通常放在QMainWindow顶部

28860

python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法

注意使用QWebEngineView对象setHTML()函数渲染HTml页面,如果页面中使用JavaScript代码超过2M,程序渲染就会失败 QWebEngineView调用JavaScript...,JavaScript代码解耦,便于开发人员进行分工协作,PyQt对象中,访问JavaScript核心代码如下 QWebEnginePage.runJavaScript(str,Callable...代码分析 本例中,初始化一个QWebEngineView对象,对象名称View,然后通过View。page()函数获得一个QWebEnginePage对象,就可以访问整个web界面了。...这个QWebEnginePage对象有一个异步runJavaScript()函数,需要一个回调函数接收结果,其核心代码如下 def js_callback( result ): print(result...浏览器控件QWebEngineView使用方法,包括使用QWebEngineView调用JavaScript代码,更多关于PyQt5浏览器控件QWebEngineView使用方法请查看下面的相关链接

2.8K31

python GUI库图形界面开发之PyQt5工具栏控件QToolBar详细使用方法与实例

PyQt5工具栏控件QToolBar介绍 QToolBar控件是由文本按钮,图标或其他小控件按钮组成可移动面板,通常位于菜单栏下方 QToolBar类中常用方法 方法 描述 addAction()...添加具有文本或图标的工具按钮 addSeperator() 分组显示工具按钮 addWidget() 添加工具栏中按钮以外控件 addToolBar() 使用QMainWindow方法添加一个新工具栏...setMovable() 工具变得可移动 setOrientation() 工具栏方向可以设置为Qt.Horizontal或Qt.certical 每当单击工具栏中按钮,都将发射actionTriggered...信号,另外,这个信号将关联QAction对象引用发到连接函数上 QToolBar使用实例 import sys from PyQt5.QtGui import * from PyQt5.QtWidgets...QToolBar代码分析 在这个例子中,首先调用addToolBar()方法工具栏区域添加文件工具栏 tb=self.addToolBar('File') 然后,添加具有文本标题工具按钮,工具栏通常包含图形按钮

1.7K21

讲解pyqt5 opengl demo

本篇文章中,我们将讲解如何使用 PyQt5 创建一个简单 OpenGL Demo。步骤1: 安装 PyQt5首先,我们需要安装 PyQt5 库。... paintGL 方法中,我们首先设置了背景颜色,并通过 glClear 方法清除颜色缓冲区。步骤4: 运行 Demo现在,我们已经完成了一个简单 PyQt5 OpenGL Demo。...当用户点击鼠标左键OpenGL窗口中绘制一个红色点,并更新显示。 运行这段代码后,将会弹出一个窗口。当你在窗口内点击鼠标左键,会在点击位置绘制一个红色点。...下面是对PyQt5一些详细介绍:跨平台支持:PyQt5基于Qt库开发,因此可以实现跨平台支持,可以不同操作系统(如Windows、MacOS、Linux等)上运行。...信号与槽机制:PyQt5采用Qt库信号与槽机制,这是一种强大事件驱动编程模型。信号是Qt对象发出事件,槽是对这些事件做出响应函数。通过信号与槽机制,可以实现对象之间通信和交互。

34110

事件与信号

调用应用exec_()方法,应用会进入主循环,主循环会监听和分发事件。 事件模型中,有三个角色: 事件源 事件 事件目标 事件源是状态发生改变对象。它产生了事件。...事件触发时候,发生一个signal,slot是用来被Python调用(相当于一个句柄,相当于事件绑定函数)slot只有事件触发时候才能调用 Signals & slots(信号与槽) #!...重写事件处理函数 PyQt中事件处理通常通过重写事件处理函数来处理 #!...buttonClicked()方法中,我们通过调用sender()方法确定我们点击了哪个按钮 。 两个按钮都连接到同一个插槽(slot)。...当触发鼠标点击事件信号会被发射。信号连接到了QMainWindowclose()方法。 信号使用了pyqtSignal()方法创建,并且成为外部类Communicate类属性。

1.2K20

全志H618上用OpenCV读取图像显示到PyQt5窗口上

OpenCV能够处理图像、视频、深度图像等各种类型视觉数据,某些情况下,尽管OpenCV可以显示窗口,但PyQt5可能更适合用于创建复杂交互式应用程序,而自带GPUH618就成为了这些图像显示最佳载体...__file__) 放入一点辅助代码,一个是为了实现从远程命令行运行qt程序显示到桌面上,一个是为了命令行下可以按ctrl+c快捷键来强制退出qt程序 #【可选代码】允许远程运行 import os...这里我修改了鼠标点击后会被自动调用mousePressEvent和窗口绘制时会被调用paintEvent class WINDOW(QtWidgets.QMainWindow): def...() 直接在线程内调用函数去修改qt窗口内容,不能满足线程安全。...因为我们这个线程类继承自QThread,所以可以类内定义信号。只需要实例化一个pyqtSignal对象即可,调用时括号内参数决定了槽函数必须有什么类型参数,以及发送信号需要传入什么参数。

19010

python GUI库图形界面开发之PyQt5状态栏控件QStatusBar详细使用方法实例

PyQt5状态栏控件QStatusBar简介 MainWindow对象底部保留有一个水平条,作为状态栏(QstatusBar),用于显示永久或临时状态信息 QStatusBar类中常用方法 方法...描述 addWidget() 状态栏中添加给定窗口小控件对象 addPermanentWidget() 状态栏中永久添加给定窗口小控件对象 showMessage() 状态栏显示一条临时信息,...QStatusBar代码分析 在这个例子中,顶层窗口MainWindow有一个菜单栏和一个QTextEdit对象,作为中心控件 当单击MenuBar菜单,将triggered信号与槽函数进行绑定 #...当菜单对象被点击,触发绑定自定义函数 file.triggered[QAction].connect(self.processTrigger) 当单击show菜单选项,会在状态栏提示信息,5秒后消失...#设置状态栏显示文本以及显示时间 self.statusBar.showMessage(q.text()+'菜单选项被点击了',5000) 通过主窗口QMainWindowsetStatusBar

2.6K21

打造一个window桌面应用:在线聊天对话机器人

01 界面设计 1.安装pyqt5 1.安装PyQt5工具 pip install PyQt5 2.安装Qt Designer图形界面开发工具 pip install PyQt5-tools 2.设计界面...搜索框中搜索:Desginer ?...02 后端处理 1.启动界面 提示:这个chenge.py文件是无法执行运行,我们需要新建一个主函数调用chenge.py 辰哥这里新建了一个py文件:main.py ?...编辑main.py import sys import chenge # GUI文件名称,chenge.ui from PyQt5.QtWidgets import QApplication, QMainWindow...这时候界面点击和输入是无反应,只能看不能用!下面开始进行编写控件处理逻辑。 2.接入图灵机器人 main.py文件中新建一个chat函数方法:通过调用chat函数,传入问题,返回解答 ?

76620

python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar详细使用方法与实例

PyQt5菜单栏控件QMenuBar介绍 QMenuBarQMainWindow对象标题栏下方,水平QMenuBar被保留显示QMenu对象 QMenuBar类提供了一个可以包含一个或多个QAction...,通过addAction()函数可以菜单中进行添加操作 设计菜单系统时常用一些重要方法 方法 描述 menuBar() 返回主窗口QMenuBar对象 addMenu() 菜单栏中添加一个新QMenu...title() 返回QMenu小控件标题 单击任何QAction按钮,QMenu对象都会发射triggered信号 QMenuBar使用实例 import sys from PyQt5.QtGui...processtrigger()该函数接受信号QAction对象 file.triggered[QAction].connect(self.processtrigger) 本文详细讲解了PyQt5菜单栏控件...QMenuBar使用方法与实例,更多关于PyQt5菜单栏控件使用知识请查看下面的相关链接

3K31

Qt For Python按钮控件使用实例

创建一个按钮 PyQt5/PySide2中,按钮控件名为QPushButton(),其位于QtWidgets子模块之下。...创建按钮控件之前,我们先来创建一个包含布局层图形界面主窗口,作为按钮控件容器,代码如下所示: # coding:utf-8 from PyQt5 import QtWidgets import sys...我们将其添加到上面创建主窗口中,代码如下所示: # coding:utf-8 from PyQt5 import QtWidgets import sys class ButtonApp(QtWidgets.QMainWindow...设置按钮状态 除此之外,我们可以通过setEnabled()方法,设置按钮状态,传入值为True,表示按钮可用,传入值为False,表示按钮禁用,代码如下所示: from PyQt5 import...按钮点击事件 对于按钮来说,最常见还是点击事件,PyQt5和PySide2中,已经内置了点击事件,我们可以直接对其进行调用,代码如下所示: from PyQt5 import QtWidgets,QtGui

4.1K10

pycharm pyqt5图形界面UI配置

一.安装pyqt5 打开图形界面designer 执行命令: pip(或pip3) install pyqt5 安装完成可能没有Qt designer.exe 文件,此时需要安装Qt 工具包:...可以直接在pycharm中tools中添加designer工具,以后直接从pycharm启动,如图: 以后可以直接调用外部工具external tools使用pyqt5UI界面,可参考链接:...\Anaconda3\Scripts 同理将pycc5添加到环境变量:(省略) 因此有三个外部工具可供使用pyqt5/pyuic5/pyrcc pyuic5:(命令行) 命令台:找到当前工作路径:...pyuic5 -o XXX.py XXX.ui(为你要转化UI文件)如:pyuic5 -o ui2py.py untitled.ui 如图: 转为.py文件之后还不能直接运行,需要在代码最后加上...: import sys from PyQt5.QtWidgets import QApplication, QMainWindow if __name__ == '__main__':

1.3K20

python 写函数一定条件下需要调用自身写法说明

此时箭头所指地方,所输入0传给了其他条件下,第二次运行函数状态下,第一个状态仍为1,并未改变,因此退出了第二次运行函数后,仍然会继续运行第一个函数中state = 1循环,导致还得再次输入...0去改变state值才能停止运行 因此,再次调用函数语句后面,应该加一句breaK语句,直接退出当前循环,避免出现函数执行效果达不到预期效果, 加入break以后截图: ?...break为跳出本层循环,只影响一层 continue为跳出本次循环,进行下一次循环 return为为直接跳出当前函数 补充知识:python中调用自己写方法或函数function 一、command...3 输入 myfunc.函数名(参数) 二、IDE编辑器中调用 import sys sys.path.append(r'D:\') import mymodule mymodule.function...list.print_l(movies) 以上这篇python 写函数一定条件下需要调用自身写法说明就是小编分享给大家全部内容了,希望能给大家一个参考。

1.1K20

详解AttributeError: PyQt5.QtCore.pyqtSignal object has no attribute connect

本文将详细解释该错误原因和解决方法。错误原因该错误通常是由以下情况引起:信号名称拼写错误:连接信号与槽,可能会发生拼写错误。...如果信号对象名称拼写错误,PyQt5库就无法找到相应connect()方法,从而引发该错误。错误引用信号对象:代码中引用信号对象可能发生错误。...错误导入信号对象:导入PyQt5模块,可能会有错误导入语句或忘记导入相关模块,导致PyQt5无法正确识别信号对象,从而无法调用connect()方法。...通过使用clicked信号和change_text槽函数连接,当按钮被点击,就会调用change_text方法,从而实现了标签文本更改。...跨平台性: PyQt5是跨平台,可以多个操作系统上运行,包括Windows、macOS、Linux等。这意味着开发人员可以使用相同代码不同平台上构建应用程序,提高了开发效率。

50010
领券