Python with GTK3 Auto-connected

今まで PyGI で散々ウソを書いていた。

#!/usr/bin/env python3

from gi.repository import Gtk, Gdk

class Win(Gtk.Window):
    """
        Auto-connected by the prefix of do_
    """
    def __init__(self):
        Gtk.Window.__init__(self)
        self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK)
        #self.connect("button-press-event", self.on_button_press_event)
        #self.connect("delete-event", Gtk.main_quit)
        self.show_all()

    def do_delete_event(self, event):
        Gtk.main_quit()

    def do_button_press_event(self, event):
        self.begin_move_drag( event.button, event.x_root, event.y_root, event.time)

Win()
Gtk.main()

まさかこんな方法があったなんて、、、、、

ハイフンをアンダーバーに置換して do_ のプリフィクスだけで自動コネクト。
パッキングされた Widget は無理なので素直に自前コネクトを…
いや、コレも手段を知らないだけかも。

自前コネクトでも動くのでお好みで、ということで。

#!/usr/bin/env python3

import sys
from gi.repository import Gtk, Gio

"""
    ApplicationMenu does not apply in GtkWindow
"""

#class Win(Gtk.ApplicationWindow):
class Win(Gtk.Window):
    def __init__(self, app):
        #Gtk.ApplicationWindow.__init__(self, application=app)
        Gtk.Window.__init__(self, application=app)
        self.show_all()

class App(Gtk.Application):
    def __init__(self):
        Gtk.Application.__init__(self)

    def do_activate(self):
        self.window = Win(self)
        self.window.present()

    def do_startup(self):
        Gtk.Application.do_startup(self)
        # AppMenu
        menu = Gio.Menu()
        menu.append("New", "app.new")
        menu.append("Quit", "app.quit")
        self.set_app_menu(menu)
        # option "new"
        new_action = Gio.SimpleAction.new("new", None)
        new_action.connect("activate", self.new_cb)
        self.add_action(new_action)
        # option "quit"
        quit_action = Gio.SimpleAction.new("quit", None)
        quit_action.connect("activate", self.quit_cb)
        self.add_action(quit_action)

    def new_cb(self, action, parameter):
        print("New")

    def quit_cb(self, action, parameter):
        self.quit()

if __name__ == "__main__":
    app = App()
    app.run(sys.argv)

更に覚書ページでは GtkWindow を add_window していたけど
GtkApplicationWindow にしないとアプリケーションメニューが出せない。
自アプリに使おうとして適用されなくて初めて気が付いた。
application property は GtkWindow にあるのにさ。

実際に何か作らないと気が付かないことって多いよなぁ。
それにしても。

appmenu

アプリケーションメニューは Lubuntu 等ではタイトルバーの下になる。
LXDE が Qt に移行する最大の原因はコレなのかな。
どうせ Qt もタッチパネル向け UI に変わると思うけど。