Y901x は Glade を使って GtkBuilder 形式に変更する。
と書いたけど何か気に入らない、何かを忘れているような感じ。
Glade 等の GUI 作成ツールを使うと全部 GTK+ 部品のベタ打ちになる。
自分で都合がいいよう個別パーツに分けて作ったほうが良くないか。
現状では表示非表示切り替えやリストのリサイズ等で無駄を感じるんだが。
それよりも Glade のバージョンにまで左右されるのでは今後更に困るかも。
Delphi 屋だった頃も徐々に自作でクラスやコンポーネントを作るようになっていった。
今はまだいいがもう少しサイズが大きくなると破綻しそうだし、よしやってみるか。
とりあえずこの部分をまとめて class にしてみよう。
#! /usr/bin/env python # -*- coding: UTF-8 -*- import os import gtk class CStatusBar(gtk.VBox): """ Instead GtkStatusbar """ def __init__(self, num, window): """ @param num: Total of Label statusbar.label[0].set_text("aiueo") @param window: Toplevel Window Use "begin_resize_drag" Event """ self._win = window # public menber self.label = [] # init Original inheritance gtk.VBox.__init__(self) # GtkLabel and GtkVSeparator hb = gtk.HBox() for i in range(num): l1 = gtk.Label() s1 = gtk.VSeparator() # HBox insert param (child, expand=True, fill=True, padding=0) hb.pack_start(l1, False, False, 10) hb.pack_start(s1, False, False, 0) self.label.append(l1) # Dummy ld = gtk.Label() hb.pack_start(ld) # Grip grip = gtk.EventBox() self._im = gtk.Image() path = os.path.dirname( __file__ ) + "/img/grip.xpm" self._im.set_from_file(path) grip.add(self._im) hb.pack_end(grip, False, False, 0) # Grip connect self._first_show = False grip.connect("button_press_event", self.on_resize) grip.connect("expose-event", self.on_expose) # pack s0 = gtk.HSeparator() self.pack_start(s0, False, False, 0) self.pack_start(hb, False, False, 0) self.show_all() def on_resize(self, widget, event): # begin resize @ Toplevel Window self._win.begin_resize_drag(gtk.gdk.WINDOW_EDGE_SOUTH_EAST, event.button, int(event.x_root), int(event.y_root), event.time) def on_expose(self, widget, event): # Cursor Change if not self._first_show: cur_grip = gtk.gdk.Cursor(gtk.gdk.BOTTOM_RIGHT_CORNER) self._im.window.set_cursor(cur_grip) self._first_show = True
DocString を英語にしているのは単にカッチョイイと思ったから。
間違えている可能性大だからあんまり気にしないでチョ。
これを common.py という名前で保存して以下のコードを。
#!/usr/bin/env python #-*- coding:utf-8 -*- import gtk import common class TestWindow(gtk.Window): def __init__(self): # 継承のお約束 gtk.Window.__init__(self) # 使ってみる sb = common.CStatusBar(2, self) sb.label[0].set_text("自作") sb.label[1].set_text("statusbar クラスを作ったよ") # pack tv = gtk.TextView() vb = gtk.VBox() vb.pack_start(tv) vb.pack_start(sb, False, False, 0) self.add(vb) self.connect("delete-event", gtk.main_quit) self.resize(320, 240) self.show_all() if __name__ == "__main__": w = TestWindow() gtk.main()
んーこれでまったく同じように使えるようになりました。
GtkLabel のリストである label メンバ以外にアクセスしないようにした。
結果的に本体でやることは作成とラベルへの文字列挿入だけになる。
コードも XML で作るよりスッゲェ短くなる、他への使い回しもこれなら簡単。
なんだよ、コードで作るって良いことだらけだ。
いや、Glade があったおかげで私は GTK+ が使えるようになった。
それは間違いない、だけどそろそろ継承をやる時期なのかなと思ったので。
しかしコードで部品のパッキングをやるのは久々でやりかたを忘れて困ったわ。
expand や fill は親から使うのだった、ちょっと紛らわしいよねココ。