import subprocess
import sys
from PyQt5.QtWidgets import (
QApplication, QWidget, QLabel, QPushButton, QLineEdit,
QFileDialog, QVBoxLayout, QHBoxLayout, QCheckBox, QMessageBox, QProgressBar, QTextEdit
)
from PyQt5.QtCore import Qt
class AutoPyToExe(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle("CG Py to Exe")
self.setFixedSize(600, 600)
self.setStyleSheet("""
QWidget {
background-color: #2E2E2E;
color: white;
font-family: Arial;
font-size: 14px;
}
QPushButton {
background-color: #4CAF50;
border: none;
color: white;
padding: 5px 8px;
text-align: center;
text-decoration: none;
font-size: 10px;
margin: 4px 2px;
border-radius: 5px;
min-width: 80px;
}
QPushButton:hover {
background-color: #45a049;
}
QLineEdit {
background-color: #3C3C3C;
color: white;
padding: 5px;
border: 1px solid #555;
border-radius: 3px;
min-width: 450px;
max-width: 600px;
}
QCheckBox {
padding: 5px;
}
QLabel {
padding: 5px;
}
QProgressBar {
border: 2px solid grey;
border-radius: 5px;
text-align: center;
font-size: 10px;
min-height: 30px;
padding: 0px;
}
QProgressBar::chunk {
background-color: #05B8CC;
width: 20px;
}
QTextEdit {
background-color: #1E1E1E;
color: #00FF00;
padding: 5px;
border: 1px solid #555;
border-radius: 3px;
}
""")
main_layout = QVBoxLayout()
title_label = QLabel("CG Py to EXE")
title_label.setStyleSheet("font-size: 24px; font-weight: bold;")
title_label.setAlignment(Qt.AlignCenter)
main_layout.addWidget(title_label)
py_file_label = QLabel("Python Dosyası Seç:")
py_file_label.setToolTip("Dönüştürmek istediğiniz .py dosyasını seçin.")
main_layout.addWidget(py_file_label)
py_file_layout = QHBoxLayout()
self.py_file_input = QLineEdit()
self.py_file_input.setReadOnly(True)
self.py_file_input.setToolTip("Seçilen Python dosyasının yolu.")
py_file_layout.addWidget(self.py_file_input)
self.browse_py_button = QPushButton("Gözat")
self.browse_py_button.setToolTip("Python dosyasını seçmek için tıklayın.")
self.browse_py_button.clicked.connect(self.browse_py_file)
py_file_layout.addWidget(self.browse_py_button)
main_layout.addLayout(py_file_layout)
self.onefile_checkbox = QCheckBox("Tek Dosya")
self.onefile_checkbox.setToolTip("Uygulamayı tek bir .exe dosyası olarak paketler.")
self.onefile_checkbox.setChecked(True)
main_layout.addWidget(self.onefile_checkbox)
self.noconsole_checkbox = QCheckBox("Konsol Penceresini Açma")
self.noconsole_checkbox.setToolTip("Uygulama çalışırken konsol penceresi açılmaz.")
main_layout.addWidget(self.noconsole_checkbox)
icon_label = QLabel("Simge Dosyası Seç (isteğe bağlı):")
icon_label.setToolTip("EXE dosyasına eklemek istediğiniz .ico dosyasını seçin.")
main_layout.addWidget(icon_label)
icon_layout = QHBoxLayout()
self.icon_input = QLineEdit()
self.icon_input.setReadOnly(True)
self.icon_input.setToolTip("Seçilen simge dosyasının yolu.")
icon_layout.addWidget(self.icon_input)
self.browse_icon_button = QPushButton("Gözat")
self.browse_icon_button.setToolTip("Simge dosyasını seçmek için tıklayın.")
self.browse_icon_button.clicked.connect(self.browse_icon_file)
icon_layout.addWidget(self.browse_icon_button)
main_layout.addLayout(icon_layout)
output_label = QLabel("Çıktı Klasörü Seç:")
output_label.setToolTip("Dönüştürülen .exe dosyasının kaydedileceği klasörü seçin.")
main_layout.addWidget(output_label)
output_layout = QHBoxLayout()
self.output_input = QLineEdit()
self.output_input.setReadOnly(True)
self.output_input.setToolTip("Seçilen çıktı klasörünün yolu.")
output_layout.addWidget(self.output_input)
self.browse_output_button = QPushButton("Gözat")
self.browse_output_button.setToolTip("Çıktı klasörünü seçmek için tıklayın.")
self.browse_output_button.clicked.connect(self.browse_output_folder)
output_layout.addWidget(self.browse_output_button)
main_layout.addLayout(output_layout)
additional_options_label = QLabel("Ek PyInstaller Seçenekleri (isteğe bağlı):")
additional_options_label.setToolTip("PyInstaller'a eklemek istediğiniz seçenekleri buraya yazın.")
main_layout.addWidget(additional_options_label)
self.additional_options_input = QLineEdit()
self.additional_options_input.setToolTip("Örneğin: --hidden-import=module_name")
main_layout.addWidget(self.additional_options_input)
output_name_label = QLabel("Çıktı Dosya Adı (isteğe bağlı):")
output_name_label.setToolTip("Oluşturulacak .exe dosyasının adını belirtin.")
main_layout.addWidget(output_name_label)
self.output_name_input = QLineEdit()
self.output_name_input.setToolTip("EXE dosyasının adı (uzantı olmadan).")
main_layout.addWidget(self.output_name_input)
self.convert_button = QPushButton("Dönüştür")
self.convert_button.setStyleSheet("background-color: #2196F3; font-size: 16px; padding: 10px;")
self.convert_button.setToolTip("Dönüştürme işlemini başlatmak için tıklayın.")
self.convert_button.clicked.connect(self.convert_to_exe)
main_layout.addWidget(self.convert_button)
self.progress_bar = QProgressBar()
self.progress_bar.setValue(0)
self.progress_bar.setToolTip("Dönüştürme işleminin ilerleme durumunu gösterir.")
main_layout.addWidget(self.progress_bar)
log_label = QLabel("Dönüştürme Logları:")
log_label.setToolTip("Dönüştürme işlemi sırasında oluşan logları gösterir.")
main_layout.addWidget(log_label)
self.log_output = QTextEdit()
self.log_output.setReadOnly(True)
self.log_output.setStyleSheet("background-color: #1E1E1E; color: #00FF00;")
self.log_output.setToolTip("Dönüştürme işlemi sırasında oluşan loglar.")
main_layout.addWidget(self.log_output)
self.setLayout(main_layout)
def browse_py_file(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(
self,
"Python Dosyası Seç",
"",
"Python Dosyaları (*.py);;Tüm Dosyalar (*)",
options=options
)
if file_name:
self.py_file_input.setText(file_name)
def browse_icon_file(self):
options = QFileDialog.Options()
file_name, _ = QFileDialog.getOpenFileName(
self,
"Simge Dosyası Seç",
"",
"Icon Dosyaları (*.ico);;Tüm Dosyalar (*)",
options=options
)
if file_name:
self.icon_input.setText(file_name)
def browse_output_folder(self):
options = QFileDialog.Options()
folder = QFileDialog.getExistingDirectory(
self,
"Çıktı Klasörü Seç",
"",
options=options
)
if folder:
self.output_input.setText(folder)
def convert_to_exe(self):
py_file = self.py_file_input.text()
output_folder = self.output_input.text()
if not py_file:
QMessageBox.warning(self, "Hata", "Lütfen bir Python dosyası seçin.")
return
if not output_folder:
QMessageBox.warning(self, "Hata", "Lütfen bir çıktı klasörü seçin.")
return
onefile = "--onefile" if self.onefile_checkbox.isChecked() else ""
noconsole = "--noconsole" if self.noconsole_checkbox.isChecked() else ""
icon = f'--icon="{self.icon_input.text()}"' if self.icon_input.text() else ""
additional_options = self.additional_options_input.text()
output_name = f'--name="{self.output_name_input.text()}"' if self.output_name_input.text() else ""
command = f'pyinstaller {onefile} {noconsole} {icon} {output_name} "{py_file}" --distpath "{output_folder}" {additional_options}'
self.progress_bar.setValue(0)
self.log_output.clear()
self.log_output.append("Dönüştürme işlemi başlatılıyor...\n")
try:
process = subprocess.Popen(
command,
shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
text=True
)
for line in process.stdout:
self.log_output.append(line.strip())
self.update_progress(line)
process.wait()
if process.returncode == 0:
self.progress_bar.setValue(100)
QMessageBox.information(self, "Başarılı", "Dönüştürme işlemi tamamlandı.")
else:
QMessageBox.critical(self, "Hata", "Dönüştürme işlemi sırasında bir hata oluştu.")
except Exception as e:
QMessageBox.critical(self, "Hata", f"Dönüştürme sırasında bir hata oluştu:\n{e}")
self.progress_bar.setValue(0)
def update_progress(self, log_line):
if "Building" in log_line and "spec" in log_line:
self.progress_bar.setValue(10)
elif "running analysis" in log_line:
self.progress_bar.setValue(30)
elif "creating EXE" in log_line:
self.progress_bar.setValue(60)
elif "Building EXE" in log_line:
self.progress_bar.setValue(80)
elif "Done" in log_line:
self.progress_bar.setValue(100)
def main():
app = QApplication(sys.argv)
window = AutoPyToExe()
window.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()