删除Tkinter窗口上的TK图标

时间:2009-02-15 00:27:10

标签: python python-3.x tkinter tk

有人知道如何让图标不显示吗?我正在寻找一种根本没有图标的方法。

7 个答案:

答案 0 :(得分:39)

在Windows上

第一步:

使用图标编辑器或rw-designer等网站创建透明图标。将其另存为transparent.ico

第二步:

from tkinter import *

tk = Tk()
tk.iconbitmap(default='transparent.ico')
lab = Label(tk, text='Window with transparent icon.')
lab.pack()
tk.mainloop()

在Unix上

类似的东西,但使用xbm图标。

答案 1 :(得分:10)

与接受的答案相似(具有丑陋的意思):

import tkinter
import tempfile

ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
        b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
        b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64

_, ICON_PATH = tempfile.mkstemp()
with open(ICON_PATH, 'wb') as icon_file:
    icon_file.write(ICON)

tk = tkinter.Tk()
tk.iconbitmap(default=ICON_PATH)
label = tkinter.Label(tk, text="Window with transparent icon.")
label.pack()

tk.mainloop()

它只是动态创建文件,因此您不必携带额外的文件。使用相同的方法,您也可以为Unix执行'.xbm'图标。

修改:由于@Magnus HoffICON可以进一步缩短:

import base64, zlib

ICON = zlib.decompress(base64.b64decode('eJxjYGAEQgEBBiDJwZDBy'
    'sAgxsDAoAHEQCEGBQaIOAg4sDIgACMUj4JRMApGwQgF/ykEAFXxQRc='))

答案 2 :(得分:2)

据我所知,最接近“空白”图标的是使用与窗口标题栏颜色相同的图标。但是,很多用户再次使用不同的颜色主题,因此不会很好。

但是,如果使用py2exe,则可以使用Resource Hacker之类的东西来交换图标。但是在python程序文本状态中,你能做的最好就是替换。对Jar文件如何使用java图标进行排序,tkinter应用程序将具有TK图标。毕竟...像java一样,你的应用程序正在由一个中间程序翻译。由于另一个程序正在运行您的代码,您必须修改该其他程序。幸运的是,python / tk在图标方面比JVM更灵活,因此您可以替换图标。但完全删除它目前不是一种选择。

-John

答案 3 :(得分:2)

根据以前的回答,我使用了这个解决方案:

from PIL import ImageTk
import zlib,base64
import Tkinter

icon=zlib.decompress(base64.b64decode('eJxjYGAEQgEBBiDJwZDBy'
'sAgxsDAoAHEQCEGBQaIOAg4sDIgACMUj4JRMApGwQgF/ykEAFXxQRc='))
root=Tkinter.Tk()
image=ImageTk.PhotoImage(data=icon)
root.tk.call('wm', 'iconphoto', root._w, image)
root.mainloop()

答案 4 :(得分:0)

更新:

略微修改的代码(try子句而不是if TkVersion)会在以下位置生成透明(无)图标:

Linux(Mint 18.1),Python 2.7

Linux(Mint 18.1),Python 3.5.1

Windows 10,Python 2.7.13

它会在:

上生成黑色图标(不起作用)

Windows 8.1,Python 3.6

一个相当古老的问题,但解决方案并不适合我。我发现了一个部分简单的解决方案,并附有我自己的后续问题。

部分解决方案(Tk 8.5,见下文) - 使用PhotoImage' blank()方法:

from Tkinter import *

root=Tk()

icon=PhotoImage(height=16, width=16)
icon.blank()

root.tk.call('wm', 'iconphoto', self.master._w, icon)

root.mainloop()

在Python 2.7,Windows 10上,这样可以正常工作,产生所需的"无图标"为您的新应用。

但是,在Python 3.6,Win 8.1上,这会阻塞GUI,我认为这与较新的Tk 8.6有关,虽然我发现使用wm_iconphoto()的新8.6表示法在这种情况下确实未通过:

try:
    from tkinter import *
except:
    from Tkinter import * 

root=Tk()

#Identical for Py2.7/Tk8.5 and Py3.5/Tk8.6
icon=PhotoImage(height=16, width=16)
icon.blank()

#Picking a notaion based on Tk version to avoid jamming
try:
    root.wm_iconphoto('True', icon)   #New Tk 8.6 style        
else:
    #Jams Python 3.5 with Tk 8.6 on Windows
    root.tk.call('wm', 'iconphoto', self.master._w, icon)   



root.mainloop()

它在3.6上产生黑色图标,而不是2.7 / 8.5时的透明图标。

可能有一种方法可以使用"透明度设置"逐个设置像素。 - http://wiki.tcl.tk/1449

但是,我不知道它是否可以通过Tkinter实现。上帝喜欢大胆的,别人的转向吗?

更新了问题:为什么这不适用于Py3.6 / Windows?

答案 5 :(得分:0)

@ubomb通过使用Tkinter.PhotoImage的内置支持处理.gif图像来添加自定义图像的替代方法。

来自文件:

icon = Tkinter.PhotoImage(file="logo.gif")

来自base64:

gif_base64_string = """ R0lGODdhEAAQAIcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4O Dg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEh ... 4B8AAP9Ci/4HoLTpfwD+qV4NoHVAADs= """

icon = Tkinter.PhotoImage(data=gif_base64_string)

effbot.org链接以获取更多详细信息:

http://effbot.org/tkinterbook/photoimage.htm

答案 6 :(得分:0)

最近,我在 an old Ubuntu forum's post 中找到了适用于 Linux 的解决方案。

该解决方案使用带有空白(用零填充).xbm 文件的 iconbitmap 和 iconmask。

那么,首先,什么是 .xbm 文件?

.xbm 文件是纯文本(实际上是 C 代码!)图像格式,常用于存储位图,数据存储为 2D 矩阵(二维数组,或数组数组) 使用 8 位(256 个可能值,从 0 到 255)大小的元素,矩阵表示为单个一维数组加上定义其形状的值。

可以以任何方式解释数据,但通常将其解释为单色/灰度图像。

图标位图

我们的第一个方法叫做iconbitmap,用于设置一个位图作为我们tkinter窗口的图标,我们可以输入一个.xbm文件的位置,它将被表示为 单色/灰度图标,其中 .xbm 的像素/元素代表不同的灰度级别,记住像素/元素是 8 位值 在 0-255 范围内,因此值 0 将表示为黑色,255 将表示为白色,其他值将是这两个值之间的插值。

图标掩码

我们的第二个方法被称为 iconmask,这里是魔法发生的地方,它用于将 alpha/透明度值设置为我们窗口图标的像素, 我们可以输入 .xbm 文件的位置,.xbm 中值为 0 的元素将被设置为完全透明,我已经在 Debian 上使用 xfce4 和透明度值对其进行了测试 似乎不是在 0-255 范围内线性插值。

我们的解决方案

有了这些信息,我们可以通过以下方式使用 tkinter 创建一个透明图标:

import tkinter

tk = tkinter.Tk()

# Your file path has to start with an "@" otherwise the methods will raise an exception.
xbm_location = "@blank.xbm"
# Here we call the iconbitmap method with the xbm location, since it's a blank xbm (filled with zeroes) it will be represented as a black icon.
tk.iconbitmap(xbm_location)
# Here we call the iconmask method with xbm location, since it's a blank xbm (filled with zeroes) it will be represented as a fully transparent icon.
tk.iconmask(xbm_location)

还有我们的解决方案,我也在 Windows 上进行了测试,系统似乎只是忽略了 iconmask 方法,因此请坚持使用适用于您的 Windows 代码的其他解决方案。

另一种可能的解决方案是使用方法 iconphoto 和从完全透明的 .gif 文件加载的 PhotoImage,甚至创建一个空白的 PhotoImage as suggested by Jay, 但它似乎也不能在 Windows 上正常工作。

如何创建一个空白的 .xbm?

创建一个空白的 .xbm 非常容易,只需下载一个 .xbm 文件,从头开始创建,或将图像转换为 .xbm,如果 .xbm 已经不是空白(用零填充),请打开 .xbm 在文本编辑器中并将数组中的所有值替换为“0x00”。

结论

就是这样,一个空白的 .xbm、iconbitmap 和 iconmask。现在您应该能够在 Linux 上的 tkinter 窗口中创建完全透明的图标...

万岁!