2012-03-29 33 views
5

Không ai biết cách nhúng biểu tượng trong tập lệnh Python sao cho khi tôi tạo tệp thực thi độc lập của mình (sử dụng pyinstaller), tôi không cần phải bao gồm tệp .ico? Tôi biết điều này là có thể với py2exe, nhưng trong trường hợp của tôi tôi phải sử dụng Pyinstaller, như tôi đã không thành công bằng cách sử dụng trước đây. Tôi đang sử dụng Tkinter.Nhúng biểu tượng trong tập lệnh python

Tôi biết về iconbitmap(iconName.ico) nhưng điều đó không có tác dụng nếu tôi muốn thực hiện việc thực thi onefile.

+0

Chỉ cần để làm cho nó rõ ràng hơn: Tôi muốn thay đổi biểu tượng của cửa sổ ứng dụng của tôi (mà theo mặc định có logo Tk), không phải là biểu tượng của tôi tập tin (có thể dễ dàng thực hiện với Pyinstaller) – maupertius

+0

Aha! Sau khi googling nhiều hơn một chút tôi tìm thấy một câu trả lời trên Stack Overflow [ở đây] (http://stackoverflow.com/a/7675014/404469). cái đó có giúp ích không? – gary

+0

Tôi đã từng thấy điều đó trước đây. Đó chính là vấn đề tương tự của tôi. Tôi chỉ không hiểu anh ta làm gì ở đó. Nó trông giống như đó là giải pháp đúng, có lẽ tôi nên đào một chút nữa. Cảm ơn! – maupertius

Trả lời

6

Thực tế, chức năng biểu tượngbản đồ chỉ có thể nhận được tên tập tin làm đối số, vì vậy cần phải có một tệp ở đó. Bạn có thể tạo một phiên bản Base64 của biểu tượng (Phiên bản chuỗi) theo liên kết, tải lên tệp và sao chép kết quả trong tệp nguồn của bạn dưới dạng chuỗi biến. Giải nén nó vào một tập tin tạm thời, cuối cùng chuyển tập tin đó đến iconbitmap và xóa nó. Nó khá đơn giản:

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) 

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn rất nhiều, đã làm việc rất đẹp! Bạn có cơ hội nào biết cách thay đổi biểu tượng trong cửa sổ hình được tạo bằng Matplotlib không? Ứng dụng của tôi đã có biểu tượng của tôi bây giờ, nhưng khi tôi vẽ đồ thị, cửa sổ mới vẫn có biểu tượng TK làm biểu tượng. Nhiều người nghĩ giúp đỡ của bạn – maupertius

+0

Xin lỗi, tôi không biết về Matplotlib, nhưng nếu không có chức năng thay đổi biểu tượng, tôi không nghĩ có cách nào. Không wm_iconbitmap làm việc trong Matplotlib? – Saulpila

5

Bạn có lẽ không cần điều này nhưng người khác có thể tìm thấy hữu ích này, tôi thấy bạn có thể làm điều đó mà không cần tạo một tập tin:

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

Tôi thực sự không thể có được phương pháp này hoặc phương pháp của Sam để làm việc với một biểu tượng trong Python 3.4.3 nhưng phương pháp của Saulpila làm việc vì vậy tôi biết không có bất kỳ lỗi nào với mã Base64. – zfb

0

Solution bởi ALI3N

Thực hiện theo các bước sau:

  1. chỉnh sửa tập tin .spec của bạn như thế này:
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. Thêm phần này vào kịch bản của bạn:
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. Sử dụng nó theo cách này:
root = tk.Tk() 
root.iconbitmap(default=datafile) 

Vì điều này sẽ không hoạt động sau khi bạn biên dịch tập lệnh bằng Pyinstaller:

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

Của Tôi Thông Tin: python3.4, pyinstaller3.1.1

+0

Lỗi khi nhận: Cú pháp lỗi: (lỗi unicode) codec 'unicodeescape' không thể giải mã byte ở vị trí 2-3: cắt ngắn \ UXXXXXXXX thoát – alienware13user

Các vấn đề liên quan