Çözüldü Birkaç .py ile EXE oluşturma

  • Konuyu başlatan Konuyu başlatan Boromir
  • Başlangıç Tarihi Başlangıç Tarihi
  • Mesaj Mesaj 11
  • Görüntüleme Görüntüleme 240
  • Etiketler Etiketler
    exe python
Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Boromir

Becerikli
Katılım
27 Ağustos 2024
Mesajlar
190
Makaleler
1
Çözümler
4
Beğeniler
91
1729869073423.webp


Arkadaslar, simdi ben bir proje yaptim. Cok basit bir proje. Login.py ve login oluyorsunuz login oldugunda bir DASHBOARD var. Iste dashboard'dayken log out olursaniz tekrar login page'ine geliyorsunuz. Pyinstaller kullandim sadece login page cikiyor.

Kod:
from pathlib import Path
from tkinter import Tk, Canvas, Entry, Button, PhotoImage
import time
import subprocess
import traceback
import sys
import logging
# Path ayarları
OUTPUT_PATH = Path(__file__).parent
ASSETS_PATH = OUTPUT_PATH / Path(r"C:\Users\Hageshiku-7900\OneDrive\Desktop\build\assets\LoginResimleri")
import os
import sys


# Dinamik dosya yolu fonksiyonu (resource_path)
def resource_path(relative_path):
    """Statik dosyaların dinamik yolu, onedir moduna PyInstaller uyumlu."""
    try:
        # PyInstaller ile paketlendiğinde geçici dizin 'MEIPASS' içinde çalışır
        base_path = sys._MEIPASS
    except AttributeError:
        # Geliştirme ortamında mevcut dosya konumunu kullan
        base_path = os.path.abspath(".")
   
    # Sonucu terminale yazdırarak kontrol edelim
    print(f"base_path: {base_path}")
    return os.path.join(base_path, relative_path)
def relative_to_assets(path: str) -> Path:
    return ASSETS_PATH / Path(path)
# Log ayarları
log_file_path = os.path.join(os.path.expanduser("~"), "error_log.txt")
logging.basicConfig(filename=log_file_path, level=logging.DEBUG,
                    format='%(asctime)s %(levelname)s %(message)s', filemode='a')
# Sahte bir API çağrısı simülasyonu
def mock_api_call(email, password):
    print(f"API çağrısı yapılıyor: Email: {email}, Şifre: {password}")
    time.sleep(2)  # Simülasyon için 2 saniye bekliyoruz
    if email == "a" and password == "1":
        print("Giriş başarılı, API'den doğrulandı.")
        return True
    else:
        print("Giriş başarısız, yanlış bilgiler.")
        return False

# Pencereyi yavaşça saydamlaştırarak kapatmak
def smooth_transition_to_dashboard():
    alpha = window.attributes("-alpha")
    if alpha > 0:
        alpha -= 0.05
        window.attributes("-alpha", alpha)
        window.after(50, smooth_transition_to_dashboard)
    else:
        successful_login()


# Başarılı giriş sonrası SONCALISANDIKKAT.py'yi başlatma fonksiyonu
import runpy
def successful_login():
    try:
        print("SONCALISANDIKKAT.py başlatılıyor...")
       
        # Dinamik olarak tam dosya yolunu alıyoruz, çift '_internal' kullanmıyoruz.
        script_path = resource_path("SONCALISANDIKKAT.py")
        print(f"Tam dosya yolu: {script_path}")
        logging.info(f"Tam dosya yolu: {script_path}")
       
        # Dosya mevcut mu kontrol et
        if os.path.exists(script_path):
            print(f"{script_path} bulundu, çalıştırılıyor...")
            logging.info(f"{script_path} bulundu, çalıştırılıyor...")
           
            # Login penceresini kapatalım
            window.destroy()
            process = subprocess.Popen([sys.executable, script_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            stdout, stderr = process.communicate()  # Çıktıları yakalayalım

            print(f"SONCALISANDIKKAT.py stdout: {stdout.decode()}")
            print(f"SONCALISANDIKKAT.py stderr: {stderr.decode()}")

        else:
            raise FileNotFoundError(f"{script_path} dosyası bulunamadı!")
           
    except Exception as e:
        error_message = f"SONCALISANDIKKAT.py başlatılırken bir hata oluştu:\n{traceback.format_exc()}"
        log_error(error_message)  # Hata mesajını hem loga hem terminale yazdır



       
# Hata loglama fonksiyonu
def log_error(message):
    """Hataları hem terminale hem de log dosyasına yazdırır."""
    print(message)
    logging.error(message)




# Giriş kontrolü ve dashboard'a geçiş
def login():
    email = entry_1.get()
    password = entry_2.get()

    # Mock API çağrısı yapıyoruz
    if mock_api_call(email, password):
        smooth_transition_to_dashboard()  # Giriş başarılı ise smooth geçiş

window = Tk()
window.geometry("1366x768")
window.configure(bg="#FFFFFF")
window.attributes("-alpha", 1.0)  # Pencerenin tam opak olarak başlamasını sağlıyoruz

canvas = Canvas(
    window,
    bg="#FAD4B8",
    height=768,
    width=1366,
    bd=0,
    highlightthickness=0,
    relief="ridge"
)
canvas.place(x=0, y=0)

image_image_1 = PhotoImage(file=relative_to_assets("image_1.png"))
canvas.create_image(181.0, 424.1875, image=image_image_1)

image_image_2 = PhotoImage(file=relative_to_assets("image_2.png"))
canvas.create_image(957.3916625976562, 383.5093688964844, image=image_image_2)

image_image_3 = PhotoImage(file=relative_to_assets("image_3.png"))
canvas.create_image(319.0, 386.0, image=image_image_3)

image_image_4 = PhotoImage(file=relative_to_assets("image_4.png"))
canvas.create_image(248.0, 176.1875, image=image_image_4)

canvas.create_text(152.0, 239.0, anchor="nw", text="Email", fill="#333333", font=("Gilroy Medium", 13 * -1))

entry_image_1 = PhotoImage(file=relative_to_assets("entry_1.png"))
entry_bg_1 = canvas.create_image(319.5, 283.0, image=entry_image_1)
entry_1 = Entry(bd=0, bg="#FFFFFF", fg="#000716", highlightthickness=0)
entry_1.place(x=156.0, y=263.0, width=327.0, height=38.0)

canvas.create_text(362.0, 399.0, anchor="nw", text="Forgot Password?", fill="#AE4700", font=("Gilroy Medium", 14 * -1))

button_image_1 = PhotoImage(file=relative_to_assets("button_1.png"))
button_1 = Button(
    image=button_image_1,
    borderwidth=0,
    highlightthickness=0,
    command=login,  # Giriş işlemine yönlendiriyoruz
    relief="flat"
)
button_1.place(x=152.0, y=447.99749755859375, width=335.0, height=32.0)

canvas.create_text(152.0, 319.0, anchor="nw", text="Password", fill="#333333", font=("Gilroy Medium", 13 * -1))

entry_image_2 = PhotoImage(file=relative_to_assets("entry_2.png"))
entry_bg_2 = canvas.create_image(319.5, 363.0, image=entry_image_2)
entry_2 = Entry(bd=0, bg="#FFFFFF", fg="#000716", highlightthickness=0, show='*')  # Şifre girişini gizlemek için
entry_2.place(x=156.0, y=343.0, width=327.0, height=38.0)

image_image_5 = PhotoImage(file=relative_to_assets("image_5.png"))
canvas.create_image(308.0, 529.1875, image=image_image_5)

window.resizable(False, False)
window.mainloop()

Bunun kodla alakali kismi ancak Successful_login'de olur diye dusunuyorum ama bir pathing de soz konusu... Kod lokalde calisiyor ama bir turlu exe yapamadim bu yazdigim kodu.
 
Üstüne konuda söylenene göre her modülde .exe yapıp sağda solda açma olayı işe yaramıyormuş.
Teknik olarak çalışmalı. Yani yaptığı şey her şeyi tek klasöre koyup python interpreter'ı ile çalıştırmak.

PyInstaller'ın çalışma mantığı şu;
"PyInstaller reads a Python script written by you. It analyzes your code to discover every other module and library your script needs in order to execute. Then it collects copies of all those files – including the active Python interpreter! – and puts them with your script in a single folder, or optionally in a single executable file." (Kaynak: What PyInstaller Does and How It Does It — PyInstaller 6.11.0 documentation)

Çevirisi:
"PyInstaller sizin tarafınızdan yazılmış bir Python scriptini okur. Scriptinizin çalıştırılabilimesi için gerekli, kullanılan tüm diğer modül ve kütüphaneleri bulmak için kodunuzu analiz eder. Daha sonrasında bütün bu dosyaların kopyalarını toplar - Python interpreter'ı da dahil! - ve onları sizin scriptiniz ile birlikte tek bir klasöre yada isteğe bağlı olarak tek bir çalıştırılabilirin içine yerleştirir."

Ancak burada bir durum var. Belki bundan kaynaklanıyor olabilir, emin değilim;
"The bundled app does not include any source code. However, PyInstaller bundles compiled Python scripts (<span>.pyc</span> files). These could in principle be decompiled to reveal the logic of your code." (Kaynak: What PyInstaller Does and How It Does It — PyInstaller 6.11.0 documentation)

Çevirisi:
"Paketlenmiş uygulama hiç bir kaynak kodu içermez. Ancak, PyInstaller derlenmiş python scriptlerini (.pyc dosyalarını) paketler. Bu dosyalar teoride decompile ile kodunuzun mantığını çözmek için kullanılabilir."

Eğer cache versiyonu Python'un tam olarak tüm pathleri analiz edemiyorsa (ki sanmıyorum), belki bundan kaynaklı sapıtmalar ve başarısız executionlar oluyor olabilir.

Not: Yazıların çevirilerini kural 51 sebebiyle ve yazının tüm okurlar tarafından net bir şekilde anlaşılabilmesi için paylaşıyorum.
 

Yeni konular

Geri
Yukarı Alt