-->

瓶与PyQt5 - 瓶控制程序流程?(Flask versus PyQt5 - Flask con

2019-10-29 07:10发布

瓶似乎防止PyQt5 UI无法更新。

相应的代码工作正常进行或者PyQt5或瓶 - 却不能在一起。 据我所知,它可能需要做和穿线方式设立。

任何援助将不胜感激。 TIA。

`

import sys
import serial
import threading

from PyQt5.QtWidgets import QWidget, QLabel, QApplication
from flask import Flask, render_template, request, redirect, url_for

app1 = Flask(__name__)

ser = serial.Serial ("/dev/ttyS0", 57600,timeout=3)    #Open port with baud rate

count=0
temp = []

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        global count
        count = 1

        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt5 vs Flask')
        self.lbl1 = QLabel('Count '+str(count), self)
        self.lbl1.move(100, 50) 
        self.show()

        threading.Timer(5,self.refresh).start()

    def refresh(self):
        global count
        count +=1
        print("UI ",count)

        self.lbl1.setText('Count'+str(count))
        threading.Timer(5,self.refresh).start()

def get_uart():
    global temp
    if ser.inWaiting()>0:
        temp =[str(float(x.decode('utf-8'))) for x in ser.read_until().split(b',')]
        print(temp)
    threading.Timer(1,get_uart).start()

@app1.route("/")
def index():
    global temp  
    templateData = {'temp1' : temp[1] ,'temp2' : temp[2]}
    return render_template('index.html',**templateData)


if __name__ == "__main__":   
    app = QApplication(sys.argv)
    pyqt5 = Example()

    threading.Timer(1,get_uart).start()    
    ser.flushInput()

    #app1.run(host='0.0.0.0',threaded=True, port=5000) # ,debug=True)    

    sys.exit(app.exec_())

`

需要有一个用户界面来控制显示在网站上的数据分析。

Answer 1:

更好的方式处理(可能是等待)的过程,就是用Qt的自己的线程。 在这个例子中,我创建了一个QObject的子类,做所有的处理,最终将信号发送时的条件是有效的。 我现在不能安装瓶,所以我没有测试整个代码,但你会得到的想法。

诀窍是使用一个“工人”的QObject,做了处理。 一旦创建了对象被移动到一个新的QThread,在那里它的所有的处理,而不会阻塞事件循环(因此,GUI)。 您还可以创建该对象的其他信号,并连接到您的插槽(这也可能是标准Python函数/的QtApplication以外的方法)将被称为每当必要的。

class Counter(QtCore.QObject):
    changed = QtCore.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.count = 0

    def run(self):
        while True:
            self.thread().sleep(1)
            if ser.inWaiting() > 0:
                self.changed.emit('{}: {}'.format(self.count, [str(float(x.decode('utf-8'))) for x in ser.read_until().split(b',')]))
            self.count += 1

class Example(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.counter = Counter()
        self.counterThread = QtCore.QThread()
        self.counter.moveToThread(self.counterThread)
        self.counterThread.started.connect(self.counter.run)
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt5 vs Flask')
        self.lbl1 = QtWidgets.QLabel('Count {}'.format(self.counter.count), self)
        self.lbl1.move(100, 50)
        self.counter.changed.connect(self.lbl1.setText)
        self.counterThread.start()

if __name__ == "__main__":   
    app = QtWidgets.QApplication(sys.argv)
    pyqt5 = Example()
    pyqt5.show()


Answer 2:

我觉得从瓶是如何被激活的问题造成的。 如果app.run命令给出的任何参数(即使在一个线程),则它阻止其它命令。

我是能够使瓶和PyQt5工作在同一时间的唯一方法,就是激活瓶在专用线程不带任何参数 - 请参阅以下的各种组合。

问:这是一个瓶/ Python的错误或功能或相关技术的发展与生产部署一些其他的解释?

在任何情况下,我想与寻找一种方法来在5000的端口部署烧瓶任何帮助 - WITHOUT瓶阻止其他代码。

import sys
import serial
import threading
import atexit

from PyQt5.QtWidgets import QWidget, QLabel, QApplication
from flask import Flask, render_template, request, redirect, url_for

ser = serial.Serial ("/dev/ttyS0", 57600,timeout=3)    #Open port with baud rate

app = Flask(__name__)

count=0
temp = []

class Example(QWidget):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        global count
        count = 1       
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('PyQt5 vs Flask')
        self.lbl1 = QLabel("Count "+str(count)+"  ", self)
        self.lbl1.move(100, 50) 
        self.show()

        threading.Timer(5,self.refresh).start()

    def refresh(self):
        global count
        global str_data
        count +=1
        self.lbl1.setText("Count "+str(count)+"  ")

        threading.Timer(0.5,self.refresh).start()

def get_uart():
    global temp
    if ser.inWaiting()>0:
        temp =[str(float(x.decode('utf-8'))) for x in ser.read_until().split(b',')]
        print(temp)

    threading.Timer(1,get_uart).start()

@app.route("/")
def blank():
    global count
    data="Count "+str(count)
    return data

if __name__ == "__main__":
    threading.Timer(5,get_uart).start()

    #app.run                                                 ## Does not block further execution. Website IS NOT available
    #app.run()                                               ## Blocks further execution. Website available at port 5000 without Refresh value
    #app.run(port=5123)                                      ## Blocks further execution. Website available at port 5123 without Refresh value
    #app.run(threaded=True)                                  ## Blocks further execution. Website available at port 5000 without Refresh value
    #threading.Thread(target=app.run()).start()              ## Blocks further execution. Website available at port 5000 without Refresh value
    #threading.Thread(target=app.run(port=5123)).start()     ## Blocks further execution. Website available at port 5123 without Refresh value
    #threading.Thread(target=app.run(threaded=True)).start() ## Blocks further execution. Website available at port 5000 without Refresh value

    threading.Thread(target=app.run).start()                ## Flask DOES NOT block.  Website is available at port 5000 with Refresh value

    print("Flask does not block")

    app1 = QApplication(sys.argv)
    pyqt5 = Example()
    sys.exit(app1.exec_())


Answer 3:

[解决了]

所有的瓶的参数可以被定义为:

port = int(os.environ.get('PORT', local_port))
kwargs = {'host': '127.0.0.1', 'port': port , 'threaded' : True, 'use_reloader': False, 'debug':False}
threading.Thread(target=app.run, daemon = True, kwargs=kwargs).start()

和瓶不会阻止,并在kwargs中定义的参数运行。



文章来源: Flask versus PyQt5 - Flask controls program flow?