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

问题描述 投票:0回答:4

我得到了什么:

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)

如您所见,分隔符和图标没有显示在顶部菜单中,而是很好地显示在子菜单中

我做错了什么还是根本不可能?

python python-3.x tkinter menu
4个回答
7
投票

如果你在 Windows 上,不可能做你想做的事。 Tkinter 不允许您将图标添加到菜单栏。我认为这与底层 tk 库使用的 Windows API 的限制有关。

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


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
Menu
方法有一个选项
image
,因为它不会返回任何未知选项错误,但它不会显示任何图像也可以,它只显示一个字符串:“(Image)”。


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']
相对的选项。


0
投票

注意:图标图像必须是.png,尝试10x10 px,分辨率最小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()
© www.soinside.com 2019 - 2024. All rights reserved.