在Python GTK中添加程序图标
我知道这很简单,只需要用命令 self.set_icon_from_file("icon.png")
就可以了,不过我的程序还是不显示图标。我确认了 icon.png 和 Python 文件在同一个工作目录下。我也试过给出完整的文件路径,但图标还是不显示。
我在使用 Ubuntu 10.10,如果这有帮助的话,我用的是 Python V2.6。我使用 Glade 界面设计器 来设计图形界面。不过,我尝试过用 Glade 设置图标,也用上面的命令设置过。
我希望我提供的信息足够了。
补充:我让程序中的状态图标工作了……不过在问题中我指的是任务栏上显示的程序图标,以及应用程序栏左侧的图标。
3 个回答
0
对于标准图标,可以使用库存图标,找到适合你需求的图标。这样做的好处是:
- 你不需要把图标打包到你的程序里。
- 图标会根据用户的主题自动变化,能够很好地融入他们的环境。
对于pyGTK:
gtk.icon_theme_get_default().load_icon("folder-open", 128, 0)
2
我不太确定你在制作什么图标,不过可以试试这个我想到的最简单的 PyGTK 图标示例,主要是用来显示任务栏图标:
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
# create icon object
statusIcon = gtk.StatusIcon()
# load it
statusIcon.set_from_file("icon.ico")
# show it
statusIcon.set_visible(True)
# and run main gtk loop
gtk.main()
也许你只是忘记了这个命令 statusIcon.set_visible(True)
。
9
我确保了icon.png和我的python文件在同一个工作目录里。
这可能是你的问题所在——路径是相对于Python 解释器的工作目录来查找的,而不是代码所在的文件。我经常会定义一个像这样的函数:
def get_resource_path(rel_path):
dir_of_py_file = os.path.dirname(__file__)
rel_path_to_resource = os.path.join(dir_of_py_file, rel_path)
abs_path_to_resource = os.path.abspath(rel_path_to_resource)
return abs_path_to_resource
我的函数其实没有那么复杂,但希望变量名能让你明白发生了什么。另外,获取绝对路径并不是绝对必要的,但如果你需要调试的话,可能会有帮助。
然后你可以直接这样做:
self.set_icon_from_file(get_resource_path("icon.png"))
更新:这里有一个演示程序。“icon.png”与这个脚本在同一个目录下,我用./gtktest.py
来运行它。我在左上角看到了图标(这是我主题的标准位置)。icon.png
只是用Inkscape画的一个形状,并导出为位图(无论如何,它也可以与原始的SVG文件一起使用)。
#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
class HelloWorld:
def delete_event(self, widget, event, data=None):
return False
def destroy(self, widget, data=None):
gtk.main_quit()
def __init__(self):
# create a new window
self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
self.window.set_icon_from_file('icon.png')
self.window.connect("delete_event", self.delete_event)
self.window.connect("destroy", self.destroy)
# Creates a new button with the label "Hello World".
self.button = gtk.Button("Hello World")
self.window.add(self.button)
self.button.show()
self.window.show()
def main(self):
gtk.main()
if __name__ == "__main__":
hello = HelloWorld()
hello.main()