Загрузка данных


cat > /home/user/Desktops/Desktop1/kod.py << 'PYEOF'
# -*- coding: utf-8 -*-
import sys
import subprocess
import threading
import os
import glob
import shutil
from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,
                             QLineEdit, QPushButton, QLabel, QFileDialog, QMessageBox,
                             QProgressBar, QRadioButton, QButtonGroup, QGroupBox)
from PyQt5.QtCore import Qt, pyqtSignal, QObject


class ScanWorker(QObject):
    finished = pyqtSignal(bool, str)
    status_update = pyqtSignal(str, str)

    def __init__(self, save_dir, resolution, parent=None):
        super().__init__(parent)
        self.save_dir = save_dir
        self.resolution = resolution

    def find_device(self):
        try:
            result = subprocess.run(["scanimage", "-L"],
                                    capture_output=True, text=True, timeout=10)
            for line in result.stdout.splitlines():
                if "canondr" in line.lower() or "drg1100" in line.lower():
                    start = line.find("`") + 1
                    end = line.find("'")
                    if start > 0 and end > start:
                        return line[start:end]
        except Exception:
            pass
        return "canondr:libusb:001:005"

    def run(self):
        device = self.find_device()
        batch_pattern = os.path.join(self.save_dir, "scan_%04d.tiff")
        command = ('scanimage -d "' + device + '" --ScanMode Duplex --batchMode 0 '
                   '--resolution ' + str(self.resolution) + ' --mode Color --format=tiff '
                   '--batch="' + batch_pattern + '"')
        try:
            subprocess.run(command, shell=True, check=True,
                           stderr=subprocess.PIPE, text=True, timeout=600)
            tiff_files = sorted(glob.glob(os.path.join(self.save_dir, "scan_*.tiff")))
            if tiff_files:
                self.status_update.emit("Sozdayu PDF...", "blue")
                pdf_path = os.path.join(self.save_dir, "Dokument.pdf")
                tiff2pdf = shutil.which("tiff2pdf") or "/usr/bin/tiff2pdf"
                subprocess.run([tiff2pdf, "-o", pdf_path] + tiff_files,
                               capture_output=True)
                for f in tiff_files:
                    try:
                        os.remove(f)
                    except Exception:
                        pass
                self.finished.emit(True, "Fayl sokhranyon:\n" + pdf_path)
            else:
                self.finished.emit(False, "Ne sozdano ni odnogo fayla")
        except subprocess.TimeoutExpired:
            self.finished.emit(False, "Previsheno vremya ozhidaniya")
        except subprocess.CalledProcessError as e:
            err = e.stderr if e.stderr else "Proverte podklyuchenie skanera"
            self.finished.emit(False, "Oshibka skanirovaniya:\n" + err)
        except Exception as e:
            self.finished.emit(False, "Oshibka:\n" + str(e))


class ScannerApp(QWidget):
    def __init__(self):
        super().__init__()
        self.scanning = False
        self.save_dir = os.path.expanduser("~/Izobrazheniya/Scany")
        self.worker = None
        self.thread = None
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Scanner Canon DR-G1100')
        self.resize(520, 400)

        vbox = QVBoxLayout()

        self.label_path = QLabel('Papka dlya sokhraneniya:')
        self.entry_path = QLineEdit(self.save_dir)
        self.btn_browse = QPushButton('Vybrat papku...')
        self.btn_browse.clicked.connect(self.choose_path)

        hbox_path = QHBoxLayout()
        hbox_path.addWidget(self.entry_path)
        hbox_path.addWidget(self.btn_browse)

        vbox.addWidget(self.label_path)
        vbox.addLayout(hbox_path)

        res_group = QGroupBox('Razreshenie (dpi):')
        res_layout = QHBoxLayout()
        self.res_group_btn = QButtonGroup(self)
        self.res_200 = QRadioButton('200 (bystro)')
        self.res_300 = QRadioButton('300 (standart)')
        self.res_400 = QRadioButton('400 (khorosho)')
        self.res_600 = QRadioButton('600 (otlichno)')
        self.res_300.setChecked(True)
        self.res_group_btn.addButton(self.res_200, 200)
        self.res_group_btn.addButton(self.res_300, 300)
        self.res_group_btn.addButton(self.res_400, 400)
        self.res_group_btn.addButton(self.res_600, 600)
        res_layout.addWidget(self.res_200)
        res_layout.addWidget(self.res_300)
        res_layout.addWidget(self.res_400)
        res_layout.addWidget(self.res_600)
        res_group.setLayout(res_layout)
        vbox.addWidget(res_group)

        self.btn_scan = QPushButton('Nachat skanirovanie')
        self.btn_scan.setStyleSheet("font-weight: bold; height: 40px; background-color: #4CAF50; color: white;")
        self.btn_scan.clicked.connect(self.start_scan)
        vbox.addWidget(self.btn_scan)

        self.progress = QProgressBar()
        self.progress.setRange(0, 0)
        self.progress.setVisible(False)
        vbox.addWidget(self.progress)

        self.label_status = QLabel('Gotov k rabote')
        self.label_status.setAlignment(Qt.AlignCenter)
        self.label_status.setStyleSheet("color: blue; font-size: 12px;")
        vbox.addWidget(self.label_status)

        self.btn_open = QPushButton('Otkryt papku so skanami')
        self.btn_open.clicked.connect(self.open_folder)
        vbox.addWidget(self.btn_open)

        self.setLayout(vbox)

    def choose_path(self):
        folder = QFileDialog.getExistingDirectory(
            self, "Vyberite papku dlya sokhraneniya", self.save_dir)
        if folder:
            self.save_dir = folder
            self.entry_path.setText(folder)

    def start_scan(self):
        if self.scanning:
            return
        os.makedirs(self.save_dir, exist_ok=True)
        self.scanning = True
        self.btn_scan.setEnabled(False)
        self.btn_scan.setText('Skanirovanie...')
        self.btn_browse.setEnabled(False)
        self.progress.setVisible(True)
        self.label_status.setText('Idyot skanirovanie... Ne zakryvayte okno!')
        self.label_status.setStyleSheet("color: red; font-size: 12px;")

        resolution = self.res_group_btn.checkedId()

        self.thread = threading.Thread(target=self._run_worker, args=(resolution,))
        self.thread.daemon = True
        self.thread.start()

    def _run_worker(self, resolution):
        self.worker = ScanWorker(self.save_dir, resolution)
        self.worker.finished.connect(self.finish_scan)
        self.worker.status_update.connect(self.update_status)
        self.worker.run()

    def update_status(self, text, color):
        self.label_status.setText(text)
        self.label_status.setStyleSheet("color: " + color + "; font-size: 12px;")

    def finish_scan(self, success, message):
        self.scanning = False
        self.btn_scan.setEnabled(True)
        self.btn_scan.setText('Nachat skanirovanie')
        self.btn_browse.setEnabled(True)
        self.progress.setVisible(False)
        if success:
            self.label_status.setText('Gotovo!')
            self.label_status.setStyleSheet("color: green; font-size: 12px;")
            QMessageBox.information(self, 'Uspekh', message)
        else:
            self.label_status.setText('Oshibka')
            self.label_status.setStyleSheet("color: red; font-size: 12px;")
            QMessageBox.critical(self, 'Oshibka', message)

    def open_folder(self):
        os.makedirs(self.save_dir, exist_ok=True)
        subprocess.Popen(["xdg-open", self.save_dir])


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = ScannerApp()
    ex.show()
    sys.exit(app.exec_())
PYEOF