#!/usr/bin/python # -*- coding: UTF-8 -*- # pytistics_ex01 : example program # 0.1.0 (17 Apr 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 ttk Tkinter=ttk.Tkinter import tkFont import numpy as np import scipy.stats as stats import matplotlib import matplotlib.pyplot as pyplot import matplotlib.patches as patches from matplotlib.figure import Figure from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg from matplotlib.widgets import Button from matplotlib.font_manager import FontProperties matplotlib.rcParams.update({'font.size': 10}) import sys import types import UserDict import random import copy #import IOFieldsinText as IOFT class Key_dict(UserDict.IterableUserDict): u"""IOFieldsinTextã®å…¥åŠ›æž ã®ä¸èº«ãŒå¤‰æ›´ã•れるã¨ã€ãƒªã‚¢ãƒ«ã‚¿ã‚¤ãƒ ã§ãã®è¾žæ›¸ãŒå¤‰æ›´ã•ã‚Œã€ è¨ˆç®—çµæžœã‚’辞書ã«å…¥ã‚Œã‚‹ã¨ã€å‡ºåŠ›æž ãŒè‡ªå‹•ã§å¤‰æ›´ã•れる辞書を作る __setitem__ :辞書ãŒå¤‰æ›´ã•れãŸå ´åˆã«å‘¼ã°ã‚Œã‚‹ã€‚ãŸã ã—ã€ä¸€éƒ¨å‘¼ã°ã‚Œãªã„å ´åˆãŒã‚ã‚‹ 辞書ã«ç™»éŒ²ã—ã€IOFieldsinText.write_IOFieldを呼ã³å‡ºã—ã¦keyã®å‡ºåŠ›æž ã‚’å¤‰æ›´ã™ã‚‹ __call__ :辞書ãŒé–¢æ•°ã¨ã—ã¦å‘¼ã°ã‚ŒãŸå ´åˆã«ã€IOFieldsinText.write_IOFieldを呼ã³å‡ºã—ã¦keyã®å‡ºåŠ›æž ã‚’å¤‰æ›´ã™ã‚‹ set_ft :辞書ã®è¨å®šã€‚IOFieldsinTextã¨data(辞書)をインスタンス変数ã¨ã—ã¦ä¿æŒã™ã‚‹ """ def __setitem__(self, key, value): self.data[key] = value self.IOFText.write_IOField(key) def __call__(self, *keys): for key in keys: self.IOFText.write_IOField(key) def set_ft(self, IOFText, data): self.IOFText=IOFText self.data=data class IOFieldsinText(Tkinter.Text): def __init__(self,master,text="",IOFText_dict=None,IFields_name=None,Fields_type=None,**kw): ###値ã®è¨å®š### self.text = text # text:Tkinter.Textã«è¡¨ç¤ºã™ã‚‹ãƒ†ã‚スト(ãŸã ã—ã€ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹å¤‰æ•°ã¨ã—ã¦ã¯æœªä½¿ç”¨ï¼‰ if IOFText_dict==None:IOFText_dict={} # IOFText_dict:IOFieldsinText用ã®è¾žæ›¸ã€‚å…¥å‡ºåŠ›æž ã®ãƒ‡ãƒ¼ã‚¿ã‚’ä¿æŒã—ã¦ã„ã‚‹{key:value} self.IOFText_dict=IOFText_dict if IFields_name==None:IFields_name=[] # IFields_nameï¼šå…¥åŠ›æž ã®keyãŒå…¥ã£ãŸãƒªã‚¹ãƒˆ self.ifields_ls = IFields_name if Fields_type==None:Fields_type={} # Fields_typeï¼šå…¥å‡ºåŠ›æž ã®è¨å®šãŒå…¥ã£ãŸè¾žæ›¸{key:S2xxx} self.fields_type = self.fn_fields_type(Fields_type) self.fields_format = {} # fields_formatï¼šå…¥å‡ºåŠ›æž ã®ãƒ•ォーマット(%(key)s)ãŒå…¥ã£ãŸè¾žæ›¸{key:format} self.fields_format2 = {} # fields_format2:fields_formatã®äºˆå‚™ï¼ˆæœªä½¿ç”¨ï¼‰ self.fields_out = {} # fields_out:keyã”ã¨ã®å‡ºåŠ›æž ã®é€šã—番å·ã®æœ€çµ‚値を登録ã—ãŸè¾žæ›¸ï¼ˆå‡ºåŠ›æž ã¯è¤‡æ•°å€‹ã«ãªã‚‹å ´åˆãŒã‚ã‚‹ãŸã‚) self.default_str = "***" # default_strï¼šå‡ºåŠ›æž ã¸ã®å€¤ãŒæ£ã—ããªã‹ã£ãŸå ´åˆã«è¡¨ç¤ºã™ã‚‹æ–‡å—列 ###Textã®ä½œæˆ### kw = self.fn_make_scrollbar(master,kw) Tkinter.Text.__init__(self, master, **kw) ###åˆæœŸåŒ–用関数### self.fn_set_text(text) # IOFieldsinTextã®ãƒ†ã‚ストを表示ã™ã‚‹ self.fn_convert_to_fields() # テã‚ストã®ãƒ•ォーマット化(%(key)s)ã•れãŸéƒ¨åˆ†ã‚’å‡ºåŠ›æž ã«å¤‰æ›ã™ã‚‹ self.fn_make_Popup_menu() # ãƒãƒƒãƒ—アップメニュー(self.menu_top)ã®è¨å®šã€è¿½åŠ ç”¨ ###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 fn_make_scrollbar(self,master,kw): """スクãƒãƒ¼ãƒ«ãƒãƒ¼ã®ä½œæˆã¨è¨å®š""" 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_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') # menu_2nd = Tkinter.Menu(self.menu_top,tearoff=0) # サブメニューを出ã™å ´åˆã®ä¾‹ # self.menu_top.add_cascade (label=u'編集(E)', menu=menu_2nd, underline=3) # self.menu_top.add_separator() def fn_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") def fn_convert_to_fields(self): u"""テã‚ストã®ãƒ•ォーマット化(%(key)s)ã•れãŸéƒ¨åˆ†ã‚’å‡ºåŠ›æž ã«å¤‰æ›ã™ã‚‹ ï¼ˆè¦šãˆæ›¸ã) Tkinter.Text.mark_set(name, index) name:markã®åå‰ï¼ˆæ–‡å—列)ã€index:マークを挿入ã™ã‚‹å ´æ‰€ å‰ã®æ–‡å—を増やã—ãŸã‚Šã€æ¶ˆã™ã¨ã€ãƒžãƒ¼ã‚¯ã‚‚一緒ã«å‹•ã マークã®å ´æ‰€ã®æ–‡å—を消ã™ã¨ã€ãã“ã«ãšã‚Œã¦å…¥ã£ã¦ããŸæ–‡å—ã«ãƒžãƒ¼ã‚¯ãŒç§»ã‚‹ mark_ls' : [['name','index'],...] """ index2 = "0.0" while True: parameter = self.IOFText_dict try: index1 = self.search("%",index2) if index1=="":break except:break 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: try: index3 = self.search(")",index1) index2 = self.search("[diouxXeEfFgGcrs]",index3,regexp=True) if (index3=="")or(index2==""):break except:break 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) 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) index2=self.index(mark2) self.write_IOFields() # Fieldを書ãç›´ã—ã¦ã„ã‚‹ ################################## ###  外部ã‹ã‚‰ä½¿ã‚れる関数  ### ################################## def changeO2IFields(self,key,fields_type=None): u"""å‡ºåŠ›æž ã‚’å…¥åŠ›æž ã«å¤‰ãˆã‚‹ """ typ = type(key) if typ is types.ListType:key_ls=key else:key_ls=[key] if fields_type==None:fields_type={} typ = type(fields_type) if typ is types.DictType:pass else:fields_type={key:fields_type} for key in key_ls: ###å‡ºåŠ›æž ã«ã¤ã‘ãŸãƒžãƒ¼ã‚¯ã‹ã‚‰indexã‚’å–り出ã™### num = self.fields_out[key] if num!=1:pass # keyã«å¯¾ã—ã¦å‡ºåŠ›æž ãŒè¤‡æ•°å€‹å˜åœ¨ã™ã‚‹ -> エラーã‹ä½•ã‹ãŒå‡ºã‚‹ã‚ˆã†ã«ã™ã‚‹(ç¾åœ¨ã¯1ã¤ç›®ã®å‡ºåŠ›æž ã®ã¿å…¥åŠ›æž ã«ã—ã¦ã„ã‚‹) ã€å•題】 mark1 = "out_%s_%s" % (key,0) mark2 = "out_%s_%se" % (key,0) index1 = self.index(mark1) index2 = self.index(mark2) ###å…¥åŠ›æž ã«ãƒžãƒ¼ã‚¯ã‚’ã¤ã‘ã‚‹### mark1i = "s_%s" % key mark2i = "e_%s" % key self.mark_set(mark1i,index1) self.mark_set(mark2i,index2) ###keyã‚’å…¥åŠ›æž ã®ãƒªã‚¹ãƒˆã«ç™»éŒ²ã™ã‚‹### self.ifields_ls.append(key) ###fields_typeãŒæŒ‡å®šã•れã¦ã„ãŸå ´åˆã€è¾žæ›¸ã«ç™»éŒ²ã™ã‚‹### f_type = fields_type.get(key,None) if f_type!=None: self.fields_type[key]=f_type def write_IOField(self,key): u"""辞書ã«ç™»éŒ²ã—ã¦ã„ã‚‹keyã®å€¤ã‚’IOFieldsinTextã«åæ˜ ã™ã‚‹""" ###OFieldsã®æ•°ã®ç¢ºèª### try:n_max = self.fields_out[key] except KeyError:return ###self.IOFText_dictã®ä¸ã«ã‚ã‚‹ã‹ã®ç¢ºèª### parameter = self.IOFText_dict 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"""辞書ã®å€¤ã‚’å…¨ã¦IOFieldsinTextã«åæ˜ ã™ã‚‹ self.fields_outï¼šå‡ºåŠ›æž ã®åå‰ã‚’keyã¨ã—ã¦ãã®æž ã®æ•°ãŒå…¥ã£ãŸè¾žæ›¸ """ for key in self.fields_out: self.write_IOField(key) def get_popup_menu(self): u"""ãƒãƒƒãƒ—アップメニューã®ä½œæˆ""" return self.menu_top def get_dict(self): key_dict = Key_dict() key_dict.set_ft(self, self.IOFText_dict) return key_dict ########################### ### callback関数 ### ########################### 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 ########################### ### utility関数 ###(他ã®é–¢æ•°ã‹ã‚‰äºŒæ¬¡çš„ã«å‘¼ã°ã‚Œã‚‹ï¼‰ ########################### 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 fn_make_markname_for_OField(self,key): u"""å‡ºåŠ›æž ã®ãƒžãƒ¼ã‚¯ã‚’通ã—番å·ã«ã™ã‚‹ """ 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ãŒç™ºç”Ÿã—ãŸå¾Œã€ã“ã“ã«é£›ã¶ """ 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.IOFText_dict[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 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(): func=str def __init__(self, **dic): self.dic = dic lstype=self.dic.get("lstype",None) if lstype=="tplinls":self.__call__=self.call_tplinls elif lstype==True:self.__call__=self.call_list 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 __call__(self,s,format="%s",reverse=False): if reverse==False: try: x = self.func(s) return self.check_fast(x) except ValueError:return None else: format = self.key_delete_in_format(format) try:return format % s except ValueError:return None def call_list(self,s,format="%s",reverse=False): if reverse==False: s=s.split(",") try: x=map(lambda ss: self.func(ss), s) return map(lambda xx: self.check_fast(xx), x) except ValueError:return None else: format = self.key_delete_in_format(format) try: s=map(lambda ss: format % ss, s) return ",".join(s) except ValueError:return None def call_tplinls(self,s,format="%s",reverse=False): if reverse==False: s1=s.split(",") s3=map(lambda s2: tuple(s2.split(":")), s1) try: x1=map(lambda s4: map(lambda s5: self.func(s5), s4), s3) return map(lambda x2: map(lambda x3: self.check_fast(x3), x2), x1) except ValueError:return None else: format = self.key_delete_in_format(format) try: s=map(lambda s1: map(lambda s2: format % s2, s1), s) s=map(lambda s1: ":".join(s1), s) return ",".join(s) except ValueError:return None 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 key_delete_in_format(self,format): ls=format.split(")") ls[0]="%" format = "".join(ls) return format class S2float(S2xxx): func=float class S2int(S2xxx): func=int #import pytistics_base class StatsNotebook(ttk.Notebook): def __init__(self,master=None,common_dict=None,title=""): u"""外å´ã®Notebookã®ä½œæˆã¨ã€å…±é€šã®è¾žæ›¸ã®ä½œæˆ statsnotepages :å„StatsNotepage(å„ページ)ãŒå…¥ã£ãŸãƒªã‚¹ãƒˆ common_dict :å„ページã§å…±é€šã®è¦ç´ を入れる辞書 common_dict["count"] :1ページ目ã®å¤‰æ›´å›žæ•° """ ###共通ã®è¾žæ›¸ã®ä½œæˆ### if common_dict==None:common_dict={} self.common_dict=common_dict if "count" not in self.common_dict:self.common_dict["count"]=0 ###ttk.Notebookã®ä½œæˆ### ttk.Notebook.__init__(self,master,width=640, height=600) if title!="":self.master.title(title) self.pack(side=Tkinter.TOP,fill=Tkinter.BOTH,expand=1) self.bind("<<NotebookTabChanged>>",self.cb_TabChanged) self.statsnotepages=[] ###フォントã®è¨å®š### if sys.platform == 'win32': fontproperties = FontProperties(fname=r'C:\WINDOWS\Fonts\MSGOTHIC.TTC') # HG 明æœç³» else: fontproperties = FontProperties(fname=r'/usr/share/fonts/truetype/sazanami/sazanami-mincho.ttf') # HG 明æœç³» self.common_dict["fontproperties"]=fontproperties self.common_dict["font"]=tkFont.Font(family="Courier", size=9) def cb_TabChanged(self,event): u"""タブãŒåˆ‡ã‚Šæ›¿ãˆã‚‰ã‚ŒãŸå ´åˆã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯""" index=self.index("current") self.statsnotepages[index].cb_TabChanged(event) def fn_make_Page(self,name,statsnotepage): u"""StatsNotepageã‚’ã“ã®Notebookã«ä½œã‚‹""" self.add(statsnotepage, text=name, padding=1) self.statsnotepages.append(statsnotepage) def main(self): self.mainloop() class StatsNotepage(Tkinter.Frame): def __init__(self,master=None,name="",local_dict=None): u"""内å´ã®Notebookã®ä½œæˆã¨ã€ã“ã®ãƒšãƒ¼ã‚¸ç‹¬è‡ªã®è¾žæ›¸ã®ä½œæˆ """ Tkinter.Frame.__init__(self,master) master.fn_make_Page(name,self) ###共通データ### self.common_dict=getattr(master,"common_dict",{"count":0}) ###個々ã®ãƒ‡ãƒ¼ã‚¿### if local_dict==None:local_dict={} self.local_dict=local_dict if "count" not in self.local_dict:self.local_dict["count"]=-1 self.local_dict["name"]=name # ページã®åå‰ self.figure_dict={} # 図ã®è¾žæ›¸ self.canvas_dict = {} # ã‚ャンãƒã‚¹ã®è¾žæ›¸ï¼ˆã‚°ãƒ©ãƒ•関係) ###IOFieldsinText用ã®è¾žæ›¸### self.IOFields_dict={} ###Widgetã®ä½œæˆ### self.fn_make_Widget() self.fn_make_Popup_menu() ###å„ページ毎ã®è¨å®š### self.init_IOFields() def fn_make_Widget(self): u"""Widgetã®ä½œæˆ figure用ã®Notebookã¨ã€ãƒœã‚¿ãƒ³ã€IOFeildsinTextã®ä½œæˆ """ ###PanedWindow(ページ全体ã«å…¥ã‚Œã‚‹ï¼‰### pane=ttk.PanedWindow(self,orient=Tkinter.VERTICAL) # "orient"ä¸¦ã¹æ–¹ï¼šVERTICAL:垂直ã€HORIZONTAL:平行 pane.pack(side=Tkinter.TOP,fill=Tkinter.BOTH,expand=1,padx=0,pady=0) ###notebook(å„ページã«å…¥ã‚Œã‚‹å›³ã®ãŸã‚ã®Notebook)### notebook=ttk.Notebook(pane,height=400) pane.add(notebook) ###sub_frame(ボタンã€IOFieldinTextã‚’ã¾ã¨ã‚ã¦ã„る)### sub_frame=Tkinter.Frame(pane) pane.add(sub_frame) ###buttonã®è¨å®š### button_frame=Tkinter.Frame(sub_frame,height=1) # 真んä¸ã®ãƒœã‚¿ãƒ³ãŒå…¥ã‚‹ãƒ•レームbutton_frame.pack(side=Tkinter.TOP,fill=Tkinter.X,expand=0,padx=0,pady=0) ###IOFieldsinTextã®è¨å®š### text_frame=Tkinter.Frame(sub_frame) text_frame.pack(side=Tkinter.TOP,fill=Tkinter.BOTH,expand=1,padx=0,pady=0) doc=self.__doc__ # ドã‚ュメントストリング ftext=IOFieldsinText(text_frame,doc,self.IOFields_dict , wrap=Tkinter.WORD, height=10 ) ftext.pack(side=Tkinter.TOP,fill=Tkinter.BOTH,expand=1,padx=0,pady=0) ###### self.notebook=notebook self.fn_set_buttons(button_frame) self.FText=ftext self.IOFields_dict = ftext.get_dict() ###フォントã®è¨å®š### self.local_dict["fontproperties"]=self.common_dict["fontproperties"] self.local_dict["font"]=self.common_dict["font"] def init_IOFields(self): u"""継承先ã§è¨å®š""" pass def recalc(self): u"""継承先ã§è¨å®š""" pass def cb_TabChanged(self,event=None): u"""タブãŒé¸æŠžã•れãŸå ´åˆã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ StatsNotebook.cb_TabChangedã‹ã‚‰å‘¼ã°ã‚Œã‚‹ """ count = self.common_dict["count"] mycount = self.local_dict["count"] if mycount < count: self.calculate() self.draw_figure() self.local_dict["count"] = count def common_dict_update(self): count = self.common_dict["count"] self.common_dict["count"] = self.local_dict["count"] = count+1 def get_text(self): u"""IOFieldsinTextã‹ã‚‰æ–‡å—列å–å¾—""" return self.FText.get('1.0',Tkinter.END) def add_text(self,x): u"IOFieldsinTextã®æ–‡ç« ã‚’å…¨ã¦å‰Šé™¤" self.FText.delete('1.0', Tkinter.END) def clear_text(self,x): u"IOFieldsinTextã®æœ€å¾Œã®ä½ç½®ã¸æ–‡å—列入力" self.FText.insert(Tkinter.END,x) def set_text(self,text): u"""IOFieldsinTextã¸æ–‡å—列入力。ãŸã ã—ã€è¡¨ç¤ºã•れã¦ã„ã‚‹æ–‡å—列を全ã¦å‰Šé™¤ã—ã¦ã‹ã‚‰""" self.clear_text(text) self.add_text(text) def get_ax(self,name,pos=""): if (name,"ax") in self.figure_dict:ax = self.figure_dict[(name,"ax")] else: fig = self.figure_dict[(name,"fig")] ax=fig.add_subplot(*pos) ax.grid(True) self.figure_dict[(name,"ax")] = ax return ax def fn_make_Popup_menu(self): u"""å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã®ä½œæˆ "cb_popup_"ã‚’åå‰ã«å«ã‚€é–¢æ•°ã¯ã€å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã«ãªã‚‹ """ ls1 = [] for i in dir(self): if i.find("cb_popup_")==0: # Cbã§å§‹ã¾ã£ã¦ã„ã‚‹ã‚‚ã®ï¼ˆé–¢æ•°ã«é™å®šã—ãŸæ–¹ãŒè‰¯ã„) f=getattr(self,i) # 関数オブジェクトをå–å¾—ã—,押ã•ã‚ŒãŸæ™‚ã®å®Ÿè¡Œé–¢æ•°ã¨ã™ã‚‹ ss=f.__doc__ # 関数ã®ãƒ‰ã‚ュメント ss=ss.split("\n") # 改行ã§åˆ†å‰²ã—ã€ãƒªã‚¹ãƒˆã« ss=[ii.strip("\t") for ii in ss] # 両å´ã‚¿ãƒ–ã¯é™¤åŽ»ã—㦠pos=ss[0].split(",") # 1行目ã¯é †ç•ªï¼šã‚«ãƒ³ãƒžã§åˆ†å‰²ã—〠pos=[int(ii)for ii in pos] # æ•´æ•°ã«ã—㦠label = ss[1] ls1.append((label,f,pos)) ls1.sort() ###å³ã‚¯ãƒªãƒƒã‚¯ãƒ¡ãƒ‹ãƒ¥ãƒ¼ä½œæˆ### menu=self.FText.get_popup_menu() for (label,f,pos) in ls1: menu.add_command(label=label ,command=f ) ###サブメニュー拡張用### # sub_menu=Tkinter.Menu(menu, tearoff=0) # sub_menu.add_command(label=u"書ãè¾¼ã¿" ,command=self.cb_Store_text) # menu.add_cascade(label="Option", menu=sub_menu) def fn_get_fig_pos(self,f): ss=f.__doc__ # 関数ã®ãƒ‰ã‚ュメント ss=ss.split("\n") # 改行ã§åˆ†å‰²ã—ã€ãƒªã‚¹ãƒˆã« ss=[ii.strip("\t") for ii in ss] # 両å´ã‚¿ãƒ–ã¯é™¤åŽ»ã—㦠ss=[ii.strip(" ") for ii in ss] # 空白文å—ã¯é™¤åŽ»ã—㦠pos=ss[0].split(",") # 1行目ã¯ãƒœã‚¿ãƒ³åº§æ¨™ï¼šã‚«ãƒ³ãƒžã§åˆ†å‰²ã—〠pos=[int(ii)for ii in pos] # æ•´æ•°ã«ã—㦠pos[2]=pos[1]*pos[2]+pos[3]+1 # ç¸¦åˆ†å‰²æ•°ã€æ¨ªåˆ†å‰²æ•°ã€ç¸¦åº§æ¨™ã€æ¨ªåº§æ¨™ã¨ã—ã¦è¨ˆç®—ã—㦠pos=tuple(pos[:3]) # (ç¸¦åˆ†å‰²æ•°ã€æ¨ªåˆ†å‰²æ•°ã€ç•ªåœ°) を計算ã™ã‚‹ return pos def draw_figure(self): u"""グラフã®ä½œæˆã€‚軸ã¯ä½œã‚‰ãªã„ "Fig"ã‚’åå‰ã«å«ã‚€é–¢æ•°ã¯ã€ã‚°ãƒ©ãƒ•ã«ãªã‚‹ã€‚(例)Fig2_1 クラスã‹ã‚‰æŽ¢ã—ã€ãƒ‰ã‚ュメントをå–り出ã™ã€‚ドã‚ュメントã¯è»¸ã®æƒ…å ±ã‚’æŒã¡ã€ï¼‘行目ã¯è»¸ã®åº§æ¨™ã€ï¼’行目ã¯"ãªã—"ã¨ãªã‚‹ã€‚ 関数åã®"_"ã®å‰ã¯ã‚°ãƒ©ãƒ•ã®åå‰ã¨ãªã‚Šã€sub_draw_figureã«æ¸¡ã—ã¦ã€ã‚°ãƒ©ãƒ•を作る 関数を呼ã³å‡ºã—ã€æƒ…å ±ã‚’æ¸¡ã™ã¨ã€ãã“ã§è»¸ã‚„ç·šãŒä½œã‚‰ã‚Œã‚‹ã€‚ """ ls1 = [] for i in dir(self): if i.find("Fig")==0: # Figã§å§‹ã¾ã£ã¦ã„ã‚‹ã‚‚ã®ï¼ˆé–¢æ•°ã«é™å®šã—ãŸæ–¹ãŒè‰¯ã„) f=getattr(self,i) # 関数オブジェクトをå–å¾—ã—,押ã•ã‚ŒãŸæ™‚ã®å®Ÿè¡Œé–¢æ•°ã¨ã™ã‚‹ pos = self.fn_get_fig_pos(f) tab_name = i.split("_")[0] # "_" ã®å‰ã¯ã‚¿ãƒ–ラベルã€å¾Œã¯è»¸ã®ç•ªå· ###グラフã®ä½œè£½### if tab_name in self.figure_dict: fig = self.figure_dict[tab_name] else: frame=Tkinter.Frame(self.notebook) self.notebook.add(frame, text=tab_name, padding=1) fig=Figure(figsize=(6,4), dpi=80) fig.set_facecolor('w') if title:fig.suptitle(title) canvas = FigureCanvasTkAgg(fig, master=frame) toolbar=NavigationToolbar2TkAgg( canvas, frame ) canvas.get_tk_widget().pack(side=Tkinter.TOP, fill=Tkinter.BOTH, expand=1,padx=1,pady=1) #toolbar.update() ###グラフã®ç™»éŒ²### self.canvas_dict[tab_name] = canvas self.figure_dict[tab_name]=fig self.figure_dict[(i,"fig")] = fig self.figure_dict[(i,"tab_name")] = tab_name ls1.append((i,f,pos,tab_name)) # ls1.sort() ###関数呼ã³å‡ºã—(軸を作るç‰ï¼‰### for (i,f,pos,tab_name) in ls1: f(i,pos) self.canvas_dict[tab_name].draw_idle() def fn_set_buttons(self,buttonframe): u"""ボタンã®ä½œæˆã€‚ "bt_"ã‚’åå‰ã«å«ã‚€é–¢æ•°ã¯ã€ãƒœã‚¿ãƒ³ã«ãªã‚‹ã€‚クラスã‹ã‚‰æŽ¢ã—ã€ãƒ‰ã‚ュメントをå–り出ã™ã€‚ """ for i in dir(self): if i.find("bt_")==0: # bt_ã§å§‹ã¾ã£ã¦ã„ã‚‹ã‚‚ã®ï¼ˆé–¢æ•°ã«é™å®šã—ãŸæ–¹ãŒè‰¯ã„)をå–り出㙠f=getattr(self,i) # 関数オブジェクトをå–å¾—ã—,押ã•ã‚ŒãŸæ™‚ã®å®Ÿè¡Œé–¢æ•°ã¨ã™ã‚‹ ss=f.__doc__ # 関数ã®ãƒ‰ã‚ュメント ss=ss.split("\n") # 改行ã§åˆ†å‰²ã—ã€ãƒªã‚¹ãƒˆã« bt_name=ss[0].strip("\t") # 両å´ã‚¿ãƒ–ã¯é™¤åŽ»ã—㦠bt_name=bt_name.strip(" ") # 空白文å—ã¯é™¤åŽ»ã—㦠button = Tkinter.Button(buttonframe,text=bt_name,command=f) button.pack(side=Tkinter.LEFT) class StatsPage01(StatsNotepage): u"""ã“ã®ãƒ—ãƒã‚°ãƒ©ãƒ ã¯ã€ç·´ç¿’å•題ã¨è§£ç”ã¨ã„ã†å½¢å¼ã‚’利用ã—ã¦ã€çµ±è¨ˆã«ã¤ã„ã¦ã®å‡¦ç†ã‚’行ã„ã¾ã™ã€‚ æ–‡å—ãŒé’色ã«ãªã£ã¦ã„る箇所ã¯å…¥åŠ›æž ã§ã€ç·‘色ã®å‡ºåŠ›æž ã«è¨ˆç®—çµæžœãŒè¡¨ç¤ºã•れã¾ã™ã€‚ å…¥åŠ›æž ã‚’æ›¸ãæ›ãˆã€å†è¨ˆç®—ボタンを押ã™ã¨ã€å‡ºåŠ›æž ã«åæ˜ ã•れã€ã‚°ãƒ©ãƒ•ãŒå†æç”»ã•れã¾ã™ã€‚ ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€åº¦æ•°å›³ã‚’作æˆã‚’目的ã¨ã—ãŸå‡¦ç†ã‚’行ã„ã¾ã™ã€‚ ã€å•題】 1å·æ©Ÿã¨2å·æ©Ÿã§åŒä¸€è£½å“ã‚’åŠ å·¥ã—ã¦ã„る。ã“れらã®è£½å“ã¯æ©Ÿæ¢°åˆ¥ã«åˆ†ã‘られã¦ã€ãれãžã‚Œã®ç®±ã«å…¥ã‚Œã‚‰ã‚Œã‚‹ã€‚ å„ç®±ã®ä¸ã‹ã‚‰å„100個ãšã¤æŠœãå–ã£ã¦æ¤œæŸ»ã—ãŸçµæžœã¯æ¬¡ã®é€šã‚Šã§ã‚ã£ãŸã€‚ (1)No.é †ã«ã‚°ãƒ©ãƒ•ã«è¡¨ã› (2)全体ã®åº¦æ•°å›³ã‚’æã‘ (3)1å·æ©Ÿã€2å·æ©Ÿã®ãれãžã‚Œã®åº¦æ•°å›³ã‚’æã‘ データ ※機械ã®ç¨®é¡žï¼ˆ1å·æ©Ÿor2å·æ©Ÿï¼‰ã¨ã€ä¸è‰¯å€‹æ•°ã‚’1組ã¨ã—ã¦50箱分ã®ãƒ‡ãƒ¼ã‚¿ã‚’示ã—ã¦ã„ã‚‹  機械ã®ç¨®é¡žã¨ä¸è‰¯å€‹æ•°ã‚’":"ã§åŒºåˆ‡ã‚Šã€ãれãžã‚Œã®ç®±ã”ã¨ã«","ã§åŒºåˆ‡ã£ã¦ã„ã‚‹ ※機械ã®ç¨®é¡žã¯å¿…ãšã—も交互ã§ã¯ãªã„ %(data1)s ã€è§£ç”】 (1)Fig.1ã«No.é †ã®ã‚°ãƒ©ãƒ•を示㙠 横軸ãŒNo.ã€ç¸¦è»¸ãŒä¸è‰¯å€‹æ•°ã¨ãªã£ã¦ã„る。 (2)Fig.2ã«å…¨ä½“ã®åº¦æ•°å›³ã‚’示㙠 機械ã®ç¨®é¡žã«é–¢ä¿‚ãªãã€ã™ã¹ã¦ã®ç®±ã®ä¸è‰¯å€‹æ•°ã®åº¦æ•°å›³ã¨ãªã£ã¦ã„る。 (3)Fig.3ã«1å·æ©Ÿã€Fig.4ã«2å·æ©Ÿã®åº¦æ•°å›³ã‚’ãれãžã‚Œç¤ºã™  """ def init_IOFields(self): u"""ã“ã®ãƒšãƒ¼ã‚¸ç‹¬è‡ªã®åˆæœŸè¨å®š """ ###FieldsTextã®è¨å®š### IFields_name=["data1"] Fields_type={"data1":S2int(lstype="tplinls")} self.FText.changeO2IFields(IFields_name,Fields_type) ###計算用ã®è¨å®š### dic=self.IOFields_dict dic["bo_mu"]=bo_mu=3 dic["bo_sigma"]=bo_sigma=5 dic["bo_num"]=bo_num=50 dic["bo_data"] = data = np.random.randint(0, 8, bo_num) machine_ls=[1,2] ls = [] for i in range(bo_num): machine=random.choice(machine_ls) ls.append((machine,data[i])) self.IOFields_dict["data1"]=ls def bt_1_recalc(self,random=False): u"""å†è¨ˆç®— 入力ã•れãŸãƒ‡ãƒ¼ã‚¿ã®å€¤ã‚’使ã£ã¦å†è¨ˆç®—ã—ã€ã‚°ãƒ©ãƒ•を書ãç›´ã™ """ self.calculate() self.draw_figure() def calculate(self,random=False): u"""ãƒ‡ãƒ¼ã‚¿ã‚’åˆæœŸåŒ–ã™ã‚‹ã€‚ãŸã ã—ã€ãƒ†ã‚ストä¸ã®å®šæ•°ã¯ã•れãªã„。ã¾ãŸã€å¤‰æ›´ãŒã‚れã°ã€åæ˜ ã•れる。 ã€å¹³å‡ã‚„標準å差をテã‚ストã¨ã—ã¦æŒã£ã¦ã„ã‚‹ã®ã‚’実数ã«å¤‰ãˆã¦ã„る。->実数ã«å¤‰ãˆã‚Œãªã„ã‚‚ã®ãŒã‚ã£ãŸã¨ãã€ãªã«ã‹è¡¨ç¤ºã•ã›ã‚‹ã‚ˆã†ã«ã™ã‚‹ã€‘ parameter : å¿…è¦ãªå®šæ•°ãŒå…¥ã£ãŸè¾žæ›¸ """ dic = self.IOFields_dict ls2 = dic["hist_all"]=[] ls3 = dic["hist_1"]=[] ls4 = dic["hist_2"]=[] num=0 ls = dic.get("data1",None) for tpl in ls: ls2.append(tpl[1]) if tpl[0]==1:ls3.append(tpl[1]) else:ls4.append(tpl[1]) num=num+1 dic["num"]=num def sub_fig(self,ax,ls): num_ls=[0,0,0,0,0,0,0,0,0,0,0] for x in ls: num_ls[x]=num_ls[x]+1 x = np.arange(11) y = tuple(num_ls) bars = ax.bar(x, y, width=1, color='g', alpha=0.3) ax.set_xticks(x + 0.5) # x軸ã®ãƒ©ãƒ™ãƒ«ã‚’棒グラフã®ä¸å¿ƒã«ãŠã ax.set_xticklabels(("0","1","2","3","4","5","6","7","8","9","10")) # x軸ã®ãƒ©ãƒ™ãƒ«ã‚’変ãˆã‚‹ for bar in bars: height = bar.get_height() ax.text(bar.get_x()+bar.get_width()/2., 1.05*height, '%d'%int(height),ha='center', va='bottom') num_ls.sort() ax.set_ylim(0,num_ls[-1]+1) def Fig1_1(self,name,pos="",dic=None): # 自分ã®é–¢æ•°åã€axisã®ä½ç½®ï¼ˆãƒã‚¸ã‚·ãƒ§ãƒ³ï¼‰ u"""1,1,0,0 No.é †ã«ã‚°ãƒ©ãƒ•ã«è¡¨ã™ 横軸ãŒNo.ã€ç¸¦è»¸ãŒä¸è‰¯å€‹æ•° """ ###軸ã®ä½œè£½ãƒ»å–å¾—### ax = self.get_ax(name,pos) ax.clear() ax.set_autoscalex_on(True) ###グラフ### dic = self.IOFields_dict x = np.arange(dic["num"]) y = tuple(dic["hist_all"]) ax.bar(x, y, width=1, color='g', alpha=0.3) def Fig2_1(self,name,pos="",dic=None): # 自分ã®é–¢æ•°åã€axisã®ä½ç½®ï¼ˆãƒã‚¸ã‚·ãƒ§ãƒ³ï¼‰ u"""1,1,0,0 全体ã®åº¦æ•°å›³ """ ###軸ã®ä½œè£½ãƒ»å–å¾—### ax = self.get_ax(name,pos) ax.clear() ax.set_autoscalex_on(True) ###度数図### dic = self.IOFields_dict ls = dic["hist_all"] self.sub_fig(ax,ls) def Fig3_1(self,name,pos="",dic=None): # 自分ã®é–¢æ•°åã€axisã®ä½ç½®ï¼ˆãƒã‚¸ã‚·ãƒ§ãƒ³ï¼‰ u"""1,1,0,0 1å·æ©Ÿã®åº¦æ•°å›³ """ ###軸ã®ä½œè£½ãƒ»å–å¾—### ax = self.get_ax(name,pos) ax.clear() ax.set_autoscalex_on(True) ###度数図### dic = self.IOFields_dict ls = dic["hist_1"] self.sub_fig(ax,ls) def Fig4_1(self,name,pos="",dic=None): # 自分ã®é–¢æ•°åã€axisã®ä½ç½®ï¼ˆãƒã‚¸ã‚·ãƒ§ãƒ³ï¼‰ u"""1,1,0,0 2å·æ©Ÿã®åº¦æ•°å›³ """ ###軸ã®ä½œè£½ãƒ»å–å¾—### ax = self.get_ax(name,pos) ax.clear() ax.set_autoscalex_on(True) ###度数図### dic = self.IOFields_dict ls = dic["hist_2"] self.sub_fig(ax,ls) class StatsPage02(StatsNotepage): u"""ã“ã®ãƒšãƒ¼ã‚¸ã¯ã€ãƒ‘レード図ã®ä½œæˆã‚’目的ã¨ã—ãŸå‡¦ç†ã‚’行ã„ã¾ã™ã€‚ ã€å•題】 å“質管ç†ã‚»ãƒŸãƒŠãƒ¼æ•™å®¤ã®å‚åŠ è€…%(num)s人をæ¥ç¨®åˆ¥ã«åˆ†é¡žã—ãŸã¨ã“ã‚æ¬¡ã®ã‚ˆã†ã«ãªã£ãŸã€‚ ã“ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã‚‚ã¨ã«ã—ã¦ãƒ‘レード図を作æˆã›ã‚ˆã€‚ %(01_key)s%(01_value)s人ã€%(02_key)s%(02_value)s人ã€%(03_key)s%(03_value)s人ã€%(04_key)s%(04_value)s人〠%(05_key)s%(05_value)s人ã€%(06_key)s%(06_value)s人ã€%(07_key)s%(07_value)s人ã€%(08_key)s%(08_value)s人〠%(09_key)s%(09_value)s人ã€%(10_key)s%(10_value)s人ã€%(11_key)s%(11_value)s人ã€%(12_key)s%(12_value)s人〠%(13_key)s%(13_value)s人ã€%(14_key)s%(14_value)s人ã€%(15_key)s%(15_value)s人 ã€è§£ç”】 Fig.1ã«ãƒ‘レード図を示ã™ã€‚  """ def init_IOFields(self): u"""タブãŒé¸æŠžã•れãŸã¨ãã«å‘¼ã³ã ã•れる。 """ ###ãã®ä»–ã®è¨å®š### IFields_name=["01_key","02_key","03_key","04_key","05_key","06_key","07_key","08_key", "09_key","10_key","11_key","12_key","13_key","14_key","15_key", "01_value","02_value","03_value","04_value","05_value","06_value","07_value","08_value", "09_value","10_value","11_value","12_value","13_value","14_value","15_value"] Fields_type={ "01_value":S2int(),"02_value":S2int(),"03_value":S2int(),"04_value":S2int(), "05_value":S2int(),"06_value":S2int(),"07_value":S2int(),"08_value":S2int(), "09_value":S2int(),"10_value":S2int(),"11_value":S2int(),"12_value":S2int(), "13_value":S2int(),"14_value":S2int(),"15_value":S2int()} self.FText.changeO2IFields(IFields_name,Fields_type) data_ls=[ ["01_key",u"電気機器"],["02_key",u"一般機械"],["03_key",u"鉄鋼"],["04_key",u"éžé‰„金属"],["05_key",u"金属製å“"],["06_key",u"è¼¸é€æ©Ÿå™¨"], ["07_key",u"精密機器"],["08_key",u"化å¦"],["09_key",u"医薬å“"],["10_key",u"石油製å“"],["11_key",u"ゴム製å“"],["12_key",u"窯æ¥ãƒ»åœŸçŸ³"], ["13_key",u"土木・建築"],["14_key",u"官公åº"],["15_key",u"団体"], ["01_value",31],["02_value",7],["03_value",1],["04_value",1],["05_value",11],["06_value",10],["07_value",10],["08_value",6], ["09_value",4],["10_value",2],["11_value",3],["12_value",5],["13_value",1],["14_value",4],["15_value",2]] for ls in data_ls: key=ls[0] self.IOFields_dict[key]=ls[1] self.IOFields_dict["IFields_name"]=IFields_name def calculate(self,random=False): u"""ãƒ‡ãƒ¼ã‚¿ã‚’åˆæœŸåŒ–ã™ã‚‹ã€‚ãŸã ã—ã€ãƒ†ã‚ストä¸ã®å®šæ•°ã¯ã•れãªã„。ã¾ãŸã€å¤‰æ›´ãŒã‚れã°ã€åæ˜ ã•れる。 ã€å¹³å‡ã‚„標準å差をテã‚ストã¨ã—ã¦æŒã£ã¦ã„ã‚‹ã®ã‚’実数ã«å¤‰ãˆã¦ã„る。->実数ã«å¤‰ãˆã‚Œãªã„ã‚‚ã®ãŒã‚ã£ãŸã¨ãã€ãªã«ã‹è¡¨ç¤ºã•ã›ã‚‹ã‚ˆã†ã«ã™ã‚‹ã€‘ parameter : å¿…è¦ãªå®šæ•°ãŒå…¥ã£ãŸè¾žæ›¸ """ dic = self.IOFields_dict num=0 ls=[] for key in dic["IFields_name"]: keys=key.split("_") if (len(keys)==2)and(keys[1]=="key"): s="_".join([keys[0],"value"]) value=dic[s] kind=dic[key] ls.append([value,kind]) num=num+value dic["num"]=num ls.sort(reverse=True) key_ls=dic["key_ls"]=[] value_ls=dic["value_ls"]=[] for x in ls: key_ls.append(x[1]) value_ls.append(x[0]) def bt_1_recalc(self,random=False): u"""å†è¨ˆç®— 入力ã•れãŸãƒ‡ãƒ¼ã‚¿ã®å€¤ã‚’使ã£ã¦å†è¨ˆç®—ã—ã€ã‚°ãƒ©ãƒ•を書ãç›´ã™""" self.calculate(random) self.draw_figure() def Fig1_1(self,name,pos="",dic=None): # 自分ã®é–¢æ•°åã€axisã®ä½ç½®ï¼ˆãƒã‚¸ã‚·ãƒ§ãƒ³ï¼‰ u"""1,1,0,0 パレード図を表示ã™ã‚‹ 横軸ã¯ç¨®é¡žã€ç¸¦è»¸ã¯äººæ•°ã¨ç´¯ç©ç™¾åˆ†çŽ‡ï¼ˆï¼…ï¼‰ """ ###軸ã®ä½œè£½ãƒ»å–å¾—### ax = self.get_ax(name,pos) ax.clear() ax.set_autoscalex_on(True) fontproperties=self.local_dict["fontproperties"] ###棒グラフã®ä½œæˆ### dic=self.IOFields_dict key_ls = dic["key_ls"] x = np.arange(len(key_ls)) y = tuple(dic["value_ls"]) bar = ax.bar(x, y, 1, color='g', alpha=0.3) ax.set_ylabel(u'人数', fontproperties=fontproperties) ###折れ線グラフã®ä½œæˆ### ax2 = ax.twinx() ax2.clear() xx = np.arange(len(key_ls)+1) yy = [0] ls = [0] for v in range(len(y)): ls.append(ls[v]+y[v]) i=(float(ls[v]+y[v])/float(dic["num"]))*100 yy.append(i) plot = ax2.plot(xx, yy, "o-") ax2.set_ylabel(u'ç´¯ç©ç™¾åˆ†çŽ‡ï¼ˆï¼…ï¼‰', fontproperties=fontproperties) ax.set_xticks(x + 0.5) ax.set_xticklabels( tuple(key_ls), fontproperties=fontproperties ) ax.set_xlim(0,len(key_ls)) if __name__=="__main__": common_dict = {} title="pytistics example 01" rn=StatsNotebook(common_dict=common_dict,title=title) local_dict01={} local_dict02={} StatsPage01(rn,"Page1",local_dict=local_dict01) StatsPage02(rn,"Page2",local_dict=local_dict02) rn.main()