-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathbuild.py
More file actions
122 lines (103 loc) · 4.79 KB
/
Copy pathbuild.py
File metadata and controls
122 lines (103 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import argparse
import os
import sys
import subprocess
from pathlib import Path
# Pillow ile PNG -> ICO dönüştürme
def png_to_ico(png_path: Path, ico_path: Path):
try:
from PIL import Image
except ImportError:
print("Pillow yüklü değil. Lütfen: pip install pillow")
sys.exit(1)
if not png_path.exists():
print(f"HATA: {png_path} bulunamadı.")
sys.exit(1)
img = Image.open(png_path).convert("RGBA")
# Çok boyutlu ICO: 16, 32, 48, 64, 128, 256
sizes = [(16,16), (32,32), (48,48), (64,64), (128,128), (256,256)]
# Büyükten küçüğe yeniden örnekleme ile net sonuç
imgs = []
for w, h in sizes:
imgs.append(img.resize((w, h), Image.LANCZOS))
# Pillow tek kayıtta birden fazla boyutu destekler; ilk görüntü + sizes parametresiyle yazalım
# Not: Bazı Pillow sürümlerinde sizes parametresi yeterli. Gerekirse tek tek kaydetmek de mümkün.
img.save(ico_path, format="ICO", sizes=sizes)
def main():
parser = argparse.ArgumentParser(description="PNG ikon ile PyInstaller .exe üretici")
parser.add_argument("--entry", default="main.py", help="Giriş dosyası (default: main.py)")
parser.add_argument("--name", default="TaxClicker", help="Uygulama adı / exe adı")
parser.add_argument("--png", default="imagelogo.png", help="PNG ikon yolu (default: imagelogo.png)")
parser.add_argument("--ico", default="imagelogo.ico", help="Üretilecek ICO ikon yolu (default: imagelogo.ico)")
parser.add_argument("--noconsole", action="store_true", help="Konsolsuz mod (GUI uygulamaları için)")
parser.add_argument("--onefile", action="store_true", help="Tek dosya .exe (–onefile)")
parser.add_argument("--add-data", nargs="*", default=None,
help='Ek veri klasör/dosyaları. Biçim: "kaynak;hedef" (Windows) veya "kaynak:hedef" (Linux/Mac)')
parser.add_argument("--hidden-import", nargs="*", default=None,
help="Gizli importlar, ör: PySide6.QtSvg PySide6.QtNetwork ...")
args = parser.parse_args()
project_root = Path(__file__).parent.resolve()
entry_path = (project_root / args.entry).resolve()
if not entry_path.exists():
print(f"HATA: Giriş dosyası bulunamadı: {entry_path}")
sys.exit(1)
png_path = (project_root / args.png).resolve()
ico_path = (project_root / args.ico).resolve()
# 1) PNG -> ICO
print(f"PNG -> ICO dönüştürülüyor: {png_path.name} -> {ico_path.name}")
png_to_ico(png_path, ico_path)
# 2) PyInstaller komutu hazırlama
cmd = ["pyinstaller", "--clean", "--name", args.name, "--icon", str(ico_path)]
# GUI ise konsolu gizle
if args.noconsole:
cmd.append("--noconsole")
# Tek dosya ister misiniz?
if args.onefile:
cmd.append("--onefile")
# Ortam ayırıcı (Windows ; — Linux/Mac :)
sep = ";" if os.name == "nt" else ":"
# Yaygın klasörleri otomatik ekle (varsa)
auto_dirs = ["assets", "asset", "res", "resources", "ui", "images", "icons"]
for d in auto_dirs:
p = project_root / d
if p.exists():
cmd.extend(["--add-data", f"{str(p)}{sep}{d}"])
# Kullanıcıdan gelen add-data parametreleri
if args.add_data:
for spec in args.add_data:
# Kullanıcı Windows'ta da ":" yazmış olabilir; otomatik düzeltelim
if os.name == "nt" and ":" in spec and ";" not in spec:
src, dst = spec.split(":", 1)
spec = f"{src}{sep}{dst}"
cmd.extend(["--add-data", spec])
# Yaygın Qt/PySide6 gizli importları (isteğe bağlı, gerçek kullanımınıza göre ekleyin)
default_hidden = [
# "PySide6.QtSvg", # SVG kullanıyorsanız açın
# "PySide6.QtNetwork", # Ağ modülleri
# "PySide6.QtGui",
# "PySide6.QtWidgets",
# "PySide6.QtCore",
]
hidden_imports = (args.hidden_import or []) + default_hidden
for mod in hidden_imports:
if mod.strip():
cmd.extend(["--hidden-import", mod.strip()])
# Son olarak giriş dosyası
cmd.append(str(entry_path))
print("Çalıştırılıyor:", " ".join(cmd))
# 3) PyInstaller çalıştır
try:
subprocess.check_call(cmd)
except subprocess.CalledProcessError as e:
print(f"PyInstaller hata kodu ile döndü: {e.returncode}")
sys.exit(e.returncode)
# 4) Çıktı bilgisi
dist_dir = project_root / "dist" / args.name
exe_path = (project_root / "dist" / (args.name + ".exe")) if args.onefile else (dist_dir / (args.name + ".exe"))
if exe_path.exists():
print(f"Tamamlandı! Çıktı: {exe_path}")
else:
# onefile değilse exe alt klasörde olabilir
print("İşlem tamamlandı. dist/ klasörünü kontrol edin.")
if __name__ == "__main__":
main()