В моем приложении Python Da sh я хотел бы показать некоторые всплывающие окна PyQt5. Они активируются изнутри в обратном вызове.
К сожалению, когда отображаются всплывающие окна, в консоли появляется следующее предупреждение:
ПРЕДУПРЕЖДЕНИЕ: QApplication не было создано в Поток main ().
Мой вопрос: как мне создать QApplication в потоке main (), если он вызывается из Python Da sh callback?
Ниже вы можете найти код, который представляет mwe. Если вы запустите этот фрагмент, вы увидите предупреждение. По-видимому, когда QApplication активируется из обратного вызова, он не запускается в основном потоке (я предполагаю, что app.run_server () уже запущен в основном потоке). Как я могу изменить его, чтобы приложение QApplication находилось в главном потоке?
Пример похож на Использовать Da sh (plot.ly) в PyQt5 GUI, но это не тоже самое (я хочу pyqt5 в Da sh, а не Da sh в 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)