第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

Python-父代和多線程問題

Python-父代和多線程問題

翻翻過去那場雪 2021-03-29 13:10:58
我正在學(xué)習(xí)PyQT和多線程,我想在這里需要幫助。在我的代碼中,我有Tool一個(gè)class和一個(gè)thread TaskThread。從線程中,我調(diào)用一個(gè)函數(shù)dummy_function,該函數(shù)執(zhí)行進(jìn)度條在GUI中顯示的過程。當(dāng)dummy_function完成后,我想在GUI打印一條消息,通過調(diào)用self.outputText.setText("Hello")。但是,出現(xiàn)以下錯(cuò)誤:AttributeError:'TaskThread'對象沒有屬性'outputText'我嘗試的第一件事是將以下行添加到我的onStart函數(shù)中:...self.myLongTask.output_dt = self.outputText...然后,在中TaskThread,我dummy_function通過以下方式更改調(diào)用:...dummy_function(self, start_datetime_unix, end_datetime_unix, self.output_dt) ...最后,我通過添加以下新參數(shù)來更改我的dummy_function:def dummy_function(self, start_datetime_unix, end_datetime_unix, output_text):     # Dummy function, just to simulate a task. It takes parameters just for testing.    result = start_datetime_unix * end_datetime_unix     # Pre-steps for mapping from one range to other (progress-bar)    OldMax = 99999    OldMin = 1    NewMax = 100    NewMin = 1    OldRange = (OldMax - OldMin)    NewRange = (NewMax - NewMin)        u = 1    for i in range (OldMax):        u = i*2        OldValue = i        print OldValue        NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin        print "NEW VALUE: ", NewValue        self.emit(QtCore.SIGNAL('CPU_VALUE'), NewValue)    output_text.setText("Hello")現(xiàn)在,到達(dá)終點(diǎn)時(shí),程序?qū)㈥P(guān)閉,并顯示以下錯(cuò)誤:QObject:無法為處于不同線程中的父級創(chuàng)建子級。(父母是QTextDocument(0xf13a60),父母的線程是QThread(0xc6f180),當(dāng)前線程是TaskThread(0xee0740)為了嘗試該程序,我升級了GUInterface,因此如有必要,您可以嘗試一下。
查看完整描述

1 回答

?
收到一只叮咚

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超5個(gè)贊

您得到的第一個(gè)是由于TaskThread沒有outputText屬性而引起的,并且您的解決方案在某種程度上是正確的,因?yàn)樗鉀Q了第一個(gè)問題,但是還有另一個(gè)問題,Qt禁止從另一個(gè)生成該線程的線程直接更新該GUI。問題 。Qt表示如果您要使用其他線程的信息更新GUI,您必須使用信號或信號QMetaObject,在這種情況下,我將通過創(chuàng)建一個(gè)signal被調(diào)用來解決它textChanged,它將與的setText()方法連接outputText。


另一方面,我看到您使用的是舊的連接樣式:


self.connect(self.myLongTask, QtCore.SIGNAL('CPU_VALUE'), self.onProgress)

盡管不再建議您仍然可以使用該樣式,但最好還是使用新語法。


最后,連接到信號的功能稱為插槽,因此建議使用裝飾器@QtCore.pyqtSlot(...),此方法可最大程度地減少資源消耗。


import sys

import datetime

import time


from PyQt4 import QtCore, QtGui, uic

from PyQt4.QtCore import *

from PyQt4.QtGui import *


# Link to GUI

qtCreatorFile = "GUInterface.ui"


Ui_MainWindow, QtBaseClass = uic.loadUiType(qtCreatorFile)


def time_converter_to_unix(start_datetime, end_datetime):

    # Convert QTimeEdit to UNIX Timestamp (int, msec included), and then to float

    start_datetime_unix_int = start_datetime.toMSecsSinceEpoch ()

    start_datetime_unix = (float(start_datetime_unix_int) / 1000)


    end_datetime_unix_int = end_datetime.toMSecsSinceEpoch ()

    end_datetime_unix = (float(end_datetime_unix_int) / 1000)


    return start_datetime_unix, end_datetime_unix


def dummy_function(self, start_datetime_unix, end_datetime_unix): 

    # Dummy function, just to simulate a task. It takes parameters just for testing.

    result = start_datetime_unix * end_datetime_unix 


    # Pre-steps for mapping from one range to other (progress-bar)

    OldMax = 99999

    OldMin = 1

    NewMax = 100

    NewMin = 1


    OldRange = (OldMax - OldMin)

    NewRange = (NewMax - NewMin)    


    u = 1

    for i in range (OldMax):

        u = i*2


        OldValue = i

        print(OldValue)

        NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin

        print("NEW VALUE: ", NewValue)


        self.cpuValueChanged.emit(NewValue)


    self.textChanged.emit("Hello")


class Tool(QtGui.QMainWindow, Ui_MainWindow):

    def __init__(self, parent = None):


        # Setting-ip UI

        QtGui.QMainWindow.__init__(self)

        Ui_MainWindow.__init__(self)

        self.setupUi(self)


        # Button Action

        self.runButton.clicked.connect(self.onStart)


        # Progress Bar and Label. At the begining, the bar is at 0

        self.progressBar.setValue(0)

        self.progressBar.setRange(0,100)

        self.resultLabel.setText("Waiting...")  


        ####################################

        #TEST: Thread for progress bar

        self.myLongTask = TaskThread()

        self.myLongTask.cpuValueChanged.connect(self.progressBar.setValue)

        self.myLongTask.textChanged.connect(self.outputText.setText)

        self.myLongTask.taskFinished.connect(self.onFinished)

        ####################################        


    @QtCore.pyqtSlot()

    def onStart(self):    

        self.progressBar.reset()

        self.resultLabel.setText("In progress...")        

        print("(onStart)In progress mode executed")


        print("(onStart)INITIALIZE THREAD")

        self.myLongTask.start()     

        print("(onStart)THREAD EXECUTED")


        self.myLongTask.start_dt = self.startTime.dateTime() # <----

        self.myLongTask.end_dt = self.endTime.dateTime()     # <----     


    @QtCore.pyqtSlot()

    def onFinished(self):

        # Stop the pulsation when the thread has finished

        print("(onFinished) executed")

        self.progressBar.setRange(0,1)

        self.progressBar.setValue(1)

        self.resultLabel.setText("Done")        


class TaskThread(QtCore.QThread):

    cpuValueChanged = QtCore.pyqtSignal(int)  

    taskFinished = QtCore.pyqtSignal()

    textChanged = QtCore.pyqtSignal(str)


    def __del__(self):

        self.wait()


    def run(self):  

        # First, we read the times from the QDateTime elements in the interface      

        print("Getting times...")

        start_datetime_unix, end_datetime_unix = time_converter_to_unix(self.start_dt, self.end_dt)


        # Then, we put these values in my_function

        print("Executing function...")

        dummy_function(self, start_datetime_unix, end_datetime_unix) 


        # To finish, we execute onFinished.

        print("Finishing thread...")

        self.taskFinished.emit()


def main():

    app = QtGui.QApplication(sys.argv)

    window = Tool()

    window.show()

    sys.exit(app.exec_())


if __name__ == '__main__':

    main()



查看完整回答
反對 回復(fù) 2021-04-13
  • 1 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號