首页
学习
活动
专区
工具
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篇】PyQt5 超详细教程——由入门到精通(序篇)

检查安装是否成功: 你可以通过终端中运行 pip list 查看是否安装了 PyQt5。...__init__() # 调用父类 QMainWindow 初始化方法 self.setWindowTitle("PyQt5 第一个窗口") # 设置窗口标题 #... PyQt5 中,sys.exit() 用来确保应用程序关闭退出干净,不留任何后台进程。...1.5 PyCharm 中运行程序 确保你 PyQt5 安装正确,并且代码已经保存。 点击 PyCharm 界面顶部绿色 Run 按钮,或者右键点击代码文件并选择 Run ‘main’。...窗口不显示:检查代码中是否调用了 window.show(),没有调用该方法窗口将不会显示。 1.7 总结 PyQt5 是一个非常强大 GUI 框架,适合用于创建桌面应用程序。

1.8K20
  • 用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软件机子上运行呢?

    85120

    【Python篇】PyQt5 超详细教程——由入门到精通(中篇二)

    PyQt5 中,你可以使用 matplotlib 来生成图表,并将这些图表嵌入到 PyQt5 窗口中。...7.2 PyQt5 中嵌入 matplotlib 图表 为了 PyQt5 应用中显示 matplotlib 图表,我们需要使用 matplotlib FigureCanvas。...update_plot() 方法 当用户点击按钮,update_plot() 方法生成一组新随机数据,并调用 self.canvas.plot(data) 更新图表。...每次选择不同图表类型,会触发 currentIndexChanged 信号,调用 update_chart() 方法更新图表。...accept() 方法 当用户点击关闭按钮调用 accept() 方法关闭对话框。accept() 是 QDialog 内置方法,它表示对话框操作已被接受,并会关闭对话框。

    13610

    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

    3.1K11

    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.8K21

    【Python篇】PyQt5 超详细教程——由入门到精通(中篇一)

    槽:槽是一个函数,负责响应信号。当一个信号发出,它会调用与其关联函数。 通过信号与槽机制,PyQt5 实现了控件之间松散耦合,让事件处理更加灵活。...4.2 信号与槽基本用法 我们可以通过以下步骤使用信号与槽机制: 创建一个控件(如按钮、文本框等)。 连接控件信号到一个槽函数(通常是你定义函数)。 当信号触发调用相应函数来执行操作。...每当用户输入或删除文本,程序都会调用函数 text_changed。 self.text_changed(text) 这是槽函数,参数 text 是用户当前输入内容。...当文本内容改变,这个槽函数会被自动调用,并打印出用户输入文本。 4.5 自定义信号与槽 有时候,PyQt5 提供内置信号并不能满足所有需求。...触发自定义信号 当按钮被点击,我们调用 self.comm.my_signal.emit() 触发自定义信号。随后,这个信号会调用关联函数 custom_slot。

    39810

    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.9K31

    『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顶部

    38360

    讲解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对象发出事件,槽是对这些事件做出响应函数。通过信号与槽机制,可以实现对象之间通信和交互。

    51210

    事件与信号

    调用应用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对象即可,调用时括号内参数决定了槽函数必须有什么类型参数,以及发送信号需要传入什么参数。

    28110

    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.6K20

    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

    打造一个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函数,传入问题,返回解答 ?

    81620

    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.2K10

    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.7K21
    领券