python中self.argv = None
时间: 2024-06-07 09:09:11 浏览: 96
在 Python 中,self.argv = None 是在类中定义实例变量 argv 并将其初始化为 None。在类的方法中,可以使用 self.argv 来访问和修改这个实例变量。通常情况下,实例变量是在 __init__ 方法中初始化的,但是如果你没有在 __init__ 方法中初始化它,那么它就会被默认初始化为 None。
相关问题
class Faceshow(QMainWindow, Ui_MainWindow): def init(self, parent=None): super(Faceshow, self).init(parent) self.setupUi(self) self.main_button.clicked.connect(self.show_resu) self.main_exit.clicked.connect(self.quit) self.form = None def show_resu(self): try: img1, img2, img3, img4, text1, text2 = start() except Exception as e: print(e) return img1 = ndarray_to_qpixmap(img1) img2 = ndarray_to_qpixmap(img2) img3 = ndarray_to_qpixmap(img3) img4 = ndarray_to_qpixmap(img4) self.form = RESUshow(img1, img2, img3, img4, text1, text2) self.form.pushButton.clicked.connect(self.form.save_img4) self.form.show() def quit(self): self.close() if name == 'main': hxz = QApplication(sys.argv) ui = Faceshow() ui.show() sys.exit((hxz.exec_())) 修改上述代码,使得start()函数出现异常后,刷新主界面并不影响槽函数的再次触发
您可以在show_resu函数中添加一个try-except语句,并在except语句中处理异常,例如显示一个错误消息框。同时,您可以将self.form设为None,以确保每次重新打开时都会创建新的RESUshow对象。
修改后的代码如下:
```python
from PyQt5.QtWidgets import QMessageBox
class Faceshow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Faceshow, self).__init__(parent)
self.setupUi(self)
self.main_button.clicked.connect(self.show_resu)
self.main_exit.clicked.connect(self.quit)
self.form = None
def show_resu(self):
try:
img1, img2, img3, img4, text1, text2 = start()
except Exception as e:
print(e)
QMessageBox.warning(self, 'Error', 'Failed to process images.')
return
img1 = ndarray_to_qpixmap(img1)
img2 = ndarray_to_qpixmap(img2)
img3 = ndarray_to_qpixmap(img3)
img4 = ndarray_to_qpixmap(img4)
if self.form:
self.form.close()
self.form = RESUshow(img1, img2, img3, img4, text1, text2)
self.form.pushButton.clicked.connect(self.form.save_img4)
self.form.show()
def quit(self):
self.close()
if __name__ == '__main__':
hxz = QApplication(sys.argv)
ui = Faceshow()
ui.show()
sys.exit(hxz.exec_())
```
这段代码没进 thing1()的原因 class Worker(QtCore.QThread): sinOut = pyqtSignal(str) def __init__(self, parent=None): super(Worker, self).__init__(parent) # 设置工作状态与初始num数值 self.working = True self.num = 0 #def __del__(self): # 线程状态改变与线程终止 #self.working = False #self.wait() def stop(self): #线程状态改变与线程终止 self.working = False self.wait() def run(self): self.working = True while self.working == True: #file_str = 'File index{0}'.format(self.num) self.num += 1 # 发射信号 #self.sinOut.emit(file_str) self.sinOut.emit('1') # 线程休眠2秒 self.msleep(5) class parentWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.main_ui = JQ.Ui_MainWindow() self.main_ui.setupUi(self) self.thread1 = Worker() self.main_ui.pushButton_2.clicked.connect(self.thing1) self.thread1.sinOut.connect(self.printt) def thing1(self): #self.main_ui.pushButton.setEnabled(False) print('9999999999') self.thread1.start() self.thread1.wait() print('123') #self.sleep(2) def printt(self): print('7777') def ok(): print('ok') # def hourstest(): # thread1 = Worker() # thread1.start() # com = JQ.Ui_MainWindow().comboBox_2.currentText() # ser = serial.Serial('com3', 1200, timeout=1) # data = bytes.fromhex( # '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ') # ser.write(data) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) widget = QtWidgets.QMainWindow() widget = parentWindow() ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦 ui.setupUi(widget) ui.discoverSerial() #串口发现 #ui.pushButton_2.clicked.connect(widget.thing1) widget.show() sys.exit(app.exec_())
在你的代码中,`thing1()` 函数中调用了 `self.thread1.wait()` 方法,这个方法会阻塞主线程,直到子线程执行完毕。因此,如果在 `thing1()` 中调用 `self.thread1.start()` 方法后立即调用 `self.thread1.wait()` 方法,那么子线程就没有机会执行 `run()` 方法,因为主线程一直在等待子线程执行完毕。
解决方法是在 `thing1()` 中删除 `self.thread1.wait()` 方法,让子线程在后台执行。同时,建议在 `Worker` 类的 `__del__()` 方法中加入线程终止的代码,以确保线程能够正确地退出。具体来说,可以将 `__del__()` 方法的注释部分取消注释,代码如下:
```python
class Worker(QtCore.QThread):
sinOut = pyqtSignal(str)
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
# 设置工作状态与初始num数值
self.working = True
self.num = 0
def __del__(self):
# 线程状态改变与线程终止
self.working = False
self.wait()
def stop(self):
#线程状态改变与线程终止
self.working = False
self.wait()
def run(self):
self.working = True
while self.working == True:
#file_str = 'File index{0}'.format(self.num)
self.num += 1
# 发射信号
#self.sinOut.emit(file_str)
self.sinOut.emit('1')
# 线程休眠2秒
self.msleep(5)
class parentWindow(QMainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.main_ui = JQ.Ui_MainWindow()
self.main_ui.setupUi(self)
self.thread1 = Worker()
self.main_ui.pushButton_2.clicked.connect(self.thing1)
self.thread1.sinOut.connect(self.printt)
def thing1(self):
#self.main_ui.pushButton.setEnabled(False)
print('9999999999')
self.thread1.start()
#self.thread1.wait() # 删除这行
print('123')
#self.sleep(2)
def printt(self):
print('7777')
def ok():
print('ok')
# def hourstest():
# thread1 = Worker()
# thread1.start()
# com = JQ.Ui_MainWindow().comboBox_2.currentText()
# ser = serial.Serial('com3', 1200, timeout=1)
# data = bytes.fromhex(
# '68 01 00 20 00 00 00 00 00 34 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 33 F4 16 ')
# ser.write(data)
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
#widget = QtWidgets.QMainWindow() # 这行可删除
widget = parentWindow()
ui = JQ.Ui_MainWindow() # 这是原py中的类,因人而异哦
ui.setupUi(widget)
ui.discoverSerial() #串口发现
#ui.pushButton_2.clicked.connect(widget.thing1)
widget.show()
sys.exit(app.exec_())
```