2017-07-10 68 views
0

在基於GUI的http服務器上搜索(因爲我需要通過我的程序做一些GUI通知,所以當休息GET時會被捕獲)。找到this解決方案。如何做這樣的事情正確(變型下面是不行的):如何用燒瓶桌面創建新窗口

@app.route('/') 
def main(): 
    # Create declarative and use it how I want 

    view = QDeclarativeView() 
    # Create an URL to the QML file 
    url = QUrl('view.qml') 
    # Set the QML file and show 
    view.setSource(url) 
    view.show() 
+0

您是否使用PyQt4的或pyqt5?你想使用qml嗎? – eyllanesc

+0

想要使用qml,非常基本的功能,我認爲在這種情況下沒有區別,如果我使用puqt4或pyqt5。同時我實際上使用了piside。 – Juriy

+0

QDeclarativeView在PyQt5中不存在。 – eyllanesc

回答

0

的GUI創建一個無限循環,如果QT(PyQt4的,pyqt5和pyside)做到這一點通過功能exec_(),瓶也需要兩者不能在同一個線程中共存的原因相同,因此我們爲Flask創建了一個新線程。

在這個線程中,我們將通過信號發送數據到主線程,這將負責顯示數據。

以下代碼實現了上述內容。

*的.py

from flask import Flask 
from PySide import QtCore, QtGui, QtDeclarative 

import sys 

app = Flask(__name__) 

@app.route('/') 
def main(): 
    w = FlaskThread._single 
    date = QtCore.QDateTime.currentDateTime() 
    w.signal.emit("date: {} function: {}".format(date.toString("dd.MM.yyyy hh:mm:ss.zzz"), "main")) 
    return "Hello world!" 

class FlaskThread(QtCore.QThread): 
    signal = QtCore.Signal(str) 
    _single = None 
    def __init__(self, application): 
     QtCore.QThread.__init__(self) 
     if FlaskThread._single: 
      raise FlaskThread._single 
     FlaskThread._single = self 
     self.application = application 

    def __del__(self): 
     self.wait() 

    def run(self): 
     self.application.run() 


def provide_GUI_for(application): 
    qtapp = QtGui.QApplication(sys.argv) 

    webapp = FlaskThread(application) 

    view = QtDeclarative.QDeclarativeView() 
    url = QtCore.QUrl('view.qml') 
    view.setSource(url) 
    root = view.rootObject() 
    webapp.signal.connect(lambda text: root.setProperty("text", text)) 

    view.show() 

    qtapp.aboutToQuit.connect(webapp.terminate) 
    QtGui.QApplication.setQuitOnLastWindowClosed(False) 

    webapp.start() 

    return qtapp.exec_() 


if __name__ == '__main__': 
    sys.exit(provide_GUI_for(app)) 

view.qml

import QtQuick 1.0 

Text { 
    width: 320 
    height: 240 
    text: "nothing" 
    color: "red" 
    horizontalAlignment: Text.AlignHCenter 
} 
+0

正如我認爲有信號..謝謝你漂亮的實施。 – Juriy