Y901x 0.1.2 公開しました。
こんな Windows 用のノリでやっていても良いものかと思い始めた今日この頃。
っっって…指定倍率変更の計算が間違えているのに今気がついた!
せっかくまとめて listbox クラスにしたのにセパレータサイズを足していた。
あーあ明日もごまかすために更新だ、更新が特定期間に集中する原因はコレです。
ところで。
ラジオメニューとトグルボタンは UIManager から同期させられないっぽい。
と以前書いたけどツールバーならあっさりできるようで。
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import gtk
ui_str = """<ui>
<menubar name="MenuBar">
<menu action="Rep">
<menuitem action="non"/>
<menuitem action="one"/>
<menuitem action="all"/>
<menuitem action="rdm"/>
</menu>
</menubar>
<toolbar name="Toolbar">
<toolitem action="one"/>
<toolitem action="all"/>
<toolitem action="rdm"/>
</toolbar>
</ui>"""
class BtnBox(gtk.Window):
def __init__(self):
gtk.Window.__init__(self)
#
# GtkUIManager 作成
self.uimanager = gtk.UIManager()
#
# GtkActionGroup 作成
self.actiongroup = gtk.ActionGroup("sasakimamenu")
#
# GtkAccelGroup を得てウインドウに突っ込む
# 何もグループを作らなくてもコレやらないと後のアクセラレータ指定が効かない
accelgroup = self.uimanager.get_accel_group()
self.add_accel_group(accelgroup)
#
# GtkActionEntry を作成して突っ込む
# 得にグループにしないものはココでまとめて作成
# name, stock_id, label, accelerator, tooltip, callback
self.ac0 = [("Rep", None, "リピート(_R)")]
self.actiongroup.add_actions(self.ac0)
#
# GtkRadioActionEntry の List を作成
# name, stock_id, label, accelerator, tooltip, value
self.ac1 = [("non", None, "無し", "0", "無し", 0),
("one", None, "シングル", "1", "シングル", 1),
("all", None, "オール", "2", "オール", 2),
("rdm", None, "ランダム", "3", "ランダム", 3) ]
# GtkRadioAction を突っ込む
# entries, value=0, on_change=None, user_data=None
self.actiongroup.add_radio_actions(self.ac1, 0, self.on_loop_change)
#
# GtkUIManager の更新
self.uimanager.insert_action_group(self.actiongroup, 0)
self.uimanager.add_ui_from_string(ui_str)
self.uimanager.ensure_update()
# menubar を抜き出す
menubar = self.uimanager.get_widget("/MenuBar")
# toolbar を抜き出す
toolbar = self.uimanager.get_widget('/Toolbar')
# pack
vbox = gtk.VBox()
vbox.pack_start(menubar, False)
vbox.pack_start(toolbar, False,False)
self.add(vbox)
self.connect("delete-event", gtk.main_quit)
self.resize(320, 150)
self.show_all()
self.val = 0
def on_loop_change(self, action, current):
# コレは無理だった
num = action.get_current_value()
if num == self.val:
action.set_current_value(0)
else:
self.val = num
if __name__ == "__main__":
w = BtnBox()
gtk.main()

得に何をするわけでもなく action を共通にすれば同期してくれるわ。
だけどアクティブなボタンを再度押すとオフにするといった処理は無理か。
ボタンオブジェクトを抜いて clicked シグナルを処理すればよさげだけど。
コレ上手く使えないかな?いまここ。