0
0 комментариев

Добрый день.

Уже который день пытаюсь понять причину закрытия окна при запуске потока, который никак с этим окном не связан (как мне кажется).

Использую Python 3.5.4 и PyQt 5.6. В главном модуле мы создаём окно с таблицей (tableview). В таблице одна запись. При двойном клике ЛКМ по этой записи открывается пустое окно. Через 5 секунд после запуска программы стартует поток:

main.py

from PyQt5 import QtWidgets, uic
import os
import sys
from threads import LoadDocs
from tables import LoadData
from viewwindow import ViewDocs
 
 
class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
 
        # Главное окно
        self.main_window = uic.loadUi(os.path.join("main.ui"), self)
        self.main_window.setWindowTitle("Тест")
 
        # Поток
        self.load_docs_thread = LoadDocs()
        self.load_docs_thread.started.connect(self.load_docs_thread_started)
        self.load_docs_thread.finished.connect(self.load_docs_thread_finished)
 
        # Таблица
        self.main_window.tableView.doubleClicked.connect(self.open_window)
 
        value = [("1", "2", "3", "4", "5", "6")]
        table_model = LoadData(value)
        self.main_window.tableView.setModel(table_model)
        self.main_window.tableView.resizeColumnsToContents()
        self.main_window.tableView.horizontalHeader().setStretchLastSection(True)
        self.main_window.tableView.setColumnHidden(0, True)
 
        # Отображение
        self.main_window.show()
 
        def open_window(self):
            ViewDocs()
 
       def load_docs_thread_started(self):
           print("load_docs_thread_started")
 
def load_docs_thread_finished(self):
    print("load_docs_thread_finished")
 
if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    MainWindow()
    sys.exit(app.exec_())

viewwindow.py

import os
from PyQt5 import QtCore, QtWidgets, uic
 
 
class ViewDocs(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
 
        self.view_window = uic.loadUi(os.path.join("viewwindow.ui"), self)
        self.view_window.setWindowTitle("Окно")
        self.view_window.setAttribute(QtCore.Qt.WA_DeleteOnClose, True)
        self.view_window.show()

threads.py

from PyQt5 import QtCore
import requests
 
 
class LoadDocs(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.basictimer = QtCore.QBasicTimer()
        self.basictimer.start(5000, self)
 
    def run(self):
        response = requests.get("http://" + "ya.ru")
        if response.status_code == 200:
            print("1")
 
    def timerEvent(self, QTimerEvent):
        self.start()

То есть суть проблемы заключается в том, что я запускаю программу и сразу открываю окно дабл кликом по строке таблицы и как только срабатывает поток (проверяет, доступен ли сайт) это окно закрывается, остаётся только главное окно. Подскажите, пожалуйста, что в таком случае нужно сделать, чтобы работа потока не влияло на окно?

Обновлено! Если создать окно не в Designer, а в самом питоне, то проблема решается:

viewwindow.py

class ViewDocs(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__()
 
        QtWidgets.QWidget.__init__(self, parent)

Изменен статус публикации
Добавить комментарий