しなちく付属設定ツールのクローンをPythonで作ってみました。wxPythonの取っかかりとしても使えるかも。
# -*- coding: japanese.shift_jis -*- # Python - http://www.python.org/ # JapaneseCodecs - http://www.python.jp/Zope/download/JapaneseCodecs/ # ctypes - http://starship.python.net/crew/theller/ctypes/ # wxPython - http://wxpython.org/ from wx import * from ctypes import * import string # リソースID IDC_BUTTON_OK = 1001 IDC_BUTTON_CANCEL = 1002 # sipc.dll helper class Sipc: def __init__(self, name): self.sipc = windll.LoadLibrary('sipc.dll') self.sipc.Connect(name) def send(self, command): buf = c_buffer(1024) self.sipc.Send(command, buf, sizeof(buf)) return buf.value class RGB: def __init__(self, rgb=0): self.r = 0x000000ff & rgb self.g = 0x000000ff & (rgb >> 8) self.b = rgb >> 16 class SettingDialog(Dialog): def __init__(self, parent=None, id=-1, title=u'設定', pos=DefaultPosition, size=(351, 314)): """コンストラクタ""" Dialog.__init__(self, parent, id, title, pos, size) self.InitializeComponent() self.sipc = Sipc('kutinashi') self.LoadValues() def LoadValues(self): """設定を読み込む""" # 喋る間隔 v = string.atoi(self.sipc.send('sv_autosayinterval')) self.text1.SetValue('%ld' % (v / (1000 * 60))) # サーバ問い合わせ間隔 v = string.atoi(self.sipc.send('sv_autoreloadinterval')) self.text2.SetValue('%ld' % (v / (1000 * 60))) # 吹き出しが閉じるまでの時間 v = string.atoi(self.sipc.send('sv_scriptorautohidetime')) self.text3.SetValue('%ld' % (v / 1000)) # コンソール背景色 v = string.atoi(self.sipc.send('sc_gui_consolebackcolor')) rgb = RGB(v) r = self.slider1R.SetValue(rgb.r) g = self.slider1G.SetValue(rgb.g) b = self.slider1B.SetValue(rgb.b) # コンソール文字色 v = string.atoi(self.sipc.send('sc_gui_consolefontcolor')) rgb = RGB(v) self.slider2R.SetValue(rgb.r) self.slider2G.SetValue(rgb.g) self.slider2B.SetValue(rgb.b) # コンソール透明度 v = string.atoi(self.sipc.send('sc_gui_consolealpha')) self.slider3.SetValue(v) # スクリプタ透明度 v = string.atoi(self.sipc.send('sc_gui_scriptoralpha')) self.slider4.SetValue(v) # テクスチャ透明度 v = string.atoi(self.sipc.send('sc_gui_texturealpha')) self.slider5.SetValue(v) def StoreValues(self): """設定を反映させる""" # 喋る間隔(分) v = string.atoi(self.text1.GetValue()) if v < 0: v = 1 self.sipc.send('sv_autosayinterval %ld' % (v * 60 * 1000)) # サーバ問い合わせ間隔(分) v = string.atoi(self.text2.GetValue()) if v < 0: v = 1 self.sipc.send('sv_autoreloadinterval %ld' % (v * 60 * 1000)) # 吹き出しが閉じるまでの時間(秒) v = string.atoi(self.text3.GetValue()) if v < 0: v = 1 self.sipc.send('sv_scriptorautohidetime %ld' % (v * 1000)) # コンソール背景色 r = self.slider1R.GetValue() g = self.slider1G.GetValue() b = self.slider1B.GetValue() self.sipc.send('setguiattribute console backcolor %ld %ld %ld' % (r,g,b)) # コンソール文字色 r = self.slider2R.GetValue() g = self.slider2G.GetValue() b = self.slider2B.GetValue() self.sipc.send('setguiattribute sonsole fontcolor %ld %ld %ld' % (r,g,b)) # コンソール透明度 a = self.slider3.GetValue() self.sipc.send('setguiattribute console alpha %ld' % (a)) # スクリプタ透明度 a = self.slider4.GetValue() self.sipc.send('setguiattribute scriptor alpha %ld' % (a)) # テクスチャ透明度 a = self.slider5.GetValue() self.sipc.send('setguiattribute texture alpha %ld' % (a)) def InitializeComponent(self): """コンポーネントの配置を行う""" btnOK = Button(self, IDC_BUTTON_OK, u'OK') btnOK.SetPosition(Point(185, 258)) btnOK.SetDefault() btnCancel = Button(self, IDC_BUTTON_CANCEL, u'Cancel') btnCancel.SetPosition(Point(263, 258)) book = Notebook(self, -1, pos=(8, 10), size=(329,241)) # Page1 page1 = NotebookPage(book, -1) book.AddPage(page1, u'基本') StaticText(page1, -1, u'喋る間隔(&S)', pos=(8, 12)) StaticText(page1, -1, u'サーバ問い合わせ間隔(&R)', pos=(8, 36)) StaticText(page1, -1, u'吹き出しが閉じるまでの時間(&C)', pos=(8, 76)) StaticText(page1, -1, u'約', pos=(216, 12)) StaticText(page1, -1, u'約', pos=(216, 36)) StaticText(page1, -1, u'約', pos=(216, 76)) StaticText(page1, -1, u'分', pos=(296, 12)) StaticText(page1, -1, u'分', pos=(296, 36)) StaticText(page1, -1, u'秒', pos=(296, 76)) self.text1 = TextCtrl(page1, -1, u'', pos=(232, 8), size=(60, 20)) self.text2 = TextCtrl(page1, -1, u'', pos=(232, 32), size=(60, 20)) self.text3 = TextCtrl(page1, -1, u'', pos=(232, 72), size=(60, 20)) # Page2 page2 = NotebookPage(book, -1) book.AddPage(page2, u'GUI') # コンソール背景色 StaticText(page2, -1, u'コンソール背景色(&C)', pos=(8, 8)) StaticText(page2, -1, u'R', pos=(8, 32)) StaticText(page2, -1, u'G', pos=(8, 56)) StaticText(page2, -1, u'B', pos=(8, 80)) self.slider1R = Slider(page2, -1, 0, 0, 255, (24, 28), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider1R.SetTickFreq(16, 1) self.slider1G = Slider(page2, -1, 0, 0, 255, (24, 52), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider1G.SetTickFreq(16, 1) self.slider1B = Slider(page2, -1, 0, 0, 255, (24, 76), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider1B.SetTickFreq(16, 1) # コンソール文字色 y = 104 StaticText(page2, -1, u'コンソール文字色(&F)', pos=(8, 8 + y)) StaticText(page2, -1, u'R', pos=(8, 32 + y)) StaticText(page2, -1, u'G', pos=(8, 56 + y)) StaticText(page2, -1, u'B', pos=(8, 80 + y)) self.slider2R = Slider(page2, -1, 0, 0, 255, (24, 28 + y), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider2R.SetTickFreq(16, 1) self.slider2G = Slider(page2, -1, 0, 0, 255, (24, 52 + y), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider2G.SetTickFreq(16, 1) self.slider2B = Slider(page2, -1, 0, 0, 255, (24, 76 + y), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider2B.SetTickFreq(16, 1) # - StaticLine(page2, -1, (160, 8), (2, 216), LI_VERTICAL) # コンソール透明度 StaticText(page2, -1, u'コンソール透明度(&D)', pos=(172, 8)) StaticText(page2, -1, u'A', pos=(172, 32)) self.slider3 = Slider(page2, -1, 0, 0, 255, (188, 28), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider3.SetTickFreq(16, 1) # スクリプタ透明度 StaticText(page2, -1, u'スクリプタ透明度(&S)', pos=(172, 64)) StaticText(page2, -1, u'A', pos=(172, 88)) self.slider4 = Slider(page2, -1, 0, 0, 255, (188, 84), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider4.SetTickFreq(16, 1) # テクスチャ透明度 StaticText(page2, -1, u'テクスチャ透明度(&T)', pos=(172, 120)) StaticText(page2, -1, u'A', pos=(172, 144)) self.slider5 = Slider(page2, -1, 0, 0, 255, (188, 140), (128, -1), SL_HORIZONTAL|SL_AUTOTICKS) self.slider5.SetTickFreq(16, 1) # events EVT_CLOSE(self, self.OnClose) EVT_BUTTON(self, btnOK.GetId(), self.OnOK) EVT_BUTTON(self, btnCancel.GetId(), self.OnCancel) def OnOK(self, evt): self.StoreValues() self.Destroy() def OnClose(self, evt): self.Destroy() def OnCancel(self, evt): self.Destroy() class MyApp(App): def OnInit(self): self.dlg = SettingDialog() self.dlg.Show(True) self.SetTopWindow(self.dlg) return True def main(): app = MyApp() app.MainLoop() if __name__ == '__main__': main() # vim:ts=4 sts=4 sw=4: