状态栏不会立即显示消息,有时会崩溃
Statusbar doesn't show message immediately and sometimes crash
我在pyqt4 designer中创建了一个界面,只有一个按钮和一个状态栏。我想在单击按钮时在状态栏中显示一条消息。出于某种原因,我必须将此操作放在新线程中。
但是当我点击按钮时,没有任何反应。直到我拖动 window 的边缘才出现该消息。有时点击动作甚至会导致程序崩溃:
pythonw.exe has stopped working.
这种情况经常发生,尤其是当我点击速度太快时。
这是我的代码:
from PyQt4 import QtCore, QtGui
import threading
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def cal(self):
self.statusbar.showMessage('something')
def onbutton(self):
thread = threading.Thread(target=self.cal)
thread.start()
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(510, 409)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 100, 171, 91))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.onbutton)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.pushButton.setText(_translate("MainWindow", "PushButton", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
发生崩溃是因为您正在从辅助线程与 Qt GUI 进行交互。您只能从主线程与 GUI 交互(参见 Qt documentation)。
你有两个选择:
我在pyqt4 designer中创建了一个界面,只有一个按钮和一个状态栏。我想在单击按钮时在状态栏中显示一条消息。出于某种原因,我必须将此操作放在新线程中。
但是当我点击按钮时,没有任何反应。直到我拖动 window 的边缘才出现该消息。有时点击动作甚至会导致程序崩溃:
pythonw.exe has stopped working.
这种情况经常发生,尤其是当我点击速度太快时。
这是我的代码:
from PyQt4 import QtCore, QtGui
import threading
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_MainWindow(object):
def cal(self):
self.statusbar.showMessage('something')
def onbutton(self):
thread = threading.Thread(target=self.cal)
thread.start()
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(510, 409)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(170, 100, 171, 91))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton.clicked.connect(self.onbutton)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.pushButton.setText(_translate("MainWindow", "PushButton", None))
if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
发生崩溃是因为您正在从辅助线程与 Qt GUI 进行交互。您只能从主线程与 GUI 交互(参见 Qt documentation)。
你有两个选择: