problemy z tkinterdnd2. Uruchomienie i kompiilacja na .exe nie działa

0

cześć.

Mam problem przy próbie odpalenia z biblioteką tkinterdnd2. Próbowałem już wszelkich rzeczy z internetu aczkolwiek żadna mi nie jest w stanie pomóc. Czy jest ktoś w stanie określić czy sam kod jest poprawny i czy mu się kompiluje do formatu .exe? Miałem gdzieś wcześniejszą wersje która była w stanie mi się odpalić raz.. Potem już nie chciało to działać. Mimo wszystko gdy zmieniałem rozszerzenie na .exe to poprzedni plik nie chciał się odpalić a pod .py działał..... Nie mam już na to żadnego pomysłu

import os
import time
import datetime
from pathlib import Path
from tkinter import Tk, Label, Entry, Button, StringVar, OptionMenu, filedialog
from tkinterdnd2 import TkinterDnD, DND_FILES

def get_latest_file(folder):
    path = Path(folder)
    files = list(path.glob('*'))
    if not files:
        return None
    latest_file = max(files, key=os.path.getctime)
    return latest_file.name

def update_fields(*args):
    for widget in specific_fields:
        widget.grid_remove()

    if job_type_var.get() == 'Content Digital':
        maszyna_label.grid(row=3, column=0, padx=10, pady=5)
        maszyna_menu.grid(row=3, column=1, padx=10, pady=5)
        wykonczenie_label.grid(row=4, column=0, padx=10, pady=5)
        wykonczenie_menu.grid(row=4, column=1, padx=10, pady=5)
    elif job_type_var.get() == 'Content Inkjet':
        tytul_label.grid(row=3, column=0, padx=10, pady=5)
        tytul_entry.grid(row=3, column=1, padx=10, pady=5)
        rozmiar_label.grid(row=4, column=0, padx=10, pady=5)
        rozmiar_entry.grid(row=4, column=1, padx=10, pady=5)
        data_label.grid(row=5, column=0, padx=10, pady=5)
        data_entry.grid(row=5, column=1, padx=10, pady=5)
    elif job_type_var.get() == 'Cover':
        okladka_label.grid(row=3, column=0, padx=10, pady=5)
        okladka_menu.grid(row=3, column=1, padx=10, pady=5)
        laminat_label.grid(row=4, column=0, padx=10, pady=5)
        laminat_menu.grid(row=4, column=1, padx=10, pady=5)
        data_label.grid(row=5, column=0, padx=10, pady=5)
        data_entry.grid(row=5, column=1, padx=10, pady=5)

def on_drop(event):
    file_path = event.data
    latest_file = os.path.basename(file_path)
    
    try:
        if job_type_var.get() == 'Content Digital':
            numer = numer_entry.get()
            express = express_var.get()
            express = '' if express == 'Nie' else 'EXPRESS'
            maszyna = maszyna_var.get()
            maszyna = 'CONTENT' if maszyna == 'HP' else 'KM-1-CONTENT' if maszyna == 'KM' else 'IX3200-CONTENT'
            wykonczenie = wykonczenie_var.get()
            wykonczenie = 'SWB' if wykonczenie == 'Szycie' else 'PB' if wykonczenie == 'Klejenie' else 'WIO'
            papier = papier_entry.get().upper()
            kolor = kolor_var.get()
            ilosc = ilosc_entry.get()
            new_filename = f"{numer}_{express}_{maszyna}_{wykonczenie}_{papier}_{kolor}_{ilosc}.pdf"
        elif job_type_var.get() == 'Content Inkjet':
            numer = numer_entry.get()
            express = express_var.get()
            express = '' if express == 'Nie' else 'EXPRESS '
            tytul = tytul_entry.get()
            ilosc = ilosc_entry.get()
            papier = papier_entry.get().upper()
            kolor = kolor_var.get()
            rozmiar = rozmiar_entry.get()
            data = data_entry.get()
            new_filename = f"{express}{numer}_{tytul}_{ilosc}qty_{papier}_{kolor}_{rozmiar}mm_{data}.pdf"
        elif job_type_var.get() == 'Cover':
            numer = numer_entry.get()
            express = express_var.get()
            express = '' if express == 'Nie' else 'EXPRESS '
            okladka = okladka_var.get()
            ilosc = ilosc_entry.get()
            papier = papier_entry.get().upper()
            kolor = kolor_var.get()
            laminat = laminat_var.get()
            data = data_entry.get()
            new_filename = f"{express}{numer} {okladka} {ilosc}qty {papier} {kolor} {laminat} {data}.pdf"
        
        czas = datetime.datetime.now().strftime("%Y.%m.%d %H:%M")
        with open('Wszystkie zlecenia.txt', 'a') as myFile:
            print(f"{new_filename} {czas}", file=myFile)
        os.rename(file_path, f"{output_folder}/{new_filename}")
        print('\n')

    except Exception as e:
        print(f"An error occurred: {e}")

# Inicjalizacja głównego okna
root = TkinterDnD.Tk()
root.title('Zmiana Nazwy Plików')
root.geometry('250x300')
root.minsize(250, 300)

# Foldery
input_folder = 'input'
output_folder = 'output'

if not os.path.exists(output_folder):
    os.makedirs(output_folder)

# Interfejs użytkownika
job_type_var = StringVar()
job_type_var.trace('w', update_fields)

numer_label = Label(root, text="Numer zlecenia")
numer_entry = Entry(root)

express_label = Label(root, text="Express")
express_var = StringVar()
express_menu = OptionMenu(root, express_var, "Tak", "Nie")

job_type_label = Label(root, text="Typ zlecenia")
job_type_menu = OptionMenu(root, job_type_var, "Content Digital", "Content Inkjet", "Cover")

maszyna_label = Label(root, text="Maszyna")
maszyna_var = StringVar()
maszyna_menu = OptionMenu(root, maszyna_var, "HP", "KM", "CANNON")

wykonczenie_label = Label(root, text="Wykończenie")
wykonczenie_var = StringVar()
wykonczenie_menu = OptionMenu(root, wykonczenie_var, "Szycie", "Klejenie", "WIO")

tytul_label = Label(root, text="Tytuł")
tytul_entry = Entry(root)

rozmiar_label = Label(root, text="Rozmiar")
rozmiar_entry = Entry(root)

data_label = Label(root, text="Data")
data_entry = Entry(root)

okladka_label = Label(root, text="Okładka")
okladka_var = StringVar()
okladka_menu = OptionMenu(root, okladka_var, "SOFTCOVER", "SOFTCOVERWF", "HARDCOVER", "HARDCOVERS", "COVERWIO", "DUSTCOVER")

laminat_label = Label(root, text="Laminat")
laminat_var = StringVar()
laminat_menu = OptionMenu(root, laminat_var, "MATT", "GLOSS", "SOFT-TOUCH", "NON-SCRATCH", "NONE")

papier_label = Label(root, text="Papier")
papier_entry = Entry(root)

kolor_label = Label(root, text="Kolor")
kolor_var = StringVar()
kolor_menu = OptionMenu(root, kolor_var, "4+4", "4+0", "1+1", "1+0")

ilosc_label = Label(root, text="Ilość")
ilosc_entry = Entry(root)

# Layout
job_type_label.grid(row=0, column=0, padx=10, pady=5)
job_type_menu.grid(row=0, column=1, padx=10, pady=5)
numer_label.grid(row=1, column=0, padx=10, pady=5)
numer_entry.grid(row=1, column=1, padx=10, pady=5)
express_label.grid(row=2, column=0, padx=10, pady=5)
express_menu.grid(row=2, column=1, padx=10, pady=5)
papier_label.grid(row=6, column=0, padx=10, pady=5)
papier_entry.grid(row=6, column=1, padx=10, pady=5)
kolor_label.grid(row=7, column=0, padx=10, pady=5)
kolor_menu.grid(row=7, column=1, padx=10, pady=5)
ilosc_label.grid(row=8, column=0, padx=10, pady=5)
ilosc_entry.grid(row=8, column=1, padx=10, pady=5)

specific_fields = [
    maszyna_label, maszyna_menu, wykonczenie_label, wykonczenie_menu,
    tytul_label, tytul_entry, rozmiar_label, rozmiar_entry,
    data_label, data_entry, okladka_label, okladka_menu,
    laminat_label, laminat_menu, papier_label, papier_entry,
    kolor_label, kolor_menu, ilosc_label, ilosc_entry
]

update_fields()

# Obsługa przeciągania plików
root.drop_target_register(DND_FILES)
root.dnd_bind('<<Drop>>', on_drop)

root.mainloop()

1

Zrób najmniej jak się da z wykorzystaniem tkinterdnd2 i wtedy przerób na .exe.

0

Jesli plik programu .py działa to biblioteka tkinterdnd2 opisuje coś takiego, że trzeba dodać hook, aby zrobić exe

pyinstaller
If you want to use pyinstaller, you should use the hook-tkinterdnd2.py file included. Copy it in the base directory of your project, then:

pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=.

czyli:

Jeśli chcesz używać pyinstallera, powinieneś użyć dołączonego pliku hook-tkinterdnd2.py. Skopiuj go do katalogu bazowego swojego projektu, a następnie:

pyinstaller -F -w myproject/myproject.py --additional-hooks-dir=.

może coś pomoże

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.