2016-07-25 96 views
2

我能得到什麼:是否有可能有圖標Tkinter的菜單欄在python

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) 

正如你所看到的,隔膜和圖標不顯示在topmenu中,但很好地顯示在子菜單中:-(

Im我做錯了什麼或它是不可能的?

回答

2

如果你在Windows上,不可能做你想做的事。 Tkinter不會允許您將圖標添加到菜單欄。我認爲這與底層tk庫使用的windows API的限制有關。

注意:菜單欄是爲菜單而不是命令設計的。在菜單欄上放置命令可能會讓用戶感到沮喪,因爲他們會希望單擊某個項目會顯示一個菜單。

+0

該問題詢問將圖像添加到子菜單而不是子菜單名稱。這就是說,我同意你的意見 - 這是不可能的。而且,是的,他還向子菜單名稱添加了錯誤的命令。 –

+0

但更有趣的是菜單對象的'add_cascade'方法有一個選項['image'](http://effbot.org/tkinterbook/menu.htm#Tkinter.Menu.add-method),但它不顯示任何圖像,它只顯示一個字符串「(Image)」。 –

+0

@ParvizKarimli:問題是關於把圖標放在topmenu中:「。查看屏幕截圖並注意菜單欄中的「{image}」而不是實際的圖像。這就是被問到的問題,這就是我的答案所要解決的問題。只有在下拉菜單中才能在實際菜單欄中顯示命令或圖像。 –

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錯誤的,因爲Menuadd_cascade方法有一個選項image,因爲它不返回任何未知的選項錯誤,但它確實不顯示任何圖像,它只顯示一個字符串:「(Image)」。

+1

我試過這個解決方案。它看起來不錯,做我想做的事情。但在此期間,我失去了菜單快捷方式(例如:Alt + F打開文件子菜單) – Cabu

+0

@Cabu我很高興我的解決方案可以幫助你!我瞭解你遇到的最後一個問題。要解決這個問題,你可以使用鍵綁定。我相信這是可能的。請記住,在編程時,一切都基於以前的知識,如鏈式反應。例如,'Alt + F'是'Menu'小部件的鍵綁定。鍵綁定中的字母是菜單名稱的第一個字母。 –

+0

@Cabu你總是可以將快捷方式綁定到根,並將它們傳送到菜單。爲了使它完全乾淨,我在根窗口小部件中寫了一個'dispatch_binding',並將每個輸入傳送到正確的窗口小部件。 –