如何使用线程来防止PyQt5 GUI在函数运行和更新进度条时卡死

问题描述 投票:0回答:0
import openai

import sys

from PyQt5.QtCore import \*
from PyQt5.QtGui import \*
from PyQt5.QtWidgets import \*
from PyQt5.QtWidgets import QApplication, QVBoxLayout, QWidget,QLabel,QLineEdit,QComboBox,QPushButton,QInputDialog, QLineEdit, QDialog
import time
import json

class EmailGenerator(QWidget):
def __init__(self):

        super().__init__()
        openai.api_key = "your-key"
        # Create widgets
        self.setWindowTitle("Email Generator by Open AI")
        self.resize(800, 400)
        self.recipient_label = QLabel("Recipient's name:")
        self.recipient_edit = QLineEdit()
        self.sender_label = QLabel("Sender's name:")
        self.sender_edit = QLineEdit()
        self.keywords_label = QLabel("Keywords:")
        self.keywords_edit = QLineEdit()
        self.topic_label = QLabel("Topic:")
        self.topic_edit = QLineEdit()
        self.language_label = QLabel("Language:")
        self.language_combo = QComboBox()
        #self.language_combo.addItem("Japanese")
        self.language_combo.addItem("English")
        self.language_combo.addItem("German")
        self.max_tokens_button = QPushButton("Set max_tokens")
        self.n_button = QPushButton("Set n")
        self.stop_button = QPushButton("Set stop")
        self.temperature_button = QPushButton("Set temperature")
        self.api_key_button = QPushButton("Set API Key")
    
        self.generate_button = QPushButton("Generate Email")
        self.generate_button.setStyleSheet('background-color:green')
        
        self.progressbar = QProgressBar()
        self.progressbar.setStyleSheet('QProgressBar {border: 2px solid grey; border-radius:7px;padding:1px}')
    
        self.te = QTextEdit(self)
        self.clearText_button = QPushButton("Clear Text")
        self.clearText_button.setStyleSheet('background-color:red')
        self.result_label = QLabel()
    
        #Create Events
    
        self.max_tokens_button.clicked.connect(self.set_max_tokens)
        self.n_button.clicked.connect(self.set_n)
        self.stop_button.clicked.connect(self.set_stop)
        self.temperature_button.clicked.connect(self.set_temperature)
        self.api_key_button.clicked.connect(self.set_api_key)
    
        # Create layout and add widgets
        self.layout = QVBoxLayout()
        self.layout.addWidget(self.recipient_label)
        self.layout.addWidget(self.recipient_edit)
        self.layout.addWidget(self.sender_label)
        self.layout.addWidget(self.sender_edit)
        self.layout.addWidget(self.keywords_label)
        self.layout.addWidget(self.keywords_edit)
        self.layout.addWidget(self.topic_label)
        self.layout.addWidget(self.topic_edit)
        self.layout.addWidget(self.language_label)
        self.layout.addWidget(self.language_combo)
        self.layout.addWidget(self.max_tokens_button)
        self.layout.addWidget(self.n_button)
        self.layout.addWidget(self.stop_button)
        self.layout.addWidget(self.temperature_button)
        self.layout.addWidget(self.api_key_button)
        self.layout.addWidget(self.generate_button)
        self.layout.addWidget(self.clearText_button)
    
        self.layout.addWidget(self.progressbar)
        
        self.layout.addWidget(self.te)
        self.layout.addWidget(self.result_label)
    
        self.setLayout(self.layout)
    
    
        self.generate_button.clicked.connect(self.generate_email)
        self.clearText_button.clicked.connect(self.clearText)
    
        self.show()
    
        # Set default values
        self.max_tokens = 2048
        self.n = 1
        self.stop = ""
        self.temperature = 0.9
        self.api_key = ""
    
    
    
        
        #self.result_label.setText(str(self.n) + self.stop)
    def set_max_tokens(self):
        # code to set max_tokens value
        new_value, ok = QInputDialog.getInt(self, "Set max_tokens", "Enter new value for max_tokens:")
        if ok:
            self.max_tokens = new_value
        pass
    
    def set_n(self):
        # code to set n value
    
        new_value, ok = QInputDialog.getInt(self, "Set n", "Enter new value for n:")
        if ok and new_value:
            self.n = new_value
            #self.result_label.setText(str(self.n))
        pass
    
    def set_stop(self):
        # code to set stop value
        new_value, ok = QInputDialog.getText(self, "Set stop", "Enter new value for stop:")
        if ok:
            self.stop = new_value
            #self.result_label.setText(self.stop)
        pass
    
    def set_temperature(self):
        # code to set temperature value
        new_value, ok = QInputDialog.getDouble(self, "Set temperature", "Enter new value for temperature:")
        if ok:
            self.temperature = new_value
        pass
    
    def set_api_key(self):
        # code to set api key value
        new_value, ok = QInputDialog.getText(self, "Set API Key", "Enter new value for API Key:")
        if ok:
            self.api_key = new_value
        pass
    def clearText(self):
        self.te.clear()
        
    def generate_email(self):
    
       
        #self.num_text = 0
      
        
        recipient_name = self.recipient_edit.text()
        sender_name = self.sender_edit.text()
        keywords = self.keywords_edit.text()
        topic = self.topic_edit.text()
        language = self.language_combo.currentText()
        num = self.n
    
    
        if language == "German":
            prompt = (f"Schreiben eine Email über {topic} zu {recipient_name} von {sender_name} mit den folgenden Schlüsselwörtern: {keywords}")
        else:
            prompt = (f"Write an email about {topic} addressed to {recipient_name} from {sender_name} using the following keywords: {keywords}")
    
        
        response = openai.Completion.create(
            engine="text-davinci-003",
            prompt=prompt,
            max_tokens=self.max_tokens,
            n =num,
            stop=self.stop,
            temperature=self.temperature
        )
    
       
       
    
        val = response["usage"]["completion_tokens"]
        for i in range(val):
            #js = json.dumps(response, indent=6, sort_keys=True)
    
            time.sleep(0.01)
            self.progressbar.setValue(i+1)
    
        
        email_text = response["choices"][0]["text"]
        
    
        #self.te.append(js)
        self.te.append(email_text + "\n")
        self.progressbar.setValue(0)
        
    
    
        #self.result_label.setText(str(completion_tokens))

# main method

if __name__ == '__main__':

    # create pyqt5 app
    App = QApplication(sys.argv)
    
    # create the instance of EmailGenerator
    email = EmailGenerator()
    
    
    # start the app
    sys.exit(App.exec())

我不知道在“generate_email”函数运行时在哪里以及如何实现更新进度条的线程

multithreading pyqt5 progress-bar qthread
© www.soinside.com 2019 - 2024. All rights reserved.