2011-06-26 12 views
10

私はPyGTKから新しいPyGobjectバインディングにいくつかの小さな例を移植しようとしていますが、iveはポップアップメニューでロードブロッキングを犯しました。エラーがなくてもメニューは右クリックで表示されません。 、Gtk.StatusIcon PythonのPopupMenu

from gi.repository import Gtk 
class aStatusIcon: 
    def __init__(self): 
     self.statusicon = Gtk.StatusIcon() 
     self.statusicon.set_from_stock(Gtk.STOCK_HOME) 
     self.statusicon.connect("popup-menu", self.right_click_event) 

     window = Gtk.Window() 
     window.connect("destroy", lambda w: Gtk.main_quit()) 
     window.show_all() 

    def right_click_event(self, icon, button, time): 
     menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 

     about.connect("activate", self.show_about_dialog) 
     quit.connect("activate", Gtk.main_quit) 

     menu.append(about) 
     menu.append(quit) 

     menu.show_all() 

     #menu.popup(None, None, gtk.status_icon_position_menu, button, time, self.statusicon) # previous working pygtk line 
     menu.popup(None, None, None, Gtk.StatusIcon.position_menu, button, time) #i assume this is problem line 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

aStatusIcon() 
Gtk.main() 

任意のスマートではなく、statusicon、私はこの問題は、そこにself.statusiconに関するメニューを語っていないイムあると仮定し、それらはすべてがウィジェットの引数またはnoneをしたいので、それは引数のいずれかで仕事をdoesntここにpplはどこに間違っているのか考えがありますか?

+0

'StatusIcon.position_menu'は' Gtk.StatusIcon'のドキュメントにはありません。私は '' gtk.status_icon_position_menu'](http://www.pygtk.org/docs/pygtk/class-gtkstatusicon.html#function-gtk--status-icon-position-menu)を見ています。これは明確に '' StatusIcon '。もう動作しませんか? (関連する質問:あなたは[Hairy_Palms](http://ubuntuforums.org/showthread.php?t=1789358)ですか?それに答える必要はありません) – senderle

+0

StatusIcon.position_menuはgtk3を呼び出すための新しいgtk3イントロスペクションの方法です.status_icon_position_menu、これは、私が試して、それが私は古いメソッドのためにやったようにstatusiconを与える場合、文句を言う。 (関連回答:はい:)) – Mike

+0

@Mike、ok、申し訳ありません。私がpygtkを使ってからしばらくしていたのですが...私のアプローチは、 'StatusIcon'を受け入れる自分自身の位置決め関数を書くことでしょう。[' StatusIcon.get_geometry() '](http://www.pygtk。 org/docs/pygtk/class-gtkstatusicon.html#method-gtkstatusicon-get-geometry)を返し、['(x、y、push_in)'](http://www.pygtk.org/docs/pygtk /class-gtkmenu.html#method-gtkmenu-popup)タプル。しかし、これはWAGであり、これらの機能は変更されていないと仮定しています。 (あなたのコードが示唆しているように、実際に変更された 'menu.popup'シグネチャを持っているのですか?) – senderle

答えて

16

ああ、最終的に誰かがこの問題を抱えていたら、gimpnetの人の助けを借りて助けてくれました。#あなたのメニューを有効にしておいてください。このどちらかは、上から新しいgtk3のためのいくつかのマイナーなクリーンアップと修正と作業コード

from gi.repository import Gtk 

class aStatusIcon: 
    def __init__(self): 
     self.statusicon = Gtk.StatusIcon() 
     self.statusicon.set_from_stock(Gtk.STOCK_HOME) 
     self.statusicon.connect("popup-menu", self.right_click_event) 

     window = Gtk.Window() 
     window.connect("destroy", lambda w: Gtk.main_quit()) 
     window.show_all() 

    def right_click_event(self, icon, button, time): 
     self.menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 

     about.connect("activate", self.show_about_dialog) 
     quit.connect("activate", Gtk.main_quit) 

     self.menu.append(about) 
     self.menu.append(quit) 

     self.menu.show_all() 

     def pos(menu, icon): 
       return (Gtk.StatusIcon.position_menu(menu, icon)) 

     self.menu.popup(None, None, pos, self.statusicon, button, time) 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

aStatusIcon() 
Gtk.main() 
+0

動作しません。 : – Erigami

+1

いくつかのものがpygobjectで変更されているようですが、pos関数はイベントから2つの引数だけを受け取るようになりました。http://pastebin.com/Rzek336pで更新された回答を入れてください。stackoverflowもインデントをねじ込むようです。 – Mike

+0

私は編集しました。あなたのペーストビンを変更するためのインラインコード。あなたがタブとスペースを混ぜて使用しているように見えますが、SOがあなたの書式を乱していたのかもしれません。 –

0

コピーMike's solutionです:

#!/usr/bin/python3 
import gi 
gi.require_version('Gtk', '3.0') 

from gi.repository import Gtk 

class MyStatusIconApp: 
    def __init__(self): 
     self.status_icon = Gtk.StatusIcon() 
     self.status_icon.set_from_stock(Gtk.STOCK_HOME) 
     self.status_icon.connect("popup-menu", self.right_click_event) 

    def right_click_event(self, icon, button, time): 
     self.menu = Gtk.Menu() 

     about = Gtk.MenuItem() 
     about.set_label("About") 
     about.connect("activate", self.show_about_dialog) 
     self.menu.append(about) 

     quit = Gtk.MenuItem() 
     quit.set_label("Quit") 
     quit.connect("activate", Gtk.main_quit) 
     self.menu.append(quit) 

     self.menu.show_all() 

     self.menu.popup(None, None, None, self.status_icon, button, time) 

    def show_about_dialog(self, widget): 
     about_dialog = Gtk.AboutDialog() 

     about_dialog.set_destroy_with_parent(True) 
     about_dialog.set_name("StatusIcon Example") 
     about_dialog.set_version("1.0") 
     about_dialog.set_authors(["Andrew Steele"]) 

     about_dialog.run() 
     about_dialog.destroy() 

app = MyStatusIconApp() 
Gtk.main() 

(更新すること自由に感じた場合は再度、GTKの変更)