📄 mfbox_getparam.py
字号:
#!/usr/bin/env python# -*- coding: utf-8 -*-# generated by wxGlade 0.6.3 on Fri Jun 13 15:05:49 2008import wximport mfbox_xmlparseimport sysdef log(t): sys.stderr.write(t+"\n")def getintfunctions(intType_input,intType_spin,prng): def change_intType_input(event): t = 1 try: t = int(float(intType_input.GetValue())) except: pass t = max(min(t,prng[1]),prng[0]) intType_input.SetValue(str(t)) event.Skip() def up_intType_spin(event): t = 1 try: t = int(float(intType_input.GetValue()))+1 except: pass t = max(min(t,prng[1]),prng[0]) intType_input.SetValue(str(t)) event.Skip() def down_intType_spin(event): t = 1 try: t = int(float(intType_input.GetValue()))-1 except: pass t = max(min(t,prng[1]),prng[0]) intType_input.SetValue(str(t)) event.Skip() return (change_intType_input,up_intType_spin,down_intType_spin)def getfloatfunctions(floatType_input,floatType_slider,prng): def change_floatType_input(event): t = 1 try: t = float(floatType_input.GetValue()) except: pass t = max(min(t,prng[1]),prng[0]) floatType_input.SetValue(str(t)) floatType_slider.SetValue(int(100*(t-prng[0])/(prng[1]-prng[0]))) event.Skip() def change_floatType_slider(event): t = int(floatType_slider.GetValue()) t = (prng[0]*(100.0-1.0*t)+prng[1]*(1.0*t))/100.0 floatType_input.SetValue(str(t)) event.Skip() def setfn(t): return int(100*(float(t)-prng[0])/(prng[1]-prng[0])) return (change_floatType_input,change_floatType_slider,setfn)class MfboxConfig(wx.Frame): app = None getsetter = None params = None def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE self.params = kwds.pop('params') self.app = kwds.pop('app') wx.Frame.__init__(self, *args, **kwds) self.title = wx.StaticText(self, -1, _("%s configuration"%(self.params['name'])), style=wx.ALIGN_CENTRE) self.run_button = wx.Button(self, -1, _("Run ..."), style=wx.BU_EXACTFIT) self.__set_properties() layout = [] self.getsetter = {} for name,par in self.params.items(): if name=='name': continue if par['type']=='int': prng = (int(par['min']),int(par['max'])) intType_label = wx.StaticText(self, -1, _(name), style=wx.ALIGN_LEFT) intType_input = wx.TextCtrl(self, -1, str(prng[0]), style=wx.TE_RIGHT|wx.TE_PROCESS_ENTER) intType_spin = wx.SpinButton(self, -1) intType_input.SetMinSize((50, 21)) intType_spin.SetMinSize((100, 18)) fncs = getintfunctions(intType_input,intType_spin,prng) self.Bind(wx.EVT_TEXT_ENTER, fncs[0], intType_input) self.Bind(wx.EVT_SPIN_UP, fncs[1], intType_spin) self.Bind(wx.EVT_SPIN_DOWN, fncs[2], intType_spin) intType_sizer = wx.BoxSizer(wx.HORIZONTAL) intType_sizer.Add(intType_input, 0, wx.LEFT|wx.ALIGN_CENTER_HORIZONTAL, 0) intType_sizer.Add(intType_spin, 0, wx.RIGHT|wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 0) layout.append([intType_label,intType_sizer]) self.getsetter[name] = {'set':[(intType_input.SetValue,lambda t:str(int(t)))],'get':[(intType_input.GetValue,int)]} elif par['type']=='float': prng = (float(par['min']),float(par['max'])) floatType_label = wx.StaticText(self, -1, _(name), style=wx.ALIGN_LEFT) floatType_input = wx.TextCtrl(self, -1, str(prng[0]), style=wx.TE_RIGHT|wx.TE_PROCESS_ENTER) floatType_slider = wx.Slider(self, -1, 0, 0, 100) floatType_input.SetMinSize((50, 21)) floatType_slider.SetMinSize((100, 18)) fncs = getfloatfunctions(floatType_input,floatType_slider,prng) self.Bind(wx.EVT_TEXT_ENTER, fncs[0], floatType_input) self.Bind(wx.EVT_COMMAND_SCROLL, fncs[1], floatType_slider) self.Bind(wx.EVT_COMMAND_SCROLL_ENDSCROLL, fncs[1], floatType_slider) floatType_sizer = wx.BoxSizer(wx.HORIZONTAL) floatType_sizer.Add(floatType_input, 0, wx.LEFT|wx.ALIGN_CENTER_HORIZONTAL, 0) floatType_sizer.Add(floatType_slider, 0, wx.RIGHT|wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 0) layout.append([floatType_label,floatType_sizer]) self.getsetter[name] = {'set':[(floatType_input.SetValue,str),(floatType_slider.SetValue,fncs[2])],'get':[(floatType_input.GetValue,float)]} elif par['type']=='boolean': booleanType_label = wx.StaticText(self, -1, _(name), style=wx.ALIGN_LEFT) booleanType_checkbox = wx.CheckBox(self, -1, '') booleanType_sizer = wx.BoxSizer(wx.HORIZONTAL) booleanType_sizer.Add(booleanType_checkbox, 0, wx.RIGHT|wx.ALIGN_RIGHT|wx.ADJUST_MINSIZE, 0) layout.append([booleanType_label,booleanType_sizer]) self.getsetter[name] = {'set':[(booleanType_checkbox.SetValue,lambda x:x=='on')],'get':[(booleanType_checkbox.GetValue,lambda x:['off','on'][int(x)])]} elif par['type']=='choice': choiceType_label = wx.StaticText(self, -1, _(name), style=wx.ALIGN_LEFT) choiceType_choice = wx.Choice(self, -1, choices=[x for x in par['choices']]) choiceType_sizer = wx.BoxSizer(wx.HORIZONTAL) choiceType_sizer.Add(choiceType_choice, 0, wx.LEFT|wx.ALIGN_CENTER_HORIZONTAL, 0) layout.append([choiceType_label,choiceType_sizer]) self.getsetter[name] = {'set':[(choiceType_choice.SetStringSelection,str)],'get':[(choiceType_choice.GetStringSelection,str)]} self.__do_layout(len(layout),layout) self.Bind(wx.EVT_BUTTON, self.run_clicked, self.run_button) self.Bind(wx.EVT_CLOSE, self.close_clicked, self) def __set_properties(self): self.SetTitle(_("%s config"%(self.params['name']))) self.title.SetFont(wx.Font(12, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, "")) def __do_layout(self, param_num, params): main_sizer = wx.FlexGridSizer(3, 1, 20, 0) parameter_sizer = wx.FlexGridSizer(param_num, 2, 10, 10) main_sizer.Add(self.title, 0, wx.ALL|wx.ALIGN_CENTER_HORIZONTAL|wx.FIXED_MINSIZE, 3) for l in params: parameter_sizer.Add(l[0], 0, wx.ALIGN_LEFT|wx.FIXED_MINSIZE, 0) parameter_sizer.Add(l[1], 1, wx.RIGHT|wx.ALIGN_RIGHT, 0) main_sizer.Add(parameter_sizer, 1, wx.EXPAND|wx.ADJUST_MINSIZE, 0) main_sizer.Add(self.run_button, 0, wx.ALL|wx.ALIGN_RIGHT|wx.ALIGN_CENTER_VERTICAL|wx.FIXED_MINSIZE, 0) vbox = wx.BoxSizer(wx.VERTICAL) vbox.Add(main_sizer,1,wx.EXPAND | wx.ALL, 10) self.SetSizer(vbox) vbox.Fit(self) #self.SetSizer(main_sizer) #main_sizer.Fit(self) #main_sizer.SetSizeHints(self) self.Layout() def run_clicked(self, event): self.Close() self.app.buttons['run'] = 1 self.getParams() event.Skip() def close_clicked(self, event): self.app.buttons['close'] = 1 event.Skip() def setParams(self): for name in self.params.keys(): if name=='name': continue gs = self.getsetter[name] for w,c in gs['set']: w(c(self.app.params[name])) def getParams(self): for name in self.params.keys(): if name=='name': continue gs = self.getsetter[name] for w,c in gs['get']: self.app.params[name] = c(w())class MfboxConfigurator(wx.App): params = None buttons = {'run':0,'close':0} config = None def __init__(self, *args, **kwds): self.params = kwds.pop('params') wx.App.__init__(self, *args, **kwds) def OnInit(self): wx.InitAllImageHandlers() params = {} for j in self.params.keys(): if j.find("_")<0: if j+"_type" in self.params.keys(): params[j] = {'type':self.params[j+'_type']} if params[j]['type'] in ['int','float']: if j+"_min" in self.params.keys() and j+"_max" in self.params.keys(): params[j]['min'] = self.params[j+'_min'] params[j]['max'] = self.params[j+'_max'] else: # dont have min/max params.pop(j) elif params[j]['type']=='choice': if j+"_choices" in self.params.keys(): params[j]['choices'] = self.params[j+'_choices'] else: # dont have min/max params.pop(j) elif params[j]['type']=='boolean': pass else: # remove unhandled paramtypes params.pop(j) params['name'] = self.params['type']['name'] self.config = MfboxConfig(None, -1, "", params=params, app=self) self.config.setParams() self.SetTopWindow(self.config) self.config.Show() return 1 def UpdateParams(self): self.config.setParams()if __name__ == "__main__": import gettext gettext.install("mfbox_getparam") # replace with the appropriate catalog name xmlmarshal = mfbox_xmlparse.MfboxXmlMarshal() xmlunmarshal = mfbox_xmlparse.MfboxXmlUnmarshal() p = xmlunmarshal.loads(sys.stdin.readline().strip()) mfbox_config = MfboxConfigurator(0,params=p) while reduce(lambda x,y:x+y,mfbox_config.buttons.values(),0)==0: mfbox_config.MainLoop() p = mfbox_config.params b = mfbox_config.buttons x = {'params':p,'buttons':b} sys.stdout.write(xmlmarshal.dumps(x))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -