user11729774
user11729774

Reputation:

Python Shell restart after while loop with PyQt5

actually I try to do a displayer of html page. I have some of list of html that I need to display, each page must stay visible while x secondes. But, after the first page is display, the application crash and the python shell restart in consequence.

On my mind, I would create the window to display the page and close the application because after I will try to display png/jpg, so I need to close app to use Pygame for pictures and re-build the app to display html page after. My list looking for it : html page/html page/picture/html page/picture/picture

So I have build a sample code to test in while boucle the displayer :

from PyQt5 import QtWidgets, QtWebEngineWidgets, QtCore
import sys

continuer = True
while continuer:
    print("Application created")
    # Create application
    app = QtWidgets.QApplication(sys.argv)

    # Add window       
    win = QtWidgets.QWidget()
    win.setWindowTitle('My first rendering')

    # Add layout
    layout = QtWidgets.QVBoxLayout()
    win.setLayout(layout)

    # Create QWebView
    view = QtWebEngineWidgets.QWebEngineView()

    view.setUrl(QtCore.QUrl('https://google.com'))

    # Add QWebView to the layout
    layout.addWidget(view)

    # Show window, run app
    win.show()

    QtCore.QTimer.singleShot(7*1000, win.close)
    QtCore.QTimer.singleShot(7*1000, app.quit)
    print("View displayed")

    # While loop
    app.exec_()
    print('Close Application')

print("End While Loop")

Result after executing

It's probably sys.argv in app var the mistake, but I'm new in Python so I don't know how to fix the problem.

Upvotes: 1

Views: 633

Answers (1)

eyllanesc
eyllanesc

Reputation: 244282

The problem is that QApplication is not necessarily eliminated and therefore you would be creating more than one QApplication what Qt forbids, a better solution is to rethink it verifying that if it does not exist then create a new one:

import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets

continuer = True
while continuer:
    print("Application created")
    # Create application
    app = QtWidgets.QApplication.instance()
    if app is None:
        app = QtWidgets.QApplication(sys.argv)
    # Add window
    win = QtWidgets.QWidget()
    win.setWindowTitle("My first rendering")
    # Create QWebEngineView
    view = QtWebEngineWidgets.QWebEngineView()
    view.setUrl(QtCore.QUrl("https://google.com"))
    # Add layout
    layout = QtWidgets.QVBoxLayout(win)
    win.setLayout(layout)
    # Add QWebView to the layout
    layout.addWidget(view)
    # Show window, run app
    win.show()
    QtCore.QTimer.singleShot(7 * 1000, win.close)
    QtCore.QTimer.singleShot(7 * 1000, app.quit)
    print("View displayed")
    # While loop
    app.exec_()
    print("Close Application")

print("End While Loop")

Upvotes: 1

Related Questions