Загрузка данных
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