Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 我的gui没有';在pyqt和python中将while循环用作启动函数时不会出现_Python 3.x_Pyqt5 - Fatal编程技术网

Python 3.x 我的gui没有';在pyqt和python中将while循环用作启动函数时不会出现

Python 3.x 我的gui没有';在pyqt和python中将while循环用作启动函数时不会出现,python-3.x,pyqt5,Python 3.x,Pyqt5,我想使用启动功能,应该有while循环。 但是我运行代码,直到while循环结束,我的gui才出现 我试过使用self.show()它可以使show成为gui,但它不允许使用sys.exit() 在循环中,您将休眠10秒钟,因为您正在主线程上创建while循环,GUI在循环完成之前不会显示,因为它将阻塞主线程。您可以通过删除time.sleep(1)来测试这一点 在不改变代码的情况下,尝试以下方法: import sys,threading, time from PyQt5.QtWidgets

我想使用启动功能,应该有while循环。 但是我运行代码,直到while循环结束,我的gui才出现

我试过使用self.show()它可以使show成为gui,但它不允许使用sys.exit()


在循环中,您将休眠10秒钟,因为您正在主线程上创建while循环,GUI在循环完成之前不会显示,因为它将阻塞主线程。您可以通过删除
time.sleep(1)
来测试这一点

在不改变代码的情况下,尝试以下方法:

import sys,threading, time
from PyQt5.QtWidgets import QApplication
from PyQt5 import uic

form_class,QMainWindow=uic.loadUiType('youhua.ui')

class MyWindow(QMainWindow,form_class):

    def __init__(self):
        super().__init__()
        self.setupUi(self)
        #self.show()
        t = threading.Thread(target=self.myfunc)
        t.start()

    def myfunc(self):
        k=1
        stat=True
        while stat:
            k=k+1
            time.sleep(1)
            self.statusMessage.append(str(k))
            QApplication.processEvents()
            if k>10:
                stat=False
                #sys.exit() - if you are trying to close the window here use self.close()


if __name__=='__main__':
    app=QApplication(sys.argv)
    myWindow=MyWindow()
    myWindow.show()
    sys.exit(app.exec_())

如果需要再次执行某个操作,您有几个选项。 例如,如果每次迭代花费的时间很短,且不可能阻塞主循环,则可以使用计时器(QTimer)替换该循环,并每次调用该方法,该方法负责获取新数据并根据这些数据更新必要的接口元素:

import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic
from PyQt5.QtCore import QThread, QTimer
import time

#form_class, QMainWindow = uic.loadUiType('youhua.ui')

class MyWindow(QMainWindow): #, form_class):
    def __init__(self):
        super().__init__() 
        self.k = 0

        centralWidget = QtWidgets.QWidget(self)
        self.setCentralWidget(centralWidget)        

        self.button = QtWidgets.QPushButton('Start', self)
        self.button.clicked.connect(self.read_data)

        self.label_data = QtWidgets.QLabel(self, alignment=QtCore.Qt.AlignCenter)
        self.label_data.setText('Pending')

        layout = QtWidgets.QGridLayout(centralWidget)        
        layout.addWidget(self.label_data)
        layout.addWidget(self.button)

        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(1000)                             
        self.timer.timeout.connect(self.read_data_from_sensor)

    @QtCore.pyqtSlot()
    def read_data(self):
        ''' Start / Stop reading at the touch of a button '''

        if not self.timer.isActive():
            self.timer.start()
            self.button.setText("Stop")
        else:
            self.timer.stop()
            self.button.setText("Start")
            self.label_data.setText("Pending")

    @QtCore.pyqtSlot()
    def read_data_from_sensor(self):
        dt  = time.strftime("%Y-%m-%d %H:%M:%S")
        self.label_data.setText(dt)
        self.label_data.adjustSize()

        self.k += 1
        self.statusBar().showMessage('{} item(s)'.format(self.k))

        if self.k > 10:        
            self.timer.stop()
            self.button.setText("Start")
            self.label_data.setText("Pending")        
            self.k = 0

if __name__=='__main__':
    app = QApplication(sys.argv)
    myWindow = MyWindow()
    myWindow.show()
    app.exec_()


你写的可能也有用,但这不是很好。你可以比较

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic
from PyQt5.QtCore import QThread
#import time

#form_class, QMainWindow = uic.loadUiType('youhua.ui')

class MyWindow(QMainWindow): #, form_class):

    def __init__(self):
        super().__init__() 
#        self.setupUi(self)

        self.show()            
        self.myfunc()

    def myfunc(self):
        k = 0
        stat = True
        while stat:
            k += 1
#            time.sleep(1)
#            self.statusMessage.append(str(k))

            self.statusBar().showMessage('{} item(s)'.format(k))
            QThread.msleep(1000)
            QApplication.processEvents()

            if k>10:
                stat=False
                #sys.exit()


if __name__=='__main__':
    app = QApplication(sys.argv)
    myWindow = MyWindow()
#    myWindow.show()
    app.exec_()
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5 import uic
from PyQt5.QtCore import QThread
#import time

#form_class, QMainWindow = uic.loadUiType('youhua.ui')

class MyWindow(QMainWindow): #, form_class):

    def __init__(self):
        super().__init__() 
#        self.setupUi(self)

        self.show()            
        self.myfunc()

    def myfunc(self):
        k = 0
        stat = True
        while stat:
            k += 1
#            time.sleep(1)
#            self.statusMessage.append(str(k))

            self.statusBar().showMessage('{} item(s)'.format(k))
            QThread.msleep(1000)
            QApplication.processEvents()

            if k>10:
                stat=False
                #sys.exit()


if __name__=='__main__':
    app = QApplication(sys.argv)
    myWindow = MyWindow()
#    myWindow.show()
    app.exec_()