2010-11-12 53 views
1

好的,首先我不太確定如何解釋我的問題。這可能是睡眠不足,或者對於Python和GTK或者其組合而言很新穎。爲了幫助我,我已經在zetcode.com的教程的幫助下編寫了一個完整的裸機示例。Python GTK菜單項需要兩次點擊激活

問題,以及我可以說,是一個菜單項 - 沒有子菜單 - 需要兩次點擊才能激活。與一次點擊激活的子菜單項不同。這有點令人討厭(並且很可能會混淆未來的用戶),但並不會真正對我的應用程序造成任何問題。但是,我想要解決它。

我的實際應用程序正在Ubuntu Quickly的幫助下創建 - 但使用gtkBuilder或直接gtk時存在問題。

這裏是赤裸例如:

#!/usr/bin/python 

import gtk 


class MenuTest(gtk.Window): 

    def __init__(self): 
     super(MenuTest, self).__init__() 

     self.set_title("Menus, how do they work?!") 
     self.set_size_request(350, 200) 
     self.modify_bg(gtk.STATE_NORMAL, gtk.gdk.Color(6400, 6400, 6440)) 
     self.set_position(gtk.WIN_POS_CENTER) 

     mb = gtk.MenuBar() 

     filemenu = gtk.Menu() 
     filem = gtk.MenuItem("Some Action") 
     filem.connect("activate", self.on_file_activate) 

     mb.append(filem) 

     vbox = gtk.VBox(False, 2) 
     vbox.pack_start(mb, False, False, 0) 

     self.add(vbox) 

     self.connect("destroy", gtk.main_quit) 
     self.show_all() 

    def on_file_activate(self, widget): 
     md = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, "herp derp, took two clicks to show me") 
     md.run() 
     md.destroy() 


MenuTest() 
gtk.main() 

希望有人能夠幫助,並在同一時間不能完全混淆了小白。

+0

請同時用'pygtk' – saeedgnu 2011-06-14 06:45:27

回答

2

您可以通過連接到'button-press-event'信號,而不是'activate'信號,使您的回調是這樣解決問題:

def on_file_activate(self, widget, event): 
    if event.button != 1: 
     return False #only intercept left mouse button 
    md = gtk.MessageDialog(self, gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_CLOSE, "herp derp, I only needed one click") 
    md.run() 
    md.destroy() 
    return True 

但是,爲什麼你要這麼做?我不驚訝你的原始代碼沒有按預期工作,因爲這不是真正的菜單。使用工具欄按鈕或常規按鈕會更好。我認爲濫用菜單作爲按鈕更可能會混淆未來的用戶。

+0

標記這些問題謝謝你的回答。菜單和工具欄按鈕已經出現在我面前了。應用程序正在從C#和.NET Framework廢話移植到Python,我試圖儘可能保持UI接近原始。我想我會和原作者討論重新設計。 – Micheal 2010-11-13 14:38:02

2

我知道這是一個相當古老的線程。但是,爲了其他人試圖完成這項任務,最簡單的解決方案是用「選擇」信號替換「激活」信號。這應該解決它。至少,它在我的盒子上。

即。更換

filem.connect("activate", self.on_file_activate) 

filem.connect("select", self.on_file_activate) 

我也會爲清楚起見改變函數名。

我希望能幫助別人。 =)

相關問題