我有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)
目前没有回答
相关问题 更多 >
编程相关推荐