Blender+Python=Happyなページを目標に日々精進のページ。

dict_001a.py


ま、WIPのソースを上げるのはちょっと気が引けますが…。
根本的な設計のまずさが…。

使い方と機能

検索
まず、このスクリプトと同じディレクトリに"Simpledict.txt"というカンマ区切りのテキストを用意します
<単語>,<内容>という組み合わせです。

[Simpledict.txt]
A,AAAAAA
a,aaaaa
ae,aaaaaaaaaaa
b,bbbbbbbb
ba,bbbbbba
bca,bca
z,まぢですか?

スクリプトを起動します。

単語入力欄に何か単語を入れてリターンキーもしくは検索ボタン押下ですぐ下のリストボックスに候補を表示します。
候補をダブルクリックすると下の欄に内容が表示されます。
登録

検索で1件もない単語については単語の登録が可能です。しかし現時点では辞書ファイルの記録が出来ないので「実装するならこんな感じかな」という程度のものです。

内容入力欄に登録する内容を書いておいて、登録ボタンを押すとダイアログが出てくるので「はい」を押して登録します。内容入力欄が空の場合はダミー文字を割り当てます。
編集は出来ません

編集は他のソフトウェアで。もしくは自身で組み込んでください。

ソースファイル

例によって例による、「ペースト」でございます。


# coding: utf-8
from Tkinter import *
from ScrolledText import *
from tkMessageBox import *

mydictname = "Simpledict.txt"

# =[Classes]===========================================================

# 辞書クラス(ただの配列)
class CustomDict:

def clear(self): self.dictdata = None self.filename = None
def getlen(self): return len(self.dictdata)

# 辞書をロードします def loaddict(self,filename): self.clear() self.dictdata = [] fi = open(filename)
#辞書データ読み込みループ #[03/09]とりあえず仮データ対応。イリーガルなものが入らない前提で。 cnt = 0 for x in fi: (key,note) = x.split(',') self.dictdata.append([unicode(key),unicode(note.strip()),cnt]) cnt += 1
# print u'>>>>読み込んだ件数: ' + str(cnt) #DBG:
fi.close() self.filename = filename return 0
def reloaddict(self): rslt = self.loaddict(self.filename) return(rslt)
# 標準出力にカンマ区切りでダンプします:ほぼデバッグ用 def dumpdict(self): for x in self.dictdata: print "%s,%s" % (x[0],x[1]) return
# 使っていない関数:辞書を記録する def savedict(self,filename): return(0)
def savedict(self): rslt = self.savedict(self.filename) return(rslt)

# 力技検索 orz def getpair(self,key): buf = [] for x in self.dictdata: if x[0].find(key) >= 0: buf.append([x[0],x[1],x[2]]) return buf
# 同じ形の処理があるんだけどなぁ def append(self,key,note): self.dictdata.append([unicode(key),unicode(note.strip()),len(self.dictdata)])
def getkeybyindex(self,idx): return(self.dictdata[idx][0])
def getnotebyindex(self,idx): return(self.dictdata[idx][1])

def init(self): self.loaddict(mydictname)
def init(self): self.init()

# アプリケーションメインクラス
class App(Frame):
def init(self): self.dict=CustomDict() self.lt1 = StringVar() self.idxlist = []
self.master.title("mini辞書TK") self.lt1.set("状態表示")
Label(self.master, text=u"単語").grid(row=0) Label(self.master, text=u"候補").grid(row=1) Label(self.master, text=u"説明").grid(row=2) Label(self.master, textvariable=self.lt1).grid(row=3,column=0,columnspan=3,sticky=W)
self.e1 = Entry(self.master)
self.e2 = Listbox(width=26,height=4) sb1 = Scrollbar(self.master, orient = 'v', command = self.e2.yview) self.e2.configure(yscrollcommand = sb1.set)
self.e3 = ScrolledText(width=26,height=7)

self.e1.grid(row=0, column=1,columnspan=2,sticky = W) self.e2.grid(row=1, column=1,sticky = W+N+S+E) sb1.grid(row=1, column=2,sticky = E+N+S) self.e3.grid(row=2, column=1,columnspan=2,sticky = W)
self.b1 = Button(self.master, text=u"検索",command =self.cmd_search ) self.b2 = Button(self.master, text=u"削除",command =self.cmd_delete ) self.b3 = Button(self.master, text=u"追加",command =self.cmd_regist ) self.b4 = Button(self.master, text=u"終了",command =self.cmd_exit )
self.b1.grid(row=0, column=3,sticky = W+E) self.b2.grid(row=1, column=3,sticky = N+W+E) self.b3.grid(row=2, column=3,sticky = N+W+E) self.b4.grid(row=3, column=3,sticky = N+W+E)
self.e1.bind('<Return>', self.cmd_enter) self.e2.bind('<Double-1>', self.cmd_select)
# ボタン状態などを初期化 self.e1.focus() self.b2.configure(state=DISABLED) self.b3.configure(state=DISABLED)
# メニュー





# 検索語入力 def cmd_enter(self,ev): self.cmd_search()
# 検索ボタン押下 def cmd_search(self): self.lt1.set("単語の検索")
# 検索単語が空の場合、検索しない(stripした後) key = self.e1.get().strip() self.e1.delete('0',END) if key == "": self.lt1.set("空文字の検索は不可") showinfo(title = 'search', message = u'検索文字を入力してください') self.e1.text = "" self.e1.focus() return self.e1.insert(END,key)
# 辞書引き rslt = self.dict.getpair(key) if len(rslt) > 0 : self.lt1.set("登録された単語:" + str(len(rslt)) + " 件") self.e2.delete(0,'end') cnt=0 self.idxlist = [] for x in rslt: self.e2.insert('end',x[0])
# print cnt,",",x[0],"!",x[1],":",x[2]
self.idxlist.append(x[2]) cnt += 1 self.b3.configure(state=DISABLED) else: self.lt1.set("登録された単語なし") self.b3.configure(state=ACTIVE)
self.e3.delete('0.0',END) return
# 候補選択 def cmd_select(self,ev): listlen = self.e2.size() if listlen > 0 : self.e3.delete('0.0',END) selidx = int(self.e2.curselection()[0]) idx = self.idxlist[selidx] mes = self.dict.getkeybyindex(idx) l = len(mes) mes = "選択:" + mes[:10] if l > 10: mes=mes + "..." self.lt1.set(mes) self.e3.insert(END,self.dict.getnotebyindex(idx)) self.b3.configure(state=DISABLED)
# 登録ボタン押下 def cmd_regist(self): self.lt1.set("単語の登録") key = self.e1.get() note = self.e3.get('0.0',END).strip() if len(note) <1 : rslt = askokcancel(title = 'regist', message = u'ダミー単語\nよろしいですか?') if rslt == True: note = u'ダミー単語' else: self.lt1.set("キャンセル") return msg = u'以下の内容で単語登録します\nよろしいですか?\n' + \ u'登録する単語 = ' + key + '\n' + \ u'登録する内容 = ' + note rslt = askokcancel(title = 'regist', message = msg) if rslt == True: self.dict.append(key,note) showinfo(title = '登録', message = u'登録しました') self.lt1.set("登録しました") else: showinfo(title = '登録キャンセル', message = u'キャンセルしました') self.lt1.set("キャンセル") return self.b3.configure(state=DISABLED) self.lt1.set("単語の登録を終了")

# 削除ボタン押下 def cmd_delete(self): self.lt1.set("単語の削除") rslt = askokcancel(title = 'regist', message = u'単語を削除します\nよろしいですか?') if rslt == False: self.lt1.set("キャンセル") return self.lt1.set("単語の削除を終了")
# 辞書のリロード def cmd_dictreload(self): self.dict.reloaddict()
# 終了ボタン押下 def cmd_exit(self): self.lt1.set("終了") rslt = askokcancel(title = 'regist', message = u'終了します\nよろしいですか?') if rslt == False: self.lt1.set("キャンセル") return # 終了時に辞書データをダンプ(そのまま) self.dict.dumpdict() self.master.destroy()
def init(self, master=None): Frame.init(self, master) self.init()

# =[Main]===========================================================

if name == "main":
app = App(); app.mainloop()
# end.


# 辞書はこの時点で<key>,<note>の組み合わせ。
# 改行は許さないがtextboxで入力できる…
# ------------------------------------------------------------
# A,AAAAAA
# a,aaaaa
# ae,aaaaaaaaaaa
# b,bbbbbbbb
# ba,bbbbbba
# bca,bca
# z,まぢですか?

# 変更履歴:
#
# 3/10: ファイルからの読み込み、単語追加(不完全)
# 終了時辞書内容CSV出力の追加(暫定)

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メニューバーA

Next comes OSAKA!!!

Blender party @OSAKA,Japan 2009
bpoj2009

Blender party @Tokyo,Japan 2009
bptj2009

Eventsupport blog(Della Nagoya)
bpnj2008 - blog

Nagoya
NAGOYA2008本編

どなたでも編集できます