1 import Tkinter as tk
2 from morphology import KimmoMorphology
3 from fsa import FSA
4
6 - def __init__(self, ruleset, startTk=False):
7 import Tkinter as tk
8 if startTk: self._root = tk.Tk()
9 else: self._root = tk.Toplevel()
10
11 self.ruleset = ruleset
12 self.rules = ruleset.rules()
13 self.lexicon = ruleset.morphology()
14
15 frame = tk.Frame(self._root)
16 tk.Label(frame, text='Rules').pack(side=tk.TOP)
17 scrollbar = tk.Scrollbar(frame, orient=tk.VERTICAL)
18 self.listbox = tk.Listbox(frame, yscrollcommand=scrollbar.set,
19 exportselection=0)
20 scrollbar.config(command=self.listbox.yview)
21 scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
22 self.listbox.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
23
24 frame2 = tk.Frame(self._root)
25 tk.Label(frame2, text='Steps').pack(side=tk.TOP)
26 scrollbar2 = tk.Scrollbar(frame2, orient=tk.VERTICAL)
27 self.steplist = tk.Listbox(frame2, yscrollcommand=scrollbar2.set,
28 font='Sans 10', width='40', exportselection=0)
29 scrollbar2.config(command=self.steplist.yview)
30 scrollbar2.pack(side=tk.RIGHT, fill=tk.Y)
31 self.steplist.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
32
33 wordbar = tk.Frame(self._root)
34 self.genbox = tk.Entry(wordbar, width=30, font="Courier 14")
35 genbutton = tk.Button(wordbar, text="Generate ->",
36 command=self.generate)
37 recbutton = tk.Button(wordbar, text="<- Recognize",
38 command=self.recognize)
39 self.recbox = tk.Entry(wordbar, width=30, font="Courier 14")
40 self.resultlabel = tk.Label(wordbar, justify=tk.CENTER, text='')
41
42 self.genbox.pack(side=tk.LEFT)
43 genbutton.pack(side=tk.LEFT)
44 self.resultlabel.pack(side=tk.LEFT, fill=tk.X, expand=1)
45 self.recbox.pack(side=tk.RIGHT)
46 recbutton.pack(side=tk.RIGHT)
47 wordbar.pack(side=tk.TOP, fill=tk.X, expand=1)
48 frame.pack(side=tk.LEFT, fill=tk.Y, expand=1)
49 frame2.pack(side=tk.LEFT, fill=tk.Y, expand=1)
50
51 if self.lexicon: self.listbox.insert(tk.END, 'Lexicon')
52 else: self.listbox.insert(tk.END, '(no lexicon)')
53 for rule in self.rules:
54 self.listbox.insert(tk.END, rule.name())
55
56 self.rframe = tk.Frame(self._root)
57 self.rframe.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
58
59 self.graph_widget = None
60 self.listbox.bind("<ButtonRelease-1>", self.graph_selected)
61 self.steplist.bind("<ButtonRelease-1>", self.step_selected)
62
63 self._root.bind('<Up>', self.select_up)
64 self._root.bind('<Down>', self.select_down)
65
66 self.widget_store = {}
67 self.steps = []
68 for i in range(len(self.rules), -1, -1):
69 self.draw_rule(i)
70
71 if startTk:
72 tk.mainloop()
73
79
80
86
95
104
106 if index == 0:
107 rule = self.lexicon
108 else: rule = self.rules[index-1]
109 if rule is None: return
110 if self.graph_widget is not None:
111 self.graph_widget.pack_forget()
112 if index-1 in self.widget_store:
113 self.graph, self.graph_widget = self.widget_store[index-1]
114 self.graph_widget.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
115 else:
116 self.graph_widget = self.wrap_pygraph(rule)
117 self.graph_widget.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
118 self.widget_store[index-1] = (self.graph, self.graph_widget)
119
130
154
155 - def step(self, pairs, curr, rules, prev_states, states, morphology_state,
156 word):
157 lexical = ''.join(p.input() for p in pairs)
158 surface = ''.join(p.output() for p in pairs)
159 text = '%s<%s> | %s<%s>'%(lexical, curr.input(), surface, curr.output())
160 blocked = []
161 for rule, state in zip(rules, states):
162 if str(state).lower() in ['0', 'reject']:
163 blocked.append(rule.name())
164 if blocked:
165 text +=' [%s failed]' % (', '.join(blocked))
166 self.steplist.insert(tk.END, text)
167 self.steps.append((text, states, morphology_state, word))
168
170 if not self.genbox.get(): return
171 gentext = self.genbox.get().split()[0]
172 result = " ".join(self.ruleset.generate(gentext, self))
173 self.recbox.delete(0, tk.END)
174 self.recbox.insert(0, result)
175
177 if not self.recbox.get(): return
178 rectext = self.recbox.get().split()[0]
179 result = ", ".join('%s (%s)' % (word, feat) for (word, feat) in
180 self.ruleset.recognize(rectext, self))
181 self.genbox.delete(0, tk.END)
182 self.genbox.insert(0, result)
183
185 lexical = ''.join(p.input() for p in pairs)
186 surface = ''.join(p.output() for p in pairs)
187 self.steplist.insert(tk.END, 'SUCCESS: %s / %s' % (lexical, surface))
188 self.num_results += 1
189 if self.num_results == 1:
190 self.resultlabel.configure(text='1 result')
191 else:
192 self.resultlabel.configure(text='%d results' % self.num_results)
193 self.steps.append((lexical, [None]*len(self.rules), None, ''))
194
196 self.steplist.delete(0, tk.END)
197 self.num_results = 0
198 self.steps = []
199 self.resultlabel.configure(text='')
200
201
202