gpt4 book ai didi

python - 其他线程中的 QMessageBox

转载 作者:行者123 更新时间:2023-12-04 17:59:53 28 4
gpt4 key购买 nike

import time
import sys, threading
from PyQt4 import QtGui, QtCore
from PyQt4.QtGui import QApplication


class Global:
def __init__(self):
for c in MyClass, MainWindow:
cl = c()
setattr(self, c.__name__, cl)
setattr(cl, 'global_', self)


class MyClass:
def work(self):
for r in range(100):
if r == 2:
self.global_.MainWindow.SignalBox.emit('MyClass NO PAUSE') # need pause !!!
else:
print(r)
time.sleep(1)


class MainWindow(QtGui.QWidget):
Signal = QtCore.pyqtSignal(str)
SignalBox = QtCore.pyqtSignal(str)

def __init__(self):
QtGui.QWidget.__init__(self)
self.resize(300, 300)

self.lab = QtGui.QLabel()
lay = QtGui.QGridLayout()
lay.addWidget(self.lab)
self.setLayout(lay)

self.msgBox = lambda txt: getattr(QtGui.QMessageBox(), 'information')(self, txt, txt)
self.Signal.connect(self.lab.setText)
self.SignalBox.connect(self.msgBox)

def thread_no_wait(self):
self.global_.MainWindow.SignalBox.emit('MyClass PAUSE OK')
threading.Thread(target=self.global_.MyClass.work).start()

def thread_main(self):
def my_work():
for r in range(100):
self.Signal.emit(str(r))
time.sleep(1)
threading.Thread(target=my_work).start()


if __name__ == '__main__':
app = QApplication(sys.argv)
g = Global()
g.MainWindow.show()
g.MainWindow.thread_main()
g.MainWindow.thread_no_wait()
app.exec_()

如何从另一个进程运行 QMessageBox?

MyClass.work 在单独的线程中执行而没有加入是必要的 MyClass 如果它导致 QMessageBox 挂起 如果我们定义 QMessageBox 是 MainWindow ,错误将被调用

QObject::startTimer:计时器不能从另一个线程启动QApplication: 对象事件过滤器不能在不同的线程中。并且在这个调用中QMessageBox在一个单独的线程中被调用,并且没有暂停工作

最佳答案

听起来您想暂停线程的执行,直到主线程中的某些操作完成。有几种方法可以做到这一点。一种简单的方法是使用共享的全局变量。

PAUSE = False

class MyClass:
def work(self):
global PAUSE
for r in range(100):
while PAUSE:
time.sleep(1)
if r == 2:
self.global_.MainWindow.SignalBox.emit('MyClass NO PAUSE')
PAUSE = True
...

class MainWindow(...)

def msgBox(self, txt):
QtGui.QMessageBox.information(self, txt, txt)
global PAUSE
PAUSE = False

如果您使用 QThreads 而不是 python 线程,您实际上可以在另一个线程中调用函数并阻塞直到该函数完成使用 QMetaObject.invokeMethod

@QtCore.pyqtSlot(str)
def msgBox(self, txt):
...

...

if r == 2:
# This call will block until msgBox() returns
QMetaObject.invokeMethod(
self.global_.MainWindow,
'msgBox',
QtCore.Qt.BlockingQueuedConnection,
QtCore.Q_ARG(str, 'Text to msgBox')
)

关于python - 其他线程中的 QMessageBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36808990/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com