我在GUI类中具有以下功能(简化)。我的应用程序是多线程的,因此有时在上一个函数完成之前会多次调用此函数。这不应该是一个问题,但是。
因此,当同时调用此函数时,将按预期打开多个窗口。对于其中一个窗口,我选择一个位置,然后单击“保存”,该窗口在该窗口中可以正常工作,返回选择的文件位置。但是,当我这样做时,其他窗口都关闭了,尽管我没有与之交互,但返回了空字符串。
有人可以阐明原因吗?
如果需要的话,将通过pyqt信号调用该函数。
def save_file_dialog(self, file_name):
save_file_name = QFileDialog.getSaveFileName(self, "Save As", file_name)[0]
编辑: 最小的可重现示例:
import threading
import sys
import time
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
from PyQt5 import QtCore
class MainWindow(QMainWindow):
save_file = QtCore.pyqtSignal(str)
def __init__(self):
super(MainWindow, self).__init__()
self.save_file.connect(self.save_file_dialog)
def save_file_dialog(self, file_name):
save_file_name = QFileDialog.getSaveFileName(self, "Save As", file_name)[0]
print(save_file_name)
def different_thread():
x = 0
while x != 3:
window.save_file.emit("filename")
time.sleep(0.5)
x += 1
APP = QApplication(sys.argv)
window = MainWindow()
threading.Thread(target=different_thread).start()
sys.exit(APP.exec_())
有趣的事情。没有time.sleep,它会按预期工作。 不幸的是,我的设置意味着每次发射信号之间总会有一个延迟,尽管时间长。
编辑2: 我能够部分解决问题。
代替:
save_file_name = QFileDialog.getSaveFileName(self, "Save As", file_name)[0]
我这样做了
save_file_name = QFileDialog.getSaveFileName(self)[0]
出于某种我不知道的原因,摆脱这些争论会带来预期的行为。