Bu konu çözüldü olarak işaretlenmiştir. Çözülmediğini düşünüyorsanız konuyu rapor edebilirsiniz.

Boromir

Uzman
Katılım
27 Ağustos 2024
Mesajlar
279
Çözümler
6
Beğeniler
136
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.
 
PyInstaller'ı nasıl kullandınız?
pyinstaller --onefile --add-data "C:/Users/********/OneDrive/Desktop/build/assets/LoginResimleri;./build/assets/LoginResimleri" --add-data "C:/Users/*******/OneDrive/Desktop/DENEME/SONCALISANDIKKAT.py;." login.py
Boyle kullandim. Her turlu discord'a skype'a acigim. Herseyi yaptim burasi kaldi.
 
Eki Görüntüle 93492

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.
Kütüphane kişide yoksa ne oluyor?
 
Pyinstaler'e gerek yok.
python.exe ve python.dll dosyalarını ve programını, ve de gerekli modül/kütüphane, ne gerekiyorsa aynı klasöre koyuyorsun ve bir de başlatıcı ekleyip (.BAT dosyası olabilir) her hangi bir paketleme programı ile .setup.exe olarak paketliyorsun.

Bazı modüller (.pyc dosyaları) yine başka modüllere gerek duyuyor. Bu nedenle Python'u iyi bilmen gerekiyor. Neyin ne işe yaradığını bilmediğin süre zorlanırsın.

(TKinter'i de dahil etmen gerekiyor. TKinter ise TCL isimli başka bir programlama dilinin Toolkit (Araç kutusu) modülü. TCL olmadan çalışmayacak.)
 
Başta --onefile kullanmadığınızı düşünmüştüm. Şöyle bir örnek hazırlayıp test ettim.

1729873760897.webp


Bu şekilde kullanınca çalışıyordu.
Kod:
pyinstaller --onefile --add-data "assets;assets" --add-data "extra_script.py;." main.py

Ben extra_script.py dosyasını exec ile çalıştırıyordum. Sizin gibi subprocess deneyince saçmalamaya başladı. Recursive şekilde kendini çalıştırıyor. Çözemedim. Ama zaten yaptığınız şey tüm olaya aykırı değil mi? Bir C programında ikinci scripti Python.exe ile çalıştırmaktan ne farkı var? Üstüne konuda söylenene göre her modülde .exe yapıp sağda solda açma olayı işe yaramıyormuş.