Проблема, когда несколько getSaveFileName windows одновременно - закрытие одного окна закрывает остальные - PullRequest
0 голосов
/ 21 марта 2020

У меня есть следующая функция (уменьшенная) в классе GUI. Мое приложение является многопоточным, поэтому иногда эта функция вызывается несколько раз, прежде чем предыдущая завершена. Это не должно быть проблемой, но это так.

Поэтому, когда эта функция вызывается одновременно, несколько windows открываются, как и ожидалось. Для одного из windows я выбираю местоположение и нажимаю сохранить, оно отлично работает для этого окна, возвращая выбранное местоположение файла. Но когда я делаю это, другой windows закрывается, возвращая пустую строку, несмотря на то, что я не взаимодействовал с ними.

Может кто-нибудь пролить свет на то, почему?

Функция вызывается через сигнал 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]

По какой-то неизвестной мне причине избавление от этих аргументов дает ожидаемое поведение.

...