wxpython/lingvigilo.py
author viric@llimona
Thu, 18 May 2006 22:59:47 +0200
changeset 0 6371497b4e53
permissions -rwxr-xr-x
Init from svn. The wxpython is the final one.
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys,time,random,string,MySQLdb,re
from wxPython.wx import *

# Configuració
legi_el = 'mysql'

# Conf - mysql
database = 'lingvigilo'
dbuser = 'lingvigilouser'
dbpass = 'carrinclo'
dbtable_vortoj = 'vortoj_ru_ca'
dbtable_frazoj = 'frazoj_ru_ca'

# Conf - fitxer
dbasefile = 'vortoj-ru-ca.txt'
frazodosiero = 'frazoj.txt'
frazoj_al = 'mysql'

# Si s'especifica fitxer, l'origen és el fitxer.
if (len(sys.argv) > 1):
	dbasefile = sys.argv[1]
	legi_el = 'file'

def StringForSQL(str):
	return re.sub(r"'",r"\'", str)

# Prendre les paraules d'una base de dades MySQL
def getMySQL():
	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
		db=database)
	cursor = db.cursor()
	cursor.execute("SELECT * FROM "+dbtable_vortoj)
	res_vortoj = cursor.fetchall()
	res_vortoj_unicode = []
	for vorto in res_vortoj:
		vorto_vorto = unicode(vorto[1],'utf8')
		vorto_tipo = unicode(vorto[2],'utf8')
		vorto_traduko = unicode(vorto[3],'utf8')
		
		# Paràmetres opcionals
		if vorto[4] == None:
			vorto_param1 = ''
		else:
			vorto_param1 = unicode(vorto[4],'utf8')

		if vorto[5] == None:
			vorto_param2 = ''
		else:
			vorto_param2 = unicode(vorto[5],'utf8')

		res_vortoj_unicode.append(
			(vorto_vorto, vorto_tipo, vorto_traduko,
			vorto_param1, vorto_param2))
	db.close()
	return res_vortoj_unicode

# Prendre les paraules d'un fitxer
def getFile():
	dbase = open(dbasefile,"r")

	lines = dbase.readlines()
	dbase.close()

	res_vortoj = []
	for line in lines:
		line = line.rstrip('\n')
		vortoj = string.split(unicode(line.rstrip('\n'),'utf8'),'\t')
		res_vortoj.append(vortoj)

	return res_vortoj

if legi_el == 'dosiero':
	print "Legante vortojn el dosiero..."
	vortoj = getFile()
elif legi_el == 'mysql':
	print "Legante vortojn el MySQLa datumbazo..."
	vortoj = getMySQL()

print "Legitaj", len(vortoj), "vortoj."

def AldoniFrazonDosieren(vorto,teksto):
	outfile = open(frazodosiero,"a")

	lineout = vorto + "\t" + teksto +"\n"
	outfile.write(lineout.encode('utf8'))
	
	outfile.close()

def AldoniFrazonDatumbazen(vorto,teksto):
	db = MySQLdb.connect(host='vicerveza',user=dbuser,passwd=dbpass,
		db=database)
	cursor = db.cursor()
	cursor.execute("INSERT INTO "+
		StringForSQL(dbtable_frazoj)+
		" (vorto, frazo) VALUES('%s', '%s');" %
		(StringForSQL(vorto.encode('utf8')),
		StringForSQL(teksto.encode('utf8'))))
	db.close()

def AldoniFrazon(vorto,teksto):
	if (frazoj_al == 'mysql'):
		AldoniFrazonDatumbazen(vorto,teksto)
	elif (frazoj_al == 'dosiero'):
		AldoniFrazonDosieren(vorto,teksto)



#def LoopFunction():
#	index = random.randint(0, len(vortoj)-1)
#	vorto = vortoj[index][0]
#	teksto = askstring("Frazilon", "Skribu frazon por vorto '%s'" % vorto)
#	if teksto == None:
#		print 'Fi del programa'
#		sys.exit()
#	AldoniFrazonDatumbazen(vorto, teksto)

def Senakcentigi(vorto):
	return re.sub(r"'",r"", vorto)

class main_window(wxFrame):
	def __init__(self, parent, id, title):
		wxFrame.__init__(self, parent, -1, title, size=(200,100),
			style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)

		# Variables de la classe
		# (sino no tira)
		self.vorto = ("", "")

		# Sizer vertical
		self.topsizer = wxBoxSizer(wxVERTICAL)

		# Agefim la pregunta i la textbox
		self.label = wxStaticText(self, -1,
			label="Skribu frazon per vorto\n 'provo'",
			style=wxALIGN_CENTER)
		self.textbox = wxTextCtrl(self, -1)
		self.topsizer.Add(self.label, 1, wxALIGN_CENTER,
			wxALL, 10)
		self.topsizer.Add(self.textbox, 0, wxEXPAND, wxALL, 10)

		# Afegim botons
		self.buttonsizer = wxBoxSizer(wxHORIZONTAL)
		okid = wxNewId()
		cancelid = wxNewId()
		helpid = wxNewId()
		okbutton = wxButton(self, okid, "Konservu")
		# Botó per defecte (resposta a l'intro)
		okbutton.SetDefault()
		self.buttonsizer.Add(okbutton, 0, wxALL, 10)
		cancelbutton = wxButton(self, cancelid, "Forgesu")
		self.buttonsizer.Add(cancelbutton, 0, wxALL, 10)
		helpbutton = wxButton(self, helpid, "Helpo")
		self.buttonsizer.Add(helpbutton, 0, wxALL, 10)
		self.topsizer.Add(self.buttonsizer, 0, wxALIGN_CENTER)

		# EVENTS DE BOTONS
		EVT_BUTTON(okbutton, okid, self.KonservuFrazon )
		EVT_BUTTON(cancelbutton, cancelid, self.ForgesuFrazon )
		EVT_BUTTON(helpbutton, helpid, self.MontruHelpon )

		# Key events
		EVT_KEY_DOWN(self,self.KeyManager)

		# Activem el sizer principal
		self.SetSizer(self.topsizer)
		# Mida mínima de finestra.
		self.topsizer.SetSizeHints(self)

		# Focus al text
		self.textbox.SetFocus()
		
		self.Show(true)

		# Actualitzem paraula.
		self.RenovuVorton()

	def RenovuVorton(self):
		index = random.randint(0, len(vortoj)-1)
		
		self.vorto = vortoj[index]
		#print("Elektita vorto: %s" % self.vorto[0])
		self.label.SetLabel("Skribu frazon per vorto\n'%s'" %
			Senakcentigi(self.vorto[0]))


	#	if teksto == None:
	#		print 'Fi del programa'
	#		sys.exit()
	#	AldoniFrazonDatumbazen(vorto, teksto)

	def MontruHelpon(self,event):
		mesagxo = ("Vorto: " + self.vorto[0] + "\n" +
			"Tipo: " + self.vorto[1] + "\n" +
			"Traduko: " + self.vorto[2] + "\n")

		if (self.vorto[1] == "verb"):
			mesagxo = (mesagxo + "Aspekto: " + self.vorto[3] + "\n")
			aspekto = self.vorto[3]
			if (self.vorto[3] == u"нсв"):
				aliaaspekto = u"Св"
			else:
				aliaaspekto = u"Нсв"
			mesagxo = (mesagxo + aliaaspekto + ": " +
				self.vorto[4] + "\n")

		wxMessageDialog(self, mesagxo, "Helpo", style=wxOK).ShowModal()

	def KonservuFrazon(self,event):
		# No guardem cadenes buides
		if (self.textbox.GetValue() != ""):
			AldoniFrazon(Senakcentigi(self.vorto[0]),
				self.textbox.GetValue())
			self.RenovuVorton()
			self.textbox.Clear()

	def ForgesuFrazon(self,event):
		self.textbox.Clear()
		self.RenovuVorton()

	def KeyManager(self,event):
		key = event.GetKeyCode()
		if (key == WXK_ESCAPE):
			print("Elirante...")
			sys.exit()
		elif (key == WXK_TAB):
			# Igual que ForgesuFrazon(self,event)
			# Puc fer-ho passant un event buit?
			self.ForgesuFrazon(0)
		elif (key == WXK_F1):
			self.MontruHelpon(0)

class App(wxApp):
	def OnInit(self):
		frame = main_window(None, -1, "Lingvigilo")
		self.SetTopWindow(frame)
		return true

#def DemandiAlUzanto():

# Main program
app=App(0)
app.MainLoop()