This commit is contained in:
2026-04-27 11:00:40 +02:00
parent d4825553a9
commit 90bd0ecdf5
11 changed files with 1002 additions and 130 deletions
+148
View File
@@ -0,0 +1,148 @@
"""
Jedno okno pro výběr kompresní varianty PDF.
Nahoře tlačítka 1N pro přepínání, tlačítko "Tohle beru" pro potvrzení.
Argumenty: variant_picker.py <json_soubor>
JSON vstup: [{"path": "...", "label": "150 DPI / q80", "size_kb": 139}, ...]
JSON výstup (stdout): {"chosen": "cesta/k/souboru"}
"""
import json
import sys
from pathlib import Path
import tkinter as tk
from PIL import Image, ImageTk
import fitz
def main():
if len(sys.argv) < 2:
sys.exit(1)
variants = json.loads(Path(sys.argv[1]).read_text(encoding="utf-8"))
chosen = {"path": None}
docs = [fitz.open(v["path"]) for v in variants]
current = [0]
photo_ref = [None]
root = tk.Tk()
root.tk.call("encoding", "system", "utf-8")
root.attributes("-topmost", True)
sh = root.winfo_screenheight()
sw = root.winfo_screenwidth()
win_h = sh - 80 # odečteme taskbar + title bar
img_h = win_h - 160
img_w = sw // 2 # šířka okna = polovina monitoru
x = (sw - img_w) // 2
root.geometry(f"{img_w}x{win_h}+{x}+0")
root.resizable(False, False)
# ── Horní panel s tlačítky variant ──
frame_top = tk.Frame(root, bg="#222")
frame_top.pack(fill="x")
btn_variants = []
current_page = [0]
def show(n, page_n=0):
current[0] = n
current_page[0] = page_n
doc = docs[n]
page = doc[page_n]
zoom = min(img_w / page.rect.width, img_h / page.rect.height)
pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom))
img = Image.frombytes("RGB", (pix.width, pix.height), pix.samples)
photo_ref[0] = ImageTk.PhotoImage(img)
lbl_img.config(image=photo_ref[0])
page_count = len(doc)
root.title(f"Varianta {n+1}: {variants[n]['label']} ({variants[n]['size_kb']} kB) — strana {page_n+1}/{page_count}")
for i, b in enumerate(btn_variants):
b.config(bg="#2a5a9a" if i == n else "#444")
btn_prev_page.config(state="normal" if page_n > 0 else "disabled")
btn_next_page.config(state="normal" if page_n < page_count - 1 else "disabled")
for i, v in enumerate(variants):
b = tk.Button(
frame_top,
text=f"{i+1}. {v['label']}\n{v['size_kb']} kB",
font=("Segoe UI", 9, "bold"),
bg="#444", fg="white",
relief="flat", padx=8, pady=6,
command=lambda n=i: show(n),
)
b.pack(side="left", padx=2, pady=4)
btn_variants.append(b)
# ── Tlačítka Beru / Přeskočit — stejný styl jako varianty ──
def beru():
chosen["path"] = variants[current[0]]["path"]
root.destroy()
def preskocit():
root.destroy()
tk.Button(
frame_top,
text="✓ Tohle beru\n",
command=beru,
bg="#2a7a2a", fg="white",
font=("Segoe UI", 9, "bold"),
relief="flat", padx=8, pady=6,
).pack(side="left", padx=2, pady=4)
tk.Button(
frame_top,
text="✗ Přeskočit\n",
command=preskocit,
bg="#7a2a2a", fg="white",
font=("Segoe UI", 9, "bold"),
relief="flat", padx=8, pady=6,
).pack(side="left", padx=2, pady=4)
# ── Navigace stran — úplně vpravo ──
btn_next_page = tk.Button(
frame_top,
text="Další ►\n",
command=lambda: show(current[0], current_page[0] + 1),
bg="#555", fg="white",
font=("Segoe UI", 9, "bold"),
relief="flat", padx=8, pady=6,
)
btn_next_page.pack(side="right", padx=2, pady=4)
btn_prev_page = tk.Button(
frame_top,
text="◄ Před.\n",
command=lambda: show(current[0], current_page[0] - 1),
bg="#555", fg="white",
font=("Segoe UI", 9, "bold"),
relief="flat", padx=8, pady=6,
)
btn_prev_page.pack(side="right", padx=2, pady=4)
# ── Obrázek ──
lbl_img = tk.Label(root, bg="black")
lbl_img.pack(fill="both", expand=True)
root.bind("<Key-1>", lambda e: show(0))
root.bind("<Key-2>", lambda e: show(1))
root.bind("<Key-3>", lambda e: show(2))
root.bind("<Key-4>", lambda e: show(3))
root.bind("<Key-5>", lambda e: show(4))
root.bind("<Return>", lambda e: beru())
root.bind("<Escape>", lambda e: preskocit())
show(0)
root.mainloop()
for d in docs:
try:
d.close()
except Exception:
pass
print(json.dumps({"chosen": chosen["path"]}, ensure_ascii=False))
if __name__ == "__main__":
main()