好吧,首先我不太确定如何说出我的问题。这可能是缺乏睡眠,或者是Python和GTK的新手,或者是组合。为了帮助我,我在zetcode.com的教程的帮助下写了一个完整的简单例子。
问题,以及我可以说,它是一个菜单项 - 没有子菜单 - 需要两次点击才能激活。与单击时激活的子菜单项不同。这有点令人讨厌(可能会混淆未来的用户),但并不会导致我的应用程序出现任何问题。但是,我想解决它。
我的实际应用程序是在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 :(得分: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
但是,你为什么要这样做呢?我并不感到惊讶,你的原始代码没有按预期工作,因为那不是菜单的用途。你最好使用工具栏按钮或常规按钮。我认为滥用菜单作为按钮更容易让未来的用户感到困惑。
答案 1 :(得分:2)
我知道这是一个相当古老的主题。但是,为了其他任何试图完成此任务的人,最简单的解决方案是用“选择”信号替换“激活”信号。那应该解决它。至少,它在我的盒子上。
即。取代
filem.connect("activate", self.on_file_activate)
与
filem.connect("select", self.on_file_activate)
为了清楚起见,我还会更改功能名称。
我希望能有所帮助。 =)