在Python进程中打开GUI

2024-05-15 20:48:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有Python3.8中的代码,它启动一个主pyqt接口来配置一些参数,当用户准备好时,他们点击开始按钮,程序用自己的进程打开子窗口

我试着用QThreads来实现这一点,但是如果某个进程在某个地方卡住了,它会冻结整个应用程序,用户必须立即关闭所有子窗口,这种行为对用户体验非常不利。所以现在我尝试使用多进程,但是我不能让它工作

当我初始化该进程时,它运行良好,直到它到达我调用sub_window.show()的那一行,向用户实际显示PyQt接口,但它没有通过那一行。我不知道我是否能在多进程中做到这一点,但我找不到关于这个问题的任何信息

对不起,我的英语不是我的主要语言

以下是一些重要部件的代码:

启动流程的主界面:

        p = Process(target=self.bot.startInterface)
        p.start()

和startInterface函数:

        app = QtWidgets.QApplication(sys.argv)
        app.setStyle('Fusion')
        
        self.main_interface = StatusWindow(self.index, self, self.master_interface)

        self.update_log.connect(self.main_interface.registerLog)
        self.unconnected.connect(self.main_interface.unconnected)


        self.main_interface.setModelItems(self.accounts.items())
        self.main_interface.start_time = datetime.now()

        
        self.main_interface.timer.timeout.connect(self.main_interface.updateStatus)
        self.main_interface.timer.setInterval(1000)
        QtCore.QTimer.singleShot(self.index*self.open_after, self.main_interface.timer.start)

        # Stops here
        self.main_interface.show()

        self.main_interface.botProcess = QThread()
        self.moveToThread(self.main_interface.botProcess)
        self.main_interface.botProcess.started.connect(self.main)
        self.main_interface.botProcess.start()

        sys.exit(app.exec_())

这是我的接口类

class StatusWindow(QMainWindow):
def __init__(self, index, app, master=None):
    self.index = index
    self.master = master
    self.accountStatus = {}
    self.start_time = 0
    self.bot = app
    self.botProcess = QThread()
    self.fontePadrao = ("Arial", "8")
    self.isLogExpanded = False
    self.timer = QTimer()

    super(QMainWindow, self).__init__()

    self.setFixedSize(300, 100)
    self.setContentsMargins(0,0,0,0)
    self.setWindowTitle("Status")
    """ self.setWindowIcon(QtGui.QIcon(os.path.join(__location__,'icon.png')))
    with open(os.path.join(__location__,"style.css"), "r") as f:
        _style = f.read()
        self.setStyleSheet(_style) """

    wid = QWidget()
    hlayout = QHBoxLayout()
    hlayout.setContentsMargins(0, 0, 5, 0)

    menu = QVBoxLayout()
    menu.setSpacing(0)
    menu.setAlignment(Qt.AlignTop)

    self.bpause = QPushButton(qta.icon("fa.pause"), "", objectName="statusMenu")
    self.bpause.setFixedSize(30,34)
    self.bpause.setIconSize(QSize(20,20))
    self.bpause.setToolTip("Pausar")
    self.bpause.clicked.connect(self.pauseBot)
    breconfig = QPushButton(qta.icon("mdi.cog-sync"), "", objectName="statusMenu")
    breconfig.setFixedSize(30,34)
    breconfig.setIconSize(QSize(20,20))
    breconfig.setToolTip("Atualizar configurações")
    breconfig.clicked.connect(self.reloadConfig)
    breload = QPushButton(qta.icon("mdi.reload"), "", objectName="statusMenu")
    breload.setFixedSize(30,34)
    breload.setIconSize(QSize(20,20))
    breload.setToolTip("Reiniciar")
    breload.clicked.connect(self.restartBot)

    menu.addWidget(self.bpause)
    menu.addWidget(breconfig)
    menu.addWidget(breload)

    hlayout.addLayout(menu)

    l = QVBoxLayout()

    ld = QHBoxLayout()
    layoutT = QGridLayout()
    self.time_runningLabel = QLabel(" ")
    map = QPixmap(qta.icon("mdi.timer-outline", color='white').pixmap(QSize(15, 15)))
    self.time_runningLabel.setPixmap(map)
    layoutT.addWidget(self.time_runningLabel, 0,0)

    self.time_running = QLabel("0:00:00")
    self.time_running.setStyleSheet("font-size: 10px;")
    layoutT.addWidget(self.time_running, 0,1)
    ld.addLayout(layoutT)

    layoutM = QGridLayout()
    self.moneyLabel = QLabel("")
    map = QPixmap(qta.icon("fa5s.money-bill-wave", color='white').pixmap(QSize(15, 15)))
    self.moneyLabel.setPixmap(map)
    layoutM.addWidget(self.moneyLabel, 0,0)
    self.money = QLabel("0")
    self.money.setStyleSheet("font-size: 10px;")
    layoutM.addWidget(self.money, 0,1)
    ld.addLayout(layoutM)

    layoutM = QGridLayout()
    self.counterLabel = QLabel("")
    map = QPixmap(qta.icon("fa.check", color='white').pixmap(QSize(15, 15)))
    self.counterLabel.setPixmap(map)
    layoutM.addWidget(self.counterLabel, 0,0)
    self.counter = QLabel(text="0")
    self.counter.setStyleSheet("font-size: 10px;")
    layoutM.addWidget(self.counter, 0,1)
    ld.addLayout(layoutM)

    layoutM = QGridLayout()
    self.goalLabel = QLabel("")
    map = QPixmap(qta.icon("fa5s.flag-checkered", color='white').pixmap(QSize(15, 15)))
    self.goalLabel.setPixmap(map)
    layoutM.addWidget(self.goalLabel, 0,0)
    self.goal = QLabel(text="0")
    self.goal.setStyleSheet("font-size: 10px;")
    layoutM.addWidget(self.goal, 0,1)
    ld.addLayout(layoutM)
    ld.setAlignment(Qt.AlignCenter)

    l.addLayout(ld)
    l.addStretch()

    self.model = GroupModel(self)
    self.accountsTree = GroupView(self.model, self)
    l.addWidget(self.accountsTree)
    l.addStretch()

    ll = QHBoxLayout()
    self.logerLabel = QPushButton(qta.icon("fa5s.info-circle", color='white'),"")
    self.logerLabel.setIconSize(QSize(15, 15))
    self.logerLabel.setFixedHeight(23)
    self.logerLabel.setStyleSheet("border: 2px solid #535a57;")
    self.logerLabel.clicked.connect(self.expandLog)
    ll.addWidget(self.logerLabel)
    self.logger = QPlainTextEdit()
    self.logger.setFixedHeight(23)
    self.logger.setObjectName("logger")
    self.logger.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
    self.logger.setReadOnly(True)
    self.logger.verticalScrollBar().blockSignals(True)
    ll.addWidget(self.logger)
    ll.setSpacing(0)

    l.addLayout(ll)

    hlayout.addLayout(l)

    wid.setLayout(hlayout)
    self.setCentralWidget(wid)

    screen = QApplication.primaryScreen()
    size = screen.size()
    ws = size.width() # width of the screen
    hs = size.height() # height of the screen
    x = int(ws / 2 + index*10)
    y = int(hs / 2 + index*10)
    self.move(x,y)

Tags: selfmapsizetimemainconnectloggerinterface