2012-03-29 16 views
5

Czy ktoś zna sposób na osadzenie ikony w skrypcie w języku Python, tak, że gdy tworzę mój samodzielny plik wykonywalny (używając programu piorącego), nie muszę dołączać pliku .ico? Wiem, że jest to możliwe z py2exe, ale w moim przypadku muszę użyć Pyinstallera, ponieważ nie udało mi się użyć tego pierwszego. Używam Tkintera.Ikona osadzenia w skrypcie Pythona

Wiem o iconbitmap(iconName.ico), ale to nie działa, jeśli chcę utworzyć plik wykonywalny OneFile.

+0

Wystarczy, aby uczynić go bardziej zrozumiałym: Chcę zmienić ikonę mojego okna aplikacji (który domyślnie ma logo TK), a nie ikonę Mój plik (który można łatwo zrobić za pomocą Pyinstaller) – maupertius

+0

Aha! Po przeszukaniu nieco więcej znalazłem odpowiedź na Stack Overflow [here] (http://stackoverflow.com/a/7675014/404469). To pomaga? – gary

+0

Tak, widziałem to już wcześniej. To jest dokładnie ten sam problem. Po prostu nie rozumiem, co on tam robi. Wygląda na to, że to poprawne rozwiązanie, może powinienem jeszcze trochę wykopać. Dzięki! – maupertius

Odpowiedz

6

W rzeczywistości funkcja iconbitmap może otrzymać nazwę pliku tylko jako argument, więc musi tam być plik. Możesz utworzyć wersję Base64 ikony (wersja z ciągiem znaków) po łączu, przesyłając plik i kopiując wynik do pliku źródłowego jako ciąg zmiennej. Wyodrębnij go do pliku tymczasowego, ostatecznie przekazując go do mapy ikonograficznej i usuwając ją. To całkiem proste:

import base64 
import os 
from Tkinter import * 
##The Base64 icon version as a string 
icon = \ 
""" REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON 
""" 
icondata= base64.b64decode(icon) 
## The temp file is icon.ico 
tempFile= "icon.ico" 
iconfile= open(tempFile,"wb") 
## Extract the icon 
iconfile.write(icondata) 
iconfile.close() 
root = Tk() 
root.wm_iconbitmap(tempFile) 
## Delete the tempfile 
os.remove(tempFile) 

Mam nadzieję, że pomoże!

+0

Wielkie dzięki, które działało pięknie! Czy wiesz, jak zmienić ikonę w oknie rysunkowym stworzonym za pomocą Matplotlib? Moja aplikacja ma teraz moją ikonę, ale kiedy kreślę wykres, nowe okno nadal ma logo TK jako ikonę. Wiele myśli za twoją pomoc. – maupertius

+0

Niestety, nie wiem o Matplotlib, ale jeśli nie ma funkcji zmiany ikony, nie sądzę, że jest jakiś sposób. Nie działa wm_iconbitmap w Matplotlib? – Saulpila

5

Prawdopodobnie nie potrzebują tego, ale ktoś inny może się on przydać, znalazłem można to zrobić bez tworzenia pliku:

import Tkinter as tk 

icon = """ 
    REPLACE THIS WITH YOUR BASE64 VERSION OF THE ICON 
    """ 

root = tk.Tk() 
img = tk.PhotoImage(data=icon) 
root.tk.call('wm', 'iconphoto', root._w, img) 
+0

http://code.activestate.com/recipes/52264-inline-gifs-with-tkinter/ – Sam

+0

Właściwie nie byłem w stanie uzyskać tej metody lub metody Sama do pracy z ikoną w Pythonie 3.4.3, ale metoda Saulpili zadziałała, więc wiem, że nie było żadnego błędu z kodem Base64. – zfb

0

roztworu przez ALI3N

wykonaj następujące kroki:

  1. edytować plik .spec tak:
a = Analysis(....) 
pyz = PYZ(a.pure) 
exe = EXE(pyz, 
      a.scripts, 
      a.binaries + [('your.ico', 'path_to_your.ico', 'DATA')], 
      a.zipfiles, 
      a.datas, 
      name=.... 
     ) 
  1. Dodaj to do skryptu:
datafile = "your.ico" 
if not hasattr(sys, "frozen"): 
    datafile = os.path.join(os.path.dirname(__file__), datafile) 
else: 
    datafile = os.path.join(sys.prefix, datafile) 
  1. Używaj go w ten sposób:
root = tk.Tk() 
root.iconbitmap(default=datafile) 

Ponieważ to nie zadziała po skompilowaniu skryptu z Pyinstaller:

root = tk.Tk() 
root.iconbitmap(default="path/to/your.ico") 

My Info: python3.4, pyinstaller3.1.1

+0

Otrzymuję błąd: SyntaxError: (błąd Unicode) Kodek 'unicodeescape' nie może dekodować bajtów w pozycji 2-3: obcięty \ UXXXXXXXX escape – alienware13user

Powiązane problemy