是否有可能在python中的tkinter菜单栏中有图标

时间:2016-07-25 12:29:17

标签: python python-3.x tkinter menu

我得到了什么:

Icons not displayed in menu

我的代码:

self.menu_bar = tk.Menu(self)
...
self.read_menu = tk.Menu(self.menu_bar, tearoff=False)
self.menu_bar.add_cascade(label='Read', underline=0, state=tk.DISABLED, menu=self.read_menu)
self.read_menu.add_command(label='First Page', underline=0, image=self.read_first_image, compound=tk.LEFT,
                           command=self.menu_read_first, accelerator='Home', state=tk.DISABLED)
self.read_menu.add_command(label='Last Page', underline=1, image=self.read_last_image, compound=tk.LEFT,
                           command=self.menu_read_last, accelerator='End')
self.read_menu.add_command(label='Next Page', underline=0, image=self.read_next_image, compound=tk.LEFT,
                           command=self.menu_read_next, accelerator='PgDn')
self.read_menu.add_command(label='Previous Page', underline=0, image=self.read_previous_image, compound=tk.LEFT,
                           command=self.menu_read_previous, accelerator='PgUp', state=tk.DISABLED)
...
self.menu_bar.add_separator()
self.menu_bar.add_command(command=self.menu_read_first, image=self.read_first_image, state=tk.DISABLED)
self.menu_bar.add_command(command=self.menu_read_previous, image=self.read_previous_image, state=tk.DISABLED)
self.menu_bar.add_command(command=self.menu_read_next, image=self.read_next_image)
self.menu_bar.add_command(command=self.menu_read_last, image=self.read_last_image)

如您所见,分隔符和图标不会显示在top菜单中,但会在子菜单中显示: - (

我是在做错事还是不可能?

4 个答案:

答案 0 :(得分:3)

如果您使用Windows,则无法执行您想要的操作。 Tkinter不允许您向菜单栏添加图标。我认为这与底层tk库使用的Windows API中的限制有关。

注意:菜单栏是为菜单设计的,而不是命令。在菜单栏上放置命令可能会使用户感到沮丧,因为他们希望点击某个项目会显示一个菜单。

答案 1 :(得分:1)

无法将图像添加到菜单栏,因此此菜单栏的子菜单将包含图像而不是字符串名称。但是,您可以使用Menubutton窗口小部件,并将其位置设置为靠近父窗口的左上角,以使视图具有Menu对象的相同视图。以下是如何实现这一目标的:

from tkinter import *
root = Tk()
root.geometry("500x500-500+50")



imgvar1 = PhotoImage(file='airplane1.png')

mainmenu1 = Menubutton(root, image=imgvar1)
mainmenu1.grid(row=0, column=0)

submenu1 = Menu(mainmenu1)
mainmenu1.config(menu=submenu1)

submenu1.add_command(label="Option 1.1")
submenu1.add_command(label="Option 1.2")


imgvar2 = PhotoImage(file='automobile1.png')

mainmenu2 = Menubutton(root, image=imgvar2)
mainmenu2.grid(row=0, column=1)

submenu2 = Menu(mainmenu2)
mainmenu2.config(menu=submenu2)

submenu2.add_command(label="Option 2.1")
submenu2.add_command(label="Option 2.2")



imgvar = PhotoImage(file='eye.gif')
button = Button(root, image=imgvar)
button.grid(row=0, column=2)

此外,我认为这是Menu中的一种错误,因为add_cascade的{​​{1}}方法有image选项,因为它不返回任何未知选项错误,但它也没有显示任何图像,它只显示一个字符串:"(图像)"。

答案 2 :(得分:1)

工作案例:

self.MyImage,self.dictImg={},{}

self.ypath='path'

self.dictImg[0]='img0.png'

self.MyImage['Option'] =PhotoImage(file=self.ypath+os.sep+self.dictImg[0])
        self.casmenu.choices.wierdones.add_command(label='Option',image=self.MyImage['Option'],compound='left')

请注意:您必须指明compound='left'的相对选项image=self.MyImage['Option']

答案 3 :(得分:0)

注意:图标图像必须为.png,尝试10x​​10像素,分辨率最低为150

import tkinter as tk

from tkinter import *


your_app_name = Tk()
menubar = Menu(your_app_name)

file = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label="Command", menu=file_menu)
icon = PhotoImage(file='your_file.png') # or: (file='./your_file.png')
file_menu.add_command(label='New', image=icon, compound='left', command=some_function)

your_app_name.config(menu=menubar)
your_app_name.mainloop()