Python

Как закрыть приложение PyQt5 чрез код другой программы.

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

Вот пример, как вы можете организовать ваш код:

Создайте два модуля: один для GUI и один для обработчика.
В модуле GUI запускайте GUI в главном потоке, а обработчик в отдельном потоке.
В модуле GUI определите метод для закрытия обработчика, когда GUI закрывается.

Примерный код:

main.py (ваш главный файл):

python

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
from gui_module import GUIWindow
from handler_module import HandlerThread

if __name__ == "__main__":
app = QApplication(sys.argv)

# Создаем и запускаем GUI
gui_window = GUIWindow()
gui_window.show()

# Создаем и запускаем обработчик в отдельном потоке
handler_thread = HandlerThread()
handler_thread.start()

# Определяем функцию для закрытия обработчика при закрытии GUI
def on_gui_closed():
handler_thread.stop()

gui_window.closed.connect(on_gui_closed)

sys.exit(app.exec_())

gui_module.py:

python

from PyQt5.QtWidgets import QMainWindow, QPushButton

class GUIWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("GUI Window")
self.setGeometry(100, 100, 400, 300)

# Добавляем кнопку для тестирования GUI
self.button = QPushButton("Test GUI Button", self)
self.button.setGeometry(100, 100, 200, 50)

# Сигнал, сигнализирующий о закрытии GUI
self.closed = self.closeEvent

# Добавьте код для вашего GUI здесь

handler_module.py:

python

from PyQt5.QtCore import QThread

class HandlerThread(QThread):
def __init__(self):
super().__init__()
self.running = True

def run(self):
# Поместите ваш код обработчика сюда
# Например, цикл, который выполняется пока self.running равно True
while self.running:
print("Handler is running...")

def stop(self):
self.running = False
self.wait()

В данном примере, при закрытии GUI окна (GUIWindow) будет вызываться функция on_gui_closed, которая остановит обработчик (HandlerThread) и завершит его работу. Вы можете доработать этот пример согласно своим потребностям.

Убедитесь, что код обработчика (в handler_module.py) выполняется в цикле, и этот цикл периодически проверяет переменную self.running. Таким образом, когда self.running станет False, обработчик закончит свою работу и поток завершится.
Ильгиз Асмандияров
Ильгиз Асмандияров
11 597
Лучший ответ
Один из способов - использовать модуль subprocess для вызова другой программы. Например, есть приложение на PyQt5, которое через subprocess вызывает другую программу (например, xed). Нужно закрыть окно приложения на PyQt, но чтобы при этом не закрылось открытое приложение. Открытое приложение не закрывается, если убить окно главного из вне (через xkill). Можно добиться такого же эффекта, только изнутри самого приложения.

Чтобы прервать работу обработчика в главном файле при завершении работы GUI, можно использовать механизм сигналов и слотов PyQt5. Можно создать сигнал, который будет испускаться при завершении работы GUI, и соединить его со слотом в главном файле, который будет отключать обработчик. Таким образом, когда GUI завершит работу, сигнал будет испущен и обработчик будет отключен.