|
1 #!/usr/bin/python |
|
2 # -*- coding: utf-8 -*- |
|
3 |
|
4 import sys,time,random,string,MySQLdb,re |
|
5 from wxPython.wx import * |
|
6 |
|
7 # Configuració |
|
8 legi_el = 'mysql' |
|
9 |
|
10 # Conf - mysql |
|
11 database = 'lingvigilo' |
|
12 dbuser = 'lingvigilouser' |
|
13 dbpass = 'carrinclo' |
|
14 dbtable_vortoj = 'vortoj_ru_ca' |
|
15 dbtable_frazoj = 'frazoj_ru_ca' |
|
16 |
|
17 # Conf - fitxer |
|
18 dbasefile = 'vortoj-ru-ca.txt' |
|
19 frazodosiero = 'frazoj.txt' |
|
20 frazoj_al = 'mysql' |
|
21 |
|
22 # Si s'especifica fitxer, l'origen és el fitxer. |
|
23 if (len(sys.argv) > 1): |
|
24 dbasefile = sys.argv[1] |
|
25 legi_el = 'file' |
|
26 |
|
27 def StringForSQL(str): |
|
28 return re.sub(r"'",r"\'", str) |
|
29 |
|
30 # Prendre les paraules d'una base de dades MySQL |
|
31 def getMySQL(): |
|
32 db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass, |
|
33 db=database) |
|
34 cursor = db.cursor() |
|
35 cursor.execute("SELECT * FROM "+dbtable_vortoj) |
|
36 res_vortoj = cursor.fetchall() |
|
37 res_vortoj_unicode = [] |
|
38 for vorto in res_vortoj: |
|
39 vorto_vorto = unicode(vorto[1],'utf8') |
|
40 vorto_tipo = unicode(vorto[2],'utf8') |
|
41 vorto_traduko = unicode(vorto[3],'utf8') |
|
42 |
|
43 # Paràmetres opcionals |
|
44 if vorto[4] == None: |
|
45 vorto_param1 = '' |
|
46 else: |
|
47 vorto_param1 = unicode(vorto[4],'utf8') |
|
48 |
|
49 if vorto[5] == None: |
|
50 vorto_param2 = '' |
|
51 else: |
|
52 vorto_param2 = unicode(vorto[5],'utf8') |
|
53 |
|
54 res_vortoj_unicode.append( |
|
55 (vorto_vorto, vorto_tipo, vorto_traduko, |
|
56 vorto_param1, vorto_param2)) |
|
57 db.close() |
|
58 return res_vortoj_unicode |
|
59 |
|
60 # Prendre les paraules d'un fitxer |
|
61 def getFile(): |
|
62 dbase = open(dbasefile,"r") |
|
63 |
|
64 lines = dbase.readlines() |
|
65 dbase.close() |
|
66 |
|
67 res_vortoj = [] |
|
68 for line in lines: |
|
69 line = line.rstrip('\n') |
|
70 vortoj = string.split(unicode(line.rstrip('\n'),'utf8'),'\t') |
|
71 res_vortoj.append(vortoj) |
|
72 |
|
73 return res_vortoj |
|
74 |
|
75 if legi_el == 'dosiero': |
|
76 print "Legante vortojn el dosiero..." |
|
77 vortoj = getFile() |
|
78 elif legi_el == 'mysql': |
|
79 print "Legante vortojn el MySQLa datumbazo..." |
|
80 vortoj = getMySQL() |
|
81 |
|
82 print "Legitaj", len(vortoj), "vortoj." |
|
83 |
|
84 def AldoniFrazonDosieren(vorto,teksto): |
|
85 outfile = open(frazodosiero,"a") |
|
86 |
|
87 lineout = vorto + "\t" + teksto +"\n" |
|
88 outfile.write(lineout.encode('utf8')) |
|
89 |
|
90 outfile.close() |
|
91 |
|
92 def AldoniFrazonDatumbazen(vorto,teksto): |
|
93 db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass, |
|
94 db=database) |
|
95 cursor = db.cursor() |
|
96 cursor.execute("INSERT INTO "+ |
|
97 StringForSQL(dbtable_frazoj)+ |
|
98 " (vorto, frazo) VALUES('%s', '%s');" % |
|
99 (StringForSQL(vorto.encode('utf8')), |
|
100 StringForSQL(teksto.encode('utf8')))) |
|
101 db.close() |
|
102 |
|
103 def AldoniFrazon(vorto,teksto): |
|
104 if (frazoj_al == 'mysql'): |
|
105 AldoniFrazonDatumbazen(vorto,teksto) |
|
106 elif (frazoj_al == 'dosiero'): |
|
107 AldoniFrazonDosieren(vorto,teksto) |
|
108 |
|
109 |
|
110 |
|
111 #def LoopFunction(): |
|
112 # index = random.randint(0, len(vortoj)-1) |
|
113 # vorto = vortoj[index][0] |
|
114 # teksto = askstring("Frazilon", "Skribu frazon por vorto '%s'" % vorto) |
|
115 # if teksto == None: |
|
116 # print 'Fi del programa' |
|
117 # sys.exit() |
|
118 # AldoniFrazonDatumbazen(vorto, teksto) |
|
119 |
|
120 def Senakcentigi(vorto): |
|
121 return re.sub(r"'",r"", vorto) |
|
122 |
|
123 class main_window(wxFrame): |
|
124 def __init__(self, parent, id, title): |
|
125 wxFrame.__init__(self, parent, -1, title, size=(200,100), |
|
126 style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE) |
|
127 |
|
128 # Variables de la classe |
|
129 # (sino no tira) |
|
130 self.vorto = ("", "") |
|
131 |
|
132 # Sizer vertical |
|
133 self.topsizer = wxBoxSizer(wxVERTICAL) |
|
134 |
|
135 # Agefim la pregunta i la textbox |
|
136 self.label = wxStaticText(self, -1, |
|
137 label="Skribu frazon per vorto\n 'provo'", |
|
138 style=wxALIGN_CENTER) |
|
139 self.textbox = wxTextCtrl(self, -1) |
|
140 self.topsizer.Add(self.label, 1, wxALIGN_CENTER, |
|
141 wxALL, 10) |
|
142 self.topsizer.Add(self.textbox, 0, wxEXPAND, wxALL, 10) |
|
143 |
|
144 # Afegim botons |
|
145 self.buttonsizer = wxBoxSizer(wxHORIZONTAL) |
|
146 okid = wxNewId() |
|
147 cancelid = wxNewId() |
|
148 helpid = wxNewId() |
|
149 okbutton = wxButton(self, okid, "Konservu") |
|
150 # Botó per defecte (resposta a l'intro) |
|
151 okbutton.SetDefault() |
|
152 self.buttonsizer.Add(okbutton, 0, wxALL, 10) |
|
153 cancelbutton = wxButton(self, cancelid, "Forgesu") |
|
154 self.buttonsizer.Add(cancelbutton, 0, wxALL, 10) |
|
155 helpbutton = wxButton(self, helpid, "Helpo") |
|
156 self.buttonsizer.Add(helpbutton, 0, wxALL, 10) |
|
157 self.topsizer.Add(self.buttonsizer, 0, wxALIGN_CENTER) |
|
158 |
|
159 # EVENTS DE BOTONS |
|
160 EVT_BUTTON(okbutton, okid, self.KonservuFrazon ) |
|
161 EVT_BUTTON(cancelbutton, cancelid, self.ForgesuFrazon ) |
|
162 EVT_BUTTON(helpbutton, helpid, self.MontruHelpon ) |
|
163 |
|
164 # Key events |
|
165 EVT_KEY_DOWN(self,self.KeyManager) |
|
166 |
|
167 # Activem el sizer principal |
|
168 self.SetSizer(self.topsizer) |
|
169 # Mida mínima de finestra. |
|
170 self.topsizer.SetSizeHints(self) |
|
171 |
|
172 # Focus al text |
|
173 self.textbox.SetFocus() |
|
174 |
|
175 self.Show(true) |
|
176 |
|
177 # Actualitzem paraula. |
|
178 self.RenovuVorton() |
|
179 |
|
180 def RenovuVorton(self): |
|
181 index = random.randint(0, len(vortoj)-1) |
|
182 |
|
183 self.vorto = vortoj[index] |
|
184 #print("Elektita vorto: %s" % self.vorto[0]) |
|
185 self.label.SetLabel("Skribu frazon per vorto\n'%s'" % |
|
186 Senakcentigi(self.vorto[0])) |
|
187 |
|
188 |
|
189 # if teksto == None: |
|
190 # print 'Fi del programa' |
|
191 # sys.exit() |
|
192 # AldoniFrazonDatumbazen(vorto, teksto) |
|
193 |
|
194 def MontruHelpon(self,event): |
|
195 mesagxo = ("Vorto: " + self.vorto[0] + "\n" + |
|
196 "Tipo: " + self.vorto[1] + "\n" + |
|
197 "Traduko: " + self.vorto[2] + "\n") |
|
198 |
|
199 if (self.vorto[1] == "verb"): |
|
200 mesagxo = (mesagxo + "Aspekto: " + self.vorto[3] + "\n") |
|
201 aspekto = self.vorto[3] |
|
202 if (self.vorto[3] == u"нсв"): |
|
203 aliaaspekto = u"Св" |
|
204 else: |
|
205 aliaaspekto = u"Нсв" |
|
206 mesagxo = (mesagxo + aliaaspekto + ": " + |
|
207 self.vorto[4] + "\n") |
|
208 |
|
209 wxMessageDialog(self, mesagxo, "Helpo", style=wxOK).ShowModal() |
|
210 |
|
211 def KonservuFrazon(self,event): |
|
212 # No guardem cadenes buides |
|
213 if (self.textbox.GetValue() != ""): |
|
214 AldoniFrazon(Senakcentigi(self.vorto[0]), |
|
215 self.textbox.GetValue()) |
|
216 self.RenovuVorton() |
|
217 self.textbox.Clear() |
|
218 |
|
219 def ForgesuFrazon(self,event): |
|
220 self.textbox.Clear() |
|
221 self.RenovuVorton() |
|
222 |
|
223 def KeyManager(self,event): |
|
224 key = event.GetKeyCode() |
|
225 if (key == WXK_ESCAPE): |
|
226 print("Elirante...") |
|
227 sys.exit() |
|
228 elif (key == WXK_TAB): |
|
229 # Igual que ForgesuFrazon(self,event) |
|
230 # Puc fer-ho passant un event buit? |
|
231 self.ForgesuFrazon(0) |
|
232 elif (key == WXK_F1): |
|
233 self.MontruHelpon(0) |
|
234 |
|
235 class App(wxApp): |
|
236 def OnInit(self): |
|
237 frame = main_window(None, -1, "Lingvigilo") |
|
238 self.SetTopWindow(frame) |
|
239 return true |
|
240 |
|
241 #def DemandiAlUzanto(): |
|
242 |
|
243 # Main program |
|
244 app=App(0) |
|
245 app.MainLoop() |