Birden fazla py dosyası ve harici dosyalarla tek bir exe oluşturulabilir mi?

tkinter GUI ile basit bir mayın tarlası benzeri bir oyun tasarladım. Görsellerle projeyi ilgi çekici hale getirmeye çalışırken aynı zamanda birden fazla seviye olduğu için çokça py dosyasıyla ayrı ayrı çalışmak durumunda kaldım. Scriptin çalışması için bütün resim datalarına ve py uzantılı dosyalara ihtiyacı var. cx_freeze modülü ile “main.py” dosyamı exe uzantılı yapabiliyorum ancak diğer py uzantılı dosyalara ve image klasörüne ihtiyacı olduğu için çalışmıyor.

@dildeolupbiten hocanın bu linkteki vermiş olduğu setup.py kodlarını kendime göre düzenledim. Ancak linkteki hatayı aldım. Kullandığım setup.py dosyası :

import os
import sys
from cx_Freeze import setup, Executable

os.environ['TCL_LIBRARY'] = r'C:\Users\xxx\AppData\Local\Programs\Python\Python37\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\xxx\AppData\Local\Programs\Python\Python37\tcl\tk8.6'

buildOptions = dict(
    packages = [],
    excludes = [],
    include_files = [r'C:\Users\xxx\AppData\Local\Programs\Python\Python37\DLLs\tcl86t.dll',
                     r'C:\Users\xxx\AppData\Local\Programs\Python\Python37\DLLs\tk86t.dll',
                     r'C:\Users\xxx\Desktop\GameOfHacker\main_support.py',
                     r'C:\Users\xxx\Desktop\GameOfHacker\tutorial.py',
                     r'C:\Users\xxx\Desktop\GameOfHacker\level1.py',
                     r'C:\Users\xxx\Desktop\GameOfHacker\level2.py',]

    )               

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
    name = "isim",
    version = "0.1",
    description = "açıklama",
    options = dict(build_exe = buildOptions),
    executables = [Executable("main.py", base=base)])    ```

Merhaba. Pyinstaller ile bu istediğinizi yapabilirsiniz diye düşünüyorum. Yine de resim dosyaları gibi şeylerin uygulamanın dışında durması da gayet normal bir şey.

Değerli yorumunuz için teşekkür ederim.
Screenshot by Lightshot bu dosyaların hepsini aynı exe’de nasıl oluşturabilirim PyInstaller ile ?
auto-py-to-exe ile denediğimde ( tam emin olmamakla birlikte, sanırım o da Pyinstaller modülü ile oluşturulmuş bir gui) “.py” uzantılı dosyalarım aynı uzantı ile kalmıştı. Oluşturulan exe’ye tıkladığımda ise FatalError vermişti.

Resim dosyaları ayrı bir klasör şeklinde dosya dizininde kalmalı, zaten istediğimde bu yönde. Ancak “.py” uzantılı diğer dosyalarımı oluşturulan “.exe” sanırım tanımıyor, ya da okuyamıyor.

Uygulamayı resim dosyalarına erişebileceği bir dizinde çalıştırıyorsunuz, değil mi?

resim dosyalarının yolu kodlarda img/xxx.png şeklinde tanımlı.

import cx_Freeze
import sys
import os

os.environ['TCL_LIBRARY'] = r'C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python36\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\\Users\\xxx\\AppData\\Local\\Programs\\Python\\Python36\tcl\tk8.6'

executables = [
    cx_Freeze.Executable( 
        script="main.py",
        base = "Win32GUI"
    )
]

cx_Freeze.setup(
    name='Game of Hacker',
    options={'build_exe':{'packages':['tkinter'], 'include_files':[r'C:\Users\xxx\Desktop\GameOfHacker\img',r'C:\Users\xxx\Desktop\GameOfHacker' ]}},
    executables = executables,
    version = '1.0.0'
)

En son bu kod bloğuyla build etmeye çalıştığımda exe açıldığında yine aynı hatayı verdi. “main.py” adlı dosyamın 3. satırında from tkinter import messagebox bulunuyor. Verdiği hata bu satırdan kaynaklanıyor olabilir mi? “setup.py” dosyasının packages kısmına messagebox’u eklemeye çalıştığımda build edemedim. {'packages':['tkinter','messagebox']} denemeyi de böyle yapmıştım. Ekte bulunan .exe’nin verdiği hata “main.py” adlı dosyamın 3. satırından kaynaklanıyor gibi geldi bana ama messagebox’u zaten tkinter’den çekiyor, zaten setup dosyasına eklemeye çalıştığımda da hata verip build etmemişti.
verdiği hata ise şu şekilde :

   raise ImportError("No module named %r" % name)
ImportError: No module named 'messagebox'  ```
  1. satırda bulunan kodu alt satırlara alınca verdiği hata daha da uzadı :slight_smile:

Sorunumu Pyinstaller kullanarak çözdüm. Ancak öncesinde main dosyam dışındaki dosyalarımın en altında bulunan

if __name__ == '__main__':
    import main
    main.start_gui()

kodları sildim. Bu kodlar o dosyalara tıkladığımda da “main.py” yi çalıştırmak için yazdığım kodlardı.
Exe’ye çevireceğim dosyanın bulunduğu dizinde shift + <sol tık> yaparak komut istemini burada aç dedim ve aşağıdaki kodları yazarak exe’ye çevirme işlemini gerçekleştirdim.

pyinstaller.exe --noconsole --icon=icon/icon.ico main.py

Daha sonra resim dosyalarını barındırdığım img klasörünü yeni oluşturuluan dist klasörüne, klasör şeklinde yapıştırdım.

@EkremDincel hocaya yol gösterdiği için teşekkür ederim. py-to-exe ile başarısız sonuç alınca Pyinstaller’i denememiştim. Tavsiyesi üzerine pyinstaller ile deneyerek sonuca ulaştım.

1 Beğeni