2013-08-30 64 views
28

Khi tôi cố gắng thay đổi biểu tượng cửa sổ ở góc trên cùng bên trái từ màu đỏ xấu xí "TK" để favicon riêng tôi bằng cách sử dụng mã dưới đây, Python ném một lỗi:Đặt biểu tượng cửa sổ

from tkinter import * 
root = Tk() 

#some buttons, widgets, a lot of stuff 

root.iconbitmap('favicon.ico') 

này nên đặt biểu tượng 'favicon.ico' (theo nhiều bài đăng trên diễn đàn trên toàn bộ web). Nhưng thật không may, tất cả các dòng này là ném các lỗi sau:

Traceback (most recent call last): 
    File "d:\ladvclient\mainapp.py", line 85, in <module> 
    root.iconbitmap(bitmap='favicon.ico') 
    File "C:\Python33\lib\tkinter\__init__.py", line 1637, in wm_iconbitmap 
    return self.tk.call('wm', 'iconbitmap', self._w, bitmap) 
_tkinter.TclError: bitmap "favicon.ico" not defined 

Những gì tôi đã làm:

  • Tôi đã kiểm tra đường dẫn - tất cả mọi thứ là chính xác 100%
  • tôi đã cố gắng định dạng file khác như .png hoặc .bmp - không ai làm việc
  • tôi nhìn vấn đề này lên trên nhiều trang web

Và đối với điểm thứ ba, effbot.org, trang web yêu thích của tôi về Tkinter, nói với tôi rằng Windows bỏ qua hàm iconbitmap. Nhưng điều này không giải thích lý do tại sao nó ném một lỗi!

Có một số cách "hack" để tránh vấn đề đó, nhưng không có cách nào trong số chúng được viết cho Python 3.x.

Vì vậy, câu hỏi cuối cùng của tôi là: Có cách nào để có biểu tượng tùy chỉnh sử dụng Python 3.x và Tkinter không?

Ngoài ra, đừng cho tôi biết tôi nên sử dụng Thư viện GUI khác. Tôi muốn chương trình của tôi hoạt động trên mọi nền tảng. Tôi cũng muốn có một phiên bản được mã hóa, không phải là giải pháp py2exe hoặc sth.

+0

là 'favicon.ico' trong thư mục mà bạn đang chạy các kịch bản? Khác khôn ngoan bạn phải cung cấp đường dẫn đầy đủ. Ngoài ra, khi điều khác bạn có thể làm là thay đổi định dạng thành '.gif', tôi nghĩ đó là định dạng duy nhất mà tkinter chấp nhận. – enginefree

+0

@enginefree - Không. Tkinter cũng chấp nhận '.ico'. – iCodez

Trả lời

31

Bạn không được có favicon.ico trong cùng một thư mục với tập lệnh hoặc, cụ thể là trên đường dẫn của bạn. Đặt vào tên đường dẫn đầy đủ. Ví dụ, công trình này:

from tkinter import * 
root = Tk() 

root.iconbitmap(r'c:\Python32\DLLs\py.ico') 
root.mainloop() 

Nhưng điều này thổi lên với lỗi tương tự của bạn:

from tkinter import * 
root = Tk() 

root.iconbitmap('py.ico') 
root.mainloop() 
+2

Dude, bạn tuyệt vời (hoặc tôi chỉ là một chút ngu ngốc). Chỉ còn một câu hỏi? liệu có khả năng tải động đường dẫn dễ dàng thay vì có đường dẫn cố định không? bởi vì điều này sẽ cho tôi tự do hơn tại một số điểm :) – CrushedPixel

+0

@CrushedPixel - Những gì bạn đã làm không ngu ngốc. Trong thực tế, nó nên đã làm việc nếu 'favicon.ico' là trên đường dẫn. Dù sao, tôi cho rằng bạn _could_ xây dựng một cái gì đó năng động bằng cách sử dụng mô-đun 'os' để đi bộ một số thư mục tìm kiếm các tập tin '.ico'. Tuy nhiên, điều này có thể khiến bạn tải nhầm hình ảnh, điều này sẽ khiến bạn xấu hổ. Lời khuyên của tôi là chọn biểu tượng bạn muốn và sau đó giữ nó với kịch bản. – iCodez

+0

chỉ còn một điều mà tôi cần biết - con đường nào Python nghĩ là có nghĩa là khi tôi không chỉ định đường dẫn? Giống như nơi trên máy tính của tôi đã làm Python tìm kiếm 'favicon.ico' trước khi tôi nói với nó nơi để tìm kiếm? – CrushedPixel

1
#!/usr/bin/env python 
import tkinter as tk 

class AppName(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.grid() 
     self.createWidgets() 

    def createWidgets(self): 
     self.quitButton = tk.Button(self, text='Quit', command=self.quit) 
     self.quitButton.grid() 

app = AppName() 
app.master.title('Title here ...!') 
app.master.iconbitmap('icon.ico') 
app.mainloop() 

nó sẽ làm việc như thế này!

0

Đảm bảo tệp .ico cũng không bị hỏng. Tôi đã nhận được lỗi tương tự đã biến mất khi tôi thử một tệp .ico khác.

10

Không có cách nào được đề xuất ở đây hoạt động - lỗi "bitmap xxx not defined" đã từng xuất hiện. Và vâng, tôi đã đặt đúng đường dẫn đến nó.

gì nó đã làm công việc là thế này:

imgicon = PhotoImage(file=os.path.join(sp,'myicon.gif')) 
root.tk.call('wm', 'iconphoto', root._w, imgicon) 

nơi sp là con đường kịch bản, và root cửa sổ gốc Tk.

Thật khó để hiểu cách làm việc (tôi không biết xấu hổ sao chép nó từ fedoraforums) nhưng nó hoạt động

+0

hoạt động như một lời cảm ơn vì đã chia sẻ – citizen2077

+0

Điều này hoạt động trên FreeBSD. Từ đó tôi đoán rằng nó hoạt động trên tất cả các hệ thống dựa trên Xorg/X11. Nó không đặt biểu tượng trên Native Tk trong OS X. Tôi chưa thử nghiệm nó trên Windows. – cshilton

-1

Vì vậy, nó trông giống như root.iconbitmap() chỉ hỗ trợ một thư mục cố định.
sys.argv[0] trả về thư mục mà tệp đã được đọc từ đó một mã đơn giản sẽ hoạt động để tạo một thư mục cố định.

import sys 
def get_dir(src): 
    dir = sys.argv[0] 
    dir = dir.split('/') 
    dir.pop(-1) 
    dir = '/'.join(dir) 
    dir = dir+'/'+src 
    return dir 

Đây là sản phẩm

>>> get_dir('test.txt') 
'C:/Users/Josua/Desktop/test.txt' 
+0

Đây thực sự là một cách phụ thuộc và nền tảng phụ thuộc và vẫn còn hơi bị hỏng để hoạt động trên các đường dẫn thay vì sử dụng các hàm từ 'os.path'. – BlackJack

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