#! /usr/bin/python # -*- coding: UTF-8 -*- # IOFieldsinText : IOFieldsinText is a text widget which allow to have Input/Output Fields # 0.1.2 (30 Mar 2013) # BUG fix # 0.1.1 (11 Mar 2013) # BUG fix # 0.1.0 (25 Feb 2013) # New release # Copyright (c) 2013, Miki Ishimaru <miki_ishimaruusers.sourceforge.jp> # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # * Neither the name of the Miki Ishimaru nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, # THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. import Tkinter import sys import types import UserDict class Key_dict(UserDict.IterableUserDict): def __setitem__(self, x, y): self.data[x] = y self.ft.write_IOField(x) class IOFieldsinText(Tkinter.Text): def __init__(self,master,text="",parameter=None,IFields_name=None,Fields_type=None,**kw): ###値ã®è¨å®š### self.default_str = "***" self.text = text if parameter==None:parameter={} self.parameter=parameter # å…¥åŠ›æž ã®ä¸èº«ã®ä¿å˜ç”¨ã®è¾žæ›¸->fn_change_parameter self.output = 0 if IFields_name==None:IFields_name=[] self.ifields_ls = IFields_name if Fields_type==None:Fields_type={} self.fields_type = self.fn_fields_type(Fields_type) self.fields_format = {} self.fields_format2 = {} self.fields_out = {} ###Textã®ä½œæˆ### kw = self.fn_make_scrollbar(master,**kw) Tkinter.Text.__init__(self, master, **kw) self.set_text(self.text) self.fn_make_popup_menu() ###keyãŒæŠ¼ã•ã‚ŒãŸã¨ãã®callback### self.bind("<Delete>", self.cb_delete) self.bind("<BackSpace>", self.cb_backspace) self.bind("<Control-KeyPress-v>", self.cb_ctrl_v) self.bind("<Control-KeyPress-x>", self.cb_ctrl_x) self.bind("<Control-KeyPress-c>", self.cb_ctrl_c) self.bind("<Key>", self.cb_other_key) self.bind("<Button-2>", lambda e: "break") self.bind("<Button-3>", self.cb_popup_menu) # ãƒãƒƒãƒ—アップメニュー(å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ï¼‰ def set_text(self,text=""): u"""IOFieldsinTextã®ãƒ†ã‚ストをè¨å®šã™ã‚‹ """ if text == "":text = ["IOFieldsinText receives no text!!"] else: text=text.split("\n") # 改行ã§åˆ†å‰²ã—ã€ãƒªã‚¹ãƒˆã« text=[ii.strip("\t") for ii in text] # 両å´ã‚¿ãƒ–ã¯é™¤åŽ»ã—㦠# text=[ii.strip(" ") for ii in text] # 空白文å—ã¯é™¤åŽ»ã—㦠ã€è¡Œã®å‰ã®ç©ºç™½æ–‡å—列ã ã‘除去ã™ã‚‹ã€‘ for x in text: self.insert(Tkinter.END,x) self.insert(Tkinter.END,"\n") self.fn_convert_to_fields() def fn_convert_to_fields(self): u"""テã‚ストをFieldsã«å¤‰æ›ã™ã‚‹ Tkinter.Text.mark_set(name, index) name:markã®åå‰ï¼ˆæ–‡å—列)ã€index:マークを挿入ã™ã‚‹å ´æ‰€   å‰ã®æ–‡å—を増やã—ãŸã‚Šã€æ¶ˆã™ã¨ã€ãƒžãƒ¼ã‚¯ã‚‚一緒ã«å‹•ã   マークã®å ´æ‰€ã®æ–‡å—を消ã™ã¨ã€ãã“ã«ãšã‚Œã¦å…¥ã£ã¦ããŸæ–‡å—ã«ãƒžãƒ¼ã‚¯ãŒç§»ã‚‹ mark_ls' : [['name','index'],...] """ index2 = "0.0" try: while True: parameter = self.parameter index1 = self.search("%",index2) if self.compare(index1, "<=", index2):break index1_next = self.fn_next_char(index1) if self.get(index1_next)=="%": # "%%"ã®å ´åˆã€ç„¡è¦–ã™ã‚‹ self.delete(index1_next) index2 = index1_next else: index3 = self.search(")",index1) index2 = self.search("[diouxXeEfFgGcrs]",index3,regexp=True) index4 = self.fn_next_char(index2) format = self.get(index1,index4) key = self.get(index1,index3)[2:] mark1,mark2 = self.fn_make_markname_for_OField(key) self.mark_set(mark1,index1) self.mark_set(mark2,index2) ###括弧ã®ä½ç½®ã«ãƒžãƒ¼ã‚¯ã‚’ã¤ã‘ã‚‹### if key in self.ifields_ls: # å…¥åŠ›æž mark1i = "s_%s" % key mark2i = "e_%s" % key self.mark_set(mark1i,index1) self.mark_set(mark2i,index2) self.fields_format[mark1] = format self.fields_format2[mark1] = "%s:%s"%(key, format) ###åˆã‚ã®ãƒžãƒ¼ã‚¯ï¼šï¼…ã®æ¬¡ã«ç©ºç™½ã‚’入れã€ï¼…ã¨æ‹¬å¼§ã‚’消ã™ï¼ˆãƒžãƒ¼ã‚¯ã¯ç©ºç™½ã«ç§»ã‚‹ï¼‰### index1_next = self.fn_next_char(index1) self.insert(index1_next,u" ") self.delete(index1) self.delete(self.fn_next_char(index1)) ###終ã‚ã‚Šã®ãƒžãƒ¼ã‚¯ï¼šæ‹¬å¼§ã®æ¬¡ã«ç©ºç™½ã‚’入れã€ç©ºç™½ã‚’消ã™ï¼ˆãƒžãƒ¼ã‚¯ã¯ç©ºç™½ã«ç§»ã‚‹ï¼‰### index2 = self.index(mark2) # ãšã‚Œã¦ã„ã‚‹ã®ã§ã€ã‚‚ã†ä¸€åº¦æŽ¢ã™ index2_next = self.fn_next_char(index2) self.insert(index2_next,u" ") self.delete(index2) ###å…¥åŠ›æž ã«è‰²ã‚’ã¤ã‘ã€ã‚¢ãƒ³ãƒ€ãƒ¼ãƒ©ã‚¤ãƒ³ã‚’引ã### mark1_index = self.index(mark1) mark2_index = self.fn_next_char(self.index(mark2)) # tagã®ç¯„囲ãŒ0:n-1ãªã®ã§ã€1ã¤å¤šã‚ã«ã™ã‚‹ self.tag_add(key, mark1_index , mark2_index ) if key in self.ifields_ls: # å…¥åŠ›æž self.tag_config(key, foreground="blue" ,underline=1) else: # å‡ºåŠ›æž self.tag_config(key, foreground="darkgreen" ) mark1_next = self.fn_next_char(self.index(mark1)) self.delete(mark1_next,mark2) except SyntaxError: # エラーãŒè¦‹ãŸã„å ´åˆã¯ã“ã¡ã‚‰ã‚’表示 # except Exception as e: pass ###以下ã®print文を表示ã•ã›ã¦ã€ã€Œ_tkinter.TclErrorã€ãŒå‡ºã‚Œã°ã€OK。searchã§æŽ¢ã™ã‚‚ã®ãŒãªãã¦ã€çµ‚ã‚ã£ã¦ã„ã‚‹### # print 'type:' + str(type(e)) # print 'args:' + str(e.args) # print 'message:' + e.message self.write_IOFields() # Fieldを書ãç›´ã—ã¦ã„ã‚‹ def cb_delete(self, event): u"""delete keyãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹""" ans = self.fn_check_field(event) if ans == "break":return "break" elif (type(ans) == tuple) and (ans[3] == True): # é¸æŠžç¯„囲ãŒã‚ã‚Šã€å…¥åŠ›æž 内ã«ã‚ã‚‹ sel_first = ans[0][0] sel_last = ans[0][1] self.delete(sel_first,sel_last) elif len(ans) >= 2: # é¸æŠžç¯„囲ã¯ãªã„ãŒã€InsertãŒå…¥åŠ›æž 内ã«ã‚ã‚‹ self.delete(ans[0]) self.fn_change_parameter(ans) return "break" def cb_backspace(self, event): u"""ãƒãƒƒã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚ーãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹""" ans = self.fn_check_field(event) if ans == "break":return"break" elif (type(ans) == tuple) and (ans[3] == True): # é¸æŠžç¯„囲ãŒã‚ã‚Šã€å…¥åŠ›æž 内ã«ã‚ã‚‹ sel_first = ans[0][0] sel_last = ans[0][1] self.delete(sel_first,sel_last) elif len(ans) >= 2: # é¸æŠžç¯„囲ã¯ãªã„ãŒã€InsertãŒå…¥åŠ›æž 内ã«ã‚ã‚‹ # insertã¯æ–‡å—ã®å‰ã«ä»˜ã。BackSpaceã¯ã€insertã®å‰ã®æ–‡å—を消㙠# insertãŒField内ã«ã‚ã£ã¦ã‚‚ã€pre_markã®1ã¤å¾Œã‚ã®å ´åˆã€pre_markã®æ–‡å—(Field外)を消ã—ã¦ã—ã¾ã†ã®ã§ã€ãã®ç¢ºèªã‚’ã—ã¦ã„ã‚‹ next_pre_mark = self.fn_next_char(self.index(ans[1])) insert = ans[0] if next_pre_mark == ans[0]:return "break" event.widget.delete("%s-1c" % insert, insert) self.fn_change_parameter(ans) return "break" def cb_ctrl_c(self, event): """Cntr_cãªã©ãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹(ãŒã€ä½•ã‚‚ã—ãªã„)""" print dir(self) self.copy(event=None) # コピー return "break" def cb_ctrl_v(self, event): """Cntr_vãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹""" ans = self.fn_check_field(event) if ans == "break":return "break" self.paste(event=None) # ペースト self.fn_change_parameter(ans) return "break" def cb_ctrl_x(self, event): """Cntr_xãªã©ãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹ """ ans = self.fn_check_field(event) if ans == "break":return "break" self.cut(event=None) # カット self.fn_change_parameter(ans) return "break" def cut(self, event=None): if self.tag_ranges(Tkinter.SEL): self.copy() self.delete(Tkinter.SEL_FIRST, Tkinter.SEL_LAST) def copy(self, event=None): if self.tag_ranges(Tkinter.SEL): text = self.get(Tkinter.SEL_FIRST, Tkinter.SEL_LAST) self.clipboard_clear() self.clipboard_append(text) def paste(self, event=None): text = self.selection_get(selection='CLIPBOARD') if text: self.insert(Tkinter.INSERT, text) self.tag_remove(Tkinter.SEL, '1.0', Tkinter.END) self.see(Tkinter.INSERT) def cb_other_key(self, event): """KeyãŒæŠ¼ã•ã‚ŒãŸã¨ãã«å‘¼ã³ã ã•ã‚Œã‚‹ã€‚å…¥åŠ›æž ã®ä¸ã§ã‚ã‚Œã°è¡¨ç¤ºã™ã‚‹ """ press_key = event.char if len(press_key) == 0:return # ã‚ーã®ä¸ã§ã‚‚charã§ã¯å—ã‘付ã‘られãªã„ã‚‚ã®ã‚‚ã‚る(例:Sift)ã“ã®æ™‚ã®æ–‡å—ã®é•·ã•ã¯0ã«ãªã‚‹ãŸã‚ try: if 0 <= ord(press_key) < 32:return "break" except TypeError:pass # print press_key,ord(press_key) insert = Tkinter.INSERT ans = self.fn_check_field(event) if ans == "break":return "break" # å…¥åŠ›æž å¤– elif (type(ans) == tuple) and (ans[3] == True): # é¸æŠžç¯„囲ãŒã‚ã‚Šã€å…¥åŠ›æž 内ã«ã‚ã‚‹ sel_first = ans[1][0] sel_last = ans[1][1] self.delete(sel_first,sel_last) self.insert(insert,press_key) elif len(ans) >= 2: # é¸æŠžç¯„囲ã¯ãªã„ãŒã€InsertãŒå…¥åŠ›æž 内ã«ã‚ã‚‹ self.insert(insert,press_key) # insert,premark,nextmark,true self.fn_change_parameter(ans) return "break" def cb_popup_menu(self, event): u"""ãƒãƒƒãƒ—アップメニューã®callback""" self.menu_top.post(event.x_root,event.y_root) pass def fn_check_field(self, event): u"""å…¥åŠ›æž ã®ç¯„囲内ã‹ã‚’調ã¹ã‚‹""" ans = self.fn_check_field_sel(event) if ans == "break":return "break" # å…¥åŠ›æž å¤– elif ans :return ans # é¸æŠžç¯„囲ãŒã‚ã‚Šã€å…¥åŠ›æž 内ã«ã‚ã‚‹ elif ans == False: # é¸æŠžç¯„囲ãŒãªã„ insert = self.index(Tkinter.INSERT) pre_mark = self.mark_previous(insert) if pre_mark: while (pre_mark == "insert")or(pre_mark == "current")or(pre_mark[:2] == "tk")or(pre_mark[:3] == "out"): pre_mark = self.mark_previous(pre_mark) if pre_mark == None:break if (pre_mark!=None)and(pre_mark[:2]=="s_"): next_mark = self.mark_next(pre_mark) while (next_mark == "insert")or(next_mark == "current")or(next_mark[:2] == "tk")or(next_mark[:3] == "out"): next_mark = self.mark_next(next_mark) if next_mark == None:break ###cb_deleteã®å ´åˆ### if (event.keysym=="Delete")and(next_mark[:2]=="e_")and(self.compare(next_mark,"<=",insert)):return "break" ###ãã®ä»–ã®å ´åˆ### elif self.compare(next_mark,"<",insert):return "break" else:return "break" else:return "break" return (insert,pre_mark,next_mark,False) def fn_check_field_sel(self,event): """範囲ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹å ´åˆã«ã€ãã®ç¯„囲ãŒå…¥åŠ›æž ã®ä¸ãªã‚‰"True"を返㙠範囲ãŒé¸æŠžã•ã‚Œã¦ã„ãªã„å ´åˆã ã¨ã€ã‚¨ãƒ©ãƒ¼ãŒèµ·ã“ã‚Šã€exceptæ–‡ã¸ã€‚"False"を返㙠範囲ãŒé¸æŠžã•ã‚Œã¦ã„ã‚‹ãŒã€å…¥åŠ›æž ã®å¤–ã ã¨ã€"break"を返㙠sel_first :é¸æŠžç¯„囲ã®åˆã‚ã®æ–‡å—ã®index sel_last :é¸æŠžç¯„囲ã®çµ‚ã‚ã‚Šã®æ–‡å—ã®index """ try: sel_first = self.index(Tkinter.SEL_FIRST) sel_last = self.index(Tkinter.SEL_LAST) pre_mark = self.mark_previous(sel_first) if pre_mark: while (pre_mark == "insert")or(pre_mark == "current")or(pre_mark[:2] == "tk")or(pre_mark[:3] == "out"): pre_mark = self.mark_previous(pre_mark) if (pre_mark!=None)and(pre_mark[:2]=="s_"): next_mark = self.mark_next(pre_mark) while (next_mark == "insert")or(next_mark == "current")or(next_mark[:2] == "tk")or(next_mark[:3] == "out"): next_mark = self.mark_next(next_mark) if self.compare(next_mark,"<",sel_last):return "break" else:return ((sel_first,sel_last),pre_mark,next_mark,True) else:return "break" else:return "break" except:return False def get_text(self,form="IFields"): u"""IOFieldsinTextã‹ã‚‰Textã‚’å¾—ã‚‹ form = "all" :テã‚スト全体を返㙠form = "IFields" :テã‚ストä¸ã‹ã‚‰å…¥åŠ›æž ã®åå‰ã¨ä¸èº«ã®è¾žæ›¸ã‚’返㙠""" if form == "all":pass elif form == "IFields": dic = {} mark = self.mark_next("0.0") # æ–‡å—"0.0"ã‹ã‚‰æ¬¡ã®ãƒžãƒ¼ã‚¯ã‚’探㙠while mark: while (mark == "insert")or(mark == "current")or(mark[:2] == "tk")or(mark[:3] == "out"):# ã“れらもマークã¨ã—ã¦åˆ¤æ–ã•ã‚Œã‚‹ãŒã€å¼•ã£ã‹ã‹ã‚‹ã¨å›°ã‚‹ mark = self.mark_next(mark) if mark == None:break if (mark!=None)and(mark[:2]=="s_"): start_index = self.index(mark) mark = self.mark_next(mark) while (mark == "insert")or(mark == "current")or(mark[:2] == "tk")or(mark[:3] == "out"): mark = self.mark_next(mark) if mark == None:break if (mark!=None)and(mark[:2]=="e_"): end_index = self.index(mark) start_ls = start_index.split(".") start_ls[1] = int(start_ls[1])+1 start_index = "%s.%s" % (start_ls[0],start_ls[1]) dic["%s" % mark[2:]] = self.get(start_index,end_index) mark = self.mark_next(mark) return dic def write_IOField(self,key): u"""å‡ºåŠ›æž ã®ãƒ‡ãƒ¼ã‚¿ã‚’消ã—ã¦ã€æ–°ã—ã„データを入れる""" ###OFieldsã®æ•°ã®ç¢ºèª### try: n_max = self.fields_out[key] except KeyError:return ###parameterã®ä¸ã«ã‚ã‚‹ã‹ã®ç¢ºèª### parameter = self.parameter value = parameter.get(key,None) if value == None: x = False parameter[key] = None else: x = True ###出力### for n in xrange(n_max): mark1 = "out_%s_%s" % (key,n) mark2 = "out_%s_%se" % (key,n) mark1_next = self.fn_next_char(self.index(mark1)) self.delete(mark1_next,mark2) if x: format = self.fields_format[mark1] ###Fields_Typeã®ç¢ºèª### func = self.fields_type.get(key,None) if func != None: value = func(value,format,reverse=True) if value==None:value=u"formatãŒé©åˆ‡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。(%s)" % format self.insert(mark1_next,value) else: try:value=format % parameter except ValueError:value=u"formatãŒé©åˆ‡ã§ã¯ã‚ã‚Šã¾ã›ã‚“。(%s)" % format self.insert(mark1_next,value) if key in self.ifields_ls:# å…¥åŠ›æž self.tag_config(key, foreground="blue" ,underline=1) else: self.insert(mark1_next,self.default_str) if key in self.ifields_ls: self.tag_config(key, foreground="red" ,underline=1) def write_IOFields(self): u"""å‡ºåŠ›æž ã®ãƒ‡ãƒ¼ã‚¿ã‚’消ã—ã¦ã€æ–°ã—ã„データを入れる self.fields_outï¼šå‡ºåŠ›æž ã®åå‰ã‚’keyã¨ã—ã¦ãã®æž ã®æ•°ãŒå…¥ã£ãŸè¾žæ›¸ key:self.fields_outã®key """ for key in self.fields_out: self.write_IOField(key) def get_dict(self): x = Key_dict() x.ft = self x.data = self.parameter return x def fn_make_markname_for_OField(self,key): u"""å‡ºåŠ›æž ã®ãƒžãƒ¼ã‚¯ã‚’通ã—番å·ã«ã™ã‚‹ """ # n=self.output # mark = "out_%s_%s" % (key,n) # self.output = n+1 n = self.fields_out.get(key,0) mark1 = "out_%s_%s" % (key,n) mark2 = "out_%s_%se" % (key,n) self.fields_out[key] = n+1 return mark1,mark2 def fn_next_char(self,index,n=1): u"""次ã®æ–‡å—ã®indexを返㙠最後ã®æ–‡å—ã ã£ãŸã‚‰æ¬¡ã®è¡Œã«ã„ãよã†ã«ã™ã‚‹ï¼ˆã‚‚ã†ä¸€ã¤å¼•æ•°ï¼šnを作ã£ã¦é¸æŠžï¼‰ ã‚‚ã†ä¸€ã¤å¼•æ•°ã‚’作ã£ã¦ã€æ–‡å—ã‚’è¿”ã™ã‚ˆã†ã«ã™ã‚‹ 今後ã€markã ã£ãŸã¨ãã«indexã«ç›´ã—ã¦ä½¿ãˆã‚‹ã‚ˆã†ã«ã™ã‚‹ """ ls = index.split(".") if n==1:ls[1]=str(int(ls[1])+1) else:ls[1]=str(int(ls[1])-1) next_index = ".".join(ls) return next_index def fn_change_parameter(self,ans = None): u"""入力ãŒã‚ã£ãŸå ´åˆã«è¾žæ›¸ã‚’上書ãã™ã‚‹ã€ã„ãšã‚Œå…¥åŠ›æž ã«å¤‰æ›´ãŒã‚ã£ãŸå ´åˆã«ä½œã‚Šç›´ã™ã€‘ key_eventãŒç™ºç”Ÿã—ãŸå¾Œã€ã“ã“ã«é£›ã¶ """ if ans == None: # ã„ãšã‚Œæ¶ˆã™ dic = self.get_text() for k,x in dic.iteritems(): self.parameter[k] = x else: start_index = self.fn_next_char(self.index(ans[1])) end_index = self.index(ans[2]) s = self.get(start_index,end_index) dic = self.fields_type # 辞書ã«å…¥ã‚Œã¦ã„る s2float,s2intã¯å¾Œã§è¡¨è¨˜<---ã“ã®è¾žæ›¸ã¯å¤–部ã§ä½œã‚‹ func = dic.get(ans[1][2:],None) format = self.fields_format.get(ans[1][2:],None) if func != None: # 値ãŒå…¥ã£ãŸã¨ã実数や整数ã«å¤‰æ›ã§ããªã‘ã‚Œã°èµ¤ã«ã€å¤‰æ›ã§ãã‚Œã°é’ã«ã—ã¦ã„ã‚‹ s = func(s,format) if s == None: self.tag_config(ans[1][2:], foreground="red" ,underline=1) else: self.tag_config(ans[1][2:], foreground="blue" ,underline=1) self.parameter[ans[1][2:]] = s def fn_fields_type(self,x): typ = type(x) if typ is types.DictType:return x elif typ is types.ListType: dic={} for y in x:dic[y]=None return dic def fn_make_scrollbar(self,master,**kw): """スクãƒãƒ¼ãƒ«ãƒãƒ¼ã®ä½œæˆã¨è¨å®š command :self.xview,self.yview :スクãƒãƒ¼ãƒ«ãƒãƒ¼ã®ç¨®é¡ž """ options = {"command":self.yview} sc = Tkinter.Scrollbar(master,options) sc.pack(side=Tkinter.RIGHT, fill=Tkinter.Y) kw["yscrollcommand"]=sc.set return kw def fn_make_popup_menu(self): u"""ãƒãƒƒãƒ—アップメニューã®ä½œæˆä¸""" self.menu_top = Tkinter.Menu(self,tearoff=False) # ã“ã®ã¸ã‚“変更ã—ã¦ã‚‹ã‚ˆ self.menu_2nd = Tkinter.Menu(self.menu_top,tearoff=0) self.menu_top.add_cascade (label=u'編集(E)', menu=self, underline=3) self.menu_top.add_separator() # self.menu_top.add_command(label=u'å…¨ã¦ã‚’é¸æŠž(A)', command=self.select_all, underline=6, accelerator = 'Ctrl-A') self.menu_top.add_command(label=u'切りå–ã‚Š(X)', command=self.cb_ctrl_x, underline=5, accelerator = 'Ctrl-X') self.menu_top.add_command(label=u'コピー(C)', command=self.cb_ctrl_c, underline=4, accelerator = 'Ctrl-C') self.menu_top.add_command(label=u'ペースト(V)', command=self.cb_ctrl_v, underline=5, accelerator = 'Ctrl-V') # self.menu_top.add_command(label=u'カーソルã®ã‚る行を削除', command=self.delete_line, accelerator = 'Shift-Del') def s2float(s,format,reverse=False): u"""æ–‡å—列sを実数ã«å¤‰æ›ã™ã‚‹     出æ¥ãªã„å ´åˆã¯Noneã‚’è¿”ã™ã€€ã€€ã€€ """ try: if reverse==False:return float(s) else:return str(s) except ValueError: return None def s2int(s,format,reverse=False): u"""æ–‡å—列sを実数ã«å¤‰æ›ã™ã‚‹     出æ¥ãªã„å ´åˆã¯Noneを返㙠""" try: if reverse==False:return int(s) else:return str(s) except ValueError: return None class S2xxx(): def __init__(self, **dic): self.dic = dic def check(self, x): ls = [True] for k, v in self.dic.iteritems(): a = getattr(self, k, None) if a != None: ls.append(a(x, v)) if all(ls): return x else: return None def check_fast(self, x): for k, v in self.dic.iteritems(): a = getattr(self, k, None) if (a != None) and (not a(x, v)):return None return x def ge(self, x, v):return x>=v # x.__ge__(v) # ex. "b":S2int(ge=1000) def gt(self, x, v):return x>v # x.__gt__(v) def le(self, x, v):return x<=v # x.__le__(v) def lt(self, x, v):return x<v # x.__lt__(v) def eq(self, x, v):return x==v # x.__eq__(v) def ne(self, x, v):return x!=v # x.__ne__(v) def xxx2s(self,format,s): lstype=self.dic.get("lstype",None) ls=format.split(")") ls[0]="%" format = "".join(ls) try: if lstype==None:return format % s else: s=map(lambda ss: format % ss, s) return ",".join(s) except ValueError:return None class S2float(S2xxx): def __call__(self,s,format="%s",reverse=False): lstype=self.dic.get("lstype",None) if reverse==False: try: if lstype==None: x = float(s) return self.check_fast(x) else: s=s.split(",") x=map(lambda ss: float(ss), s) return map(lambda xx: self.check_fast(xx), x) except ValueError:return None else:return self.xxx2s(format,s) class S2int(S2xxx): def __call__(self,s,format="%s",reverse=False): lstype=self.dic.get("lstype",None) if reverse==False: try: if lstype==None: x = int(s) return self.check_fast(x) else: s=s.split(",") x=map(lambda ss: int(ss), s) return map(lambda xx: self.check_fast(xx), x) except ValueError: return None else:return self.xxx2s(format,s) class Test(Tkinter.Frame): u"""ã€å‹•ä½œç¢ºèªç”¨ã€‘ Aãã‚“ã®èº«é•·%(a)scmã€Bãã‚“ã®èº«é•·%(b)scm [計算çµæžœ] Aãã‚“ã¨Bãã‚“ã®èº«é•·ã®å·®ï¼š%(difference)scm Aãã‚“ã¨Bãã‚“ã®èº«é•·ã®å·®ï¼š%(difference)scm Aãã‚“ã¨Bãã‚“ã®èº«é•·ã®å¹³å‡ï¼š%(mean)scm å…¥åŠ›æž ï¼ˆé’)ä¸ã®æ•°å€¤ã‚’変更ã—ã€å†è¨ˆç®—ボタンを押ã™ã¨ã€å‡ºåŠ›æž (緑)ã«åæ˜ ã•ã‚Œã¾ã™ã€‚ ----------------- ã€å…¥åŠ›æž ã¨å‡ºåŠ›æž ã®ä½œã‚Šæ–¹ã€‘ æ–‡ç« ä¸ã«ã€%%(key)sã¨æ›¸ã込むã¨ã€ãã®å ´æ‰€ã¯keyã¨ã„ã†åå‰ã®æž ã¨ãªã‚Šã¾ã™ã€‚ IOFieldsinTextを作æˆã™ã‚‹éš›ã®è¾žæ›¸(IFields_name)ã«keyを入れã¦ãŠãã¨ã€ãã®æž ã¯å…¥åŠ›æž ã¨ãªã‚Šã¾ã™ã€‚ 逆ã«ã€keyãŒè¾žæ›¸ã«ç™»éŒ²ã•ã‚Œã¦ã„ãªã„ã¨ã€å‡ºåŠ›æž ã¨ãªã‚Šã€å‡ºåŠ›æž ã¯è¤‡æ•°å€‹ä½œã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ----------------- ã€æ©Ÿèƒ½ç¢ºèªç”¨ã€‘ (1)parameterã¨ã„ã†è¾žæ›¸ã«å€¤ãŒå…¥ã£ã¦ã„ãªã„ã€ã¾ãŸã¯NoneãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€***ãŒå…¥ã‚Šã¾ã™ã€‚ ・Cãã‚“ã®èº«é•·%(c)scm (2)F_typeã¨ã„ã†è¾žæ›¸ã§Fieldsã®æ¡ä»¶ãŒè¨å®šã§ãã¾ã™ã€‚è¨å®šå¤–ã®å…¥åŠ›ãŒã•ã‚ŒãŸå ´åˆã€æ–‡å—ãŒèµ¤ããªã‚Šã¾ã™ã€‚ ・実数ã®ã¿è¨±å¯ï¼šDãã‚“ã®èº«é•·%(d)scm ・整数ã®ã¿è¨±å¯ï¼šEãã‚“ã®èº«é•·%(e)scm ・200cm以下ã®ç¯„囲ã®ã¿è¨±å¯ï¼šFãã‚“ã®èº«é•·%(f)scm (3)F_typeã¨ã„ã†è¾žæ›¸ã§ãƒªã‚¹ãƒˆã‚¿ã‚¤ãƒ—を許å¯ã™ã‚‹ã¨ã€Fields内ã«ãŠã„ã¦","ã§åŒºåˆ‡ã‚‹ã“ã¨ã§è¤‡æ•°ã®æ•°å€¤ã‚’入れるã“ã¨ãŒã§ãã¾ã™ã€‚ ・複数入力を許å¯ï¼šæ®‹ã‚Šã®äººãŸã¡ã®èº«é•·%(g)scm (4)テã‚ストä¸ã§Fieldã«ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã‚’指定ã™ã‚‹ã¨ã€ãã®ãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆã§è¡¨è¨˜ã•ã‚Œã¾ã™ ・Aãã‚“ã¨Bãã‚“ã®èº«é•·ã®å·®ã‚’8æ¡ã®æ•´æ•°è¡¨è¨˜ã«ã—ã¦ã€è¶³ã‚Šãªã„æ¡ã¯0ã§åŸ‹ã‚ã‚‹[%%(difference)08d]:%(difference)08dcm ・Aãã‚“ã¨Bãã‚“ã®èº«é•·ã®å¹³å‡ã‚’指数表記[%%(mean)e]:%(mean)ecm """ def __init__(self, master=None): u"""windowを作る """ ###値ã®è¨å®š### doc=self.__doc__ # ドã‚ュメントをå–り出㙠parameter = {"a":160,"b":170,"d":150.5,"e":150,"f":180,"g":[155,165,175]} IF_name=["a","b","c","d","e","f","g"] F_type={"c":s2float,"d":s2float,"e":S2int(),"f":S2float(le=200),"g":S2int(lstype=True)} ###windowã®ä½œæˆ### Tkinter.Frame.__init__(self, master) self.ft = ft = IOFieldsinText(self,doc,parameter ,IFields_name=IF_name,Fields_type=F_type, wrap=Tkinter.WORD, height=30, ) self.parameter = ft.get_dict() self.button=button=Tkinter.Button(self,text=u"å†è¨ˆç®—",command=self.recalculation) # å†è¨ˆç®—ボタン button.pack(side=Tkinter.BOTTOM) ft.pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=True) ###計算#### self.run() def run(self): u"""計算""" parameter = self.parameter a = int(parameter["a"]) b = int(parameter["b"]) parameter["difference"] = abs(a-b) parameter["mean"] = (a+b)/2 ###å‡ºåŠ›æž ã®è¡¨ç¤º#### # self.ft.write_IOFields() def recalculation(self): u"""å†è¨ˆç®—ボタンãŒæŠ¼ã•ã‚ŒãŸå ´åˆ""" self.run() if __name__ == '__main__': f = Test() f.pack(expand=1,fill=Tkinter.BOTH) f.mainloop()