/
Ig.Ro
/
PDF_View
Обзор
Документация
Войти
/
Ig.Ro
/
PDF_View
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
main.py
103 строки
4 KB
Ig.Ro
upload files
14 янв 2026, 16:44
14 янв 2026, 16:44
2d33e26
Код
Авторство
О чём код?
import sys import os import socket import threading import logging from PyQt6.QtWidgets import QApplication from PyQt6.QtCore import QMetaObject, Qt, Q_ARG import viewer_window logging.basicConfig( level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.FileHandler("pdf_viewer.log", encoding="utf-8"), logging.StreamHandler(sys.stdout) ] ) logger = logging.getLogger("PDFViewer") VIEWER_HOST = "127.0.0.1" VIEWER_PORT = 65433 SOCKET_TIMEOUT = 3 def send_to_existing_instance(file_path): logger.info(f"Попытка отправить файл в уже запущенный процесс: {file_path}") try: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.settimeout(SOCKET_TIMEOUT) s.connect((VIEWER_HOST, VIEWER_PORT)) s.sendall(f"OPEN:{file_path}".encode("utf-8")) logger.info("Файл успешно отправлен") return True except (ConnectionRefusedError, socket.timeout, OSError) as e: logger.warning(f"Не удалось подключиться к IPC-серверу: {e}") return False def start_ipc_server(window): def server_loop(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) try: sock.bind((VIEWER_HOST, VIEWER_PORT)) sock.listen(1) logger.info(f"IPC-сервер запущен на {VIEWER_HOST}:{VIEWER_PORT}") while True: try: conn, addr = sock.accept() with conn: data = conn.recv(1024).decode("utf-8") if data.startswith("OPEN:"): path = data[5:] if os.path.isfile(path) and path.lower().endswith(".pdf"): QMetaObject.invokeMethod( window, "load_pdf_from_ipc", Qt.ConnectionType.QueuedConnection, Q_ARG(str, path) ) except Exception as e: logger.error(f"Ошибка в IPC-сервере: {e}") except OSError as e: logger.critical(f"Не удалось запустить IPC-сервер: {e}") finally: sock.close() thread = threading.Thread(target=server_loop, daemon=True) thread.start() def main(): logger.info("=== Запуск pdf_viewer.py ===") app = QApplication(sys.argv) file_path = sys.argv[1] if len(sys.argv) > 1 else None if file_path: logger.info(f"Получен аргумент: {file_path}") if send_to_existing_instance(file_path): logger.info("Файл передан существующему процессу. Завершение.") sys.exit(0) else: logger.info("Существующий процесс не найден. Запуск нового окна.") window = viewer_window.ViewerWindow(file_path) from PyQt6.QtCore import QSettings settings = QSettings("MyCompany", "PDFViewer") save_window_state = settings.value("save_window_state", True, type=bool) if save_window_state: size = settings.value("window_size") position = settings.value("window_position") if size: window.resize(size) if position: window.move(position) window.show() start_ipc_server(window) logger.info("Главный цикл Qt запущен") sys.exit(app.exec()) if __name__ == "__main__": main()