In my Python Dash app I would like to show some PyQt5 window pop-ups. These are activated from within in a callback.
Unfortunately, when the pop-ups are shown, I get this warning in the console:
WARNING: QApplication was not created in the main() thread.
My question: how can I create a QApplication in the main() thread if it is called from inside a Python Dash callback?
Below you can find the code which represents a mwe. If you run this snippet, you will see the warning. Apparently, when QApplication is activated from within a callback, it is not run on the main thread (my guess is that app.run_server() is already running on the main thread). How can I modify it so the QApplication is in the main thread?
The example is similar to Use Dash (plot.ly) in PyQt5 GUI but is not the same (I want pyqt5 in Dash, not Dash in pyqt5).
import os, dash
from PyQt5.QtWidgets import QApplication,QMainWindow
from PyQt5.QtCore import QCoreApplication
import dash_html_components as html
from dash.dependencies import Input, Output
class MainWindow(QMainWindow):
#some Qpop up
pass
app = dash.Dash()
app.layout = html.Div(children=[
html.H1(children='Hello Dash'),
#button which, if pressed, created a QApplication in a non-main thread
html.Button("show pop up", id="button"),
html.H2(children='', id='result')
])
#The callback which creates the pop up I want to show.
#This is activated when the button "show pop up" is pressed, and causes the warning to appear
@app.callback(
Output(component_id='result', component_property='children'),
[Input(component_id='button', component_property='n_clicks')]
)
def popUp(n_clicks):
if not n_clicks:
raise dash.exceptions.PreventUpdate
app = QCoreApplication.instance()
if app is None:
app = QApplication([os.getcwd()])
mainWin = MainWindow()
mainWin.show()
app.exec_()
return "You saw a pop-up"
if __name__ == '__main__':
app.run_server(debug=False)