From 1d271d881502f5f600239253394809df053db4e2 Mon Sep 17 00:00:00 2001 From: Assim Date: Mon, 11 Aug 2008 12:37:36 +0000 Subject: configuration panel added --- (limited to 'ListenSpell.py') diff --git a/ListenSpell.py b/ListenSpell.py new file mode 100755 index 0000000..68c8c80 --- /dev/null +++ b/ListenSpell.py @@ -0,0 +1,555 @@ +#!/usr/bin/env python +import pygtk +pygtk.require('2.0') + +import gtk +import os +import string +from las import Listenspell +from sugar.activity import activity +from sugar.datastore import datastore +import logging +from gettext import gettext as _ + +class ListenSpell(activity.Activity): + + def __init__(self, handle = None, is_stand_alone = False): + self.is_stand_alone = is_stand_alone + + if not self.is_stand_alone: + activity.Activity.__init__(self, handle) + self._name = handle + self._logger = logging.getLogger('listen-spell') + + path = __file__ + path = path.rpartition("/") + self.las = Listenspell() + self.las.set_path(path[0]) + + DBname = "dict.db" + self.las.load_db(DBname) + self.use_phoneme = False + + self.load_activity_interface() + self.las.play_sound("begin") + self.las.say_text("Welcome", wait = False) + self.ask_skill_level() + self.play_game("start") + gtk.main() + + + def load_activity_interface(self): + #query = {'title':'listen-spell'} + #(result, count) = datastore.find(query) + #md = datastore.DSMetadata() + #if count > 0: + #dso = result[0] + #md = dso.get_metadata() + #md.get() + + + + if self.is_stand_alone: + self.main_window = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.main_window.connect("destroy", self.destroy) + self.main_window.set_border_width(10) + self.main_window.set_title("Listen and Spell") + + if not self.is_stand_alone: + toolbox = activity.ActivityToolbox(self) + #conf_toolbar = ConfigToolBar() + + #mytoolbar = gtk.Toolbar() + #helpbut = gtk.ToolButton(label = 'help') #Stock help icon + #helpbut.set_tooltip(_("Get help")) + #helpbut.connect('clicked', self.help_button_pressed) + #mytoolbar.insert(helpbut, -1) + #helpbut.show() + #mytoolbar.show() + + + #toolbox.add_toolbar("my toolbar",mytoolbar) + + self.set_toolbox(toolbox) + toolbox.show_all() + # Set title for our Activity + + self.set_title('Listen and Spell') + + self.Hcontainer = gtk.HBox() + self.Hcontainer.show() + + if self.is_stand_alone: + self.main_window.add(self.Hcontainer) + + self.vcontainer_left = gtk.VBox() + self.vcontainer_left.set_border_width(10) + self.vcontainer_left.show() + + self.vcontainer_right = gtk.VBox() + self.vcontainer_right.set_border_width(10) + self.vcontainer_right.show() + + + self.Hcontainer.pack_start(self.vcontainer_left,True, True,0) + self.Hcontainer.pack_end(self.vcontainer_right,False, False,0) + + #####################Left Pane widgets########################## + + + self.text_input = gtk.Entry() + self.text_input.show() + self.text_input.connect("focus-in-event", self.text_input_focus, None) + self.text_input.connect("activate", self.text_input_activate, None) + + self.console_text_view = gtk.TextView() + + self.console_text_sw = gtk.ScrolledWindow() + self.console_text_sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) + self.console_text_sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + + self.console_text_sw.add(self.console_text_view) + + + self.text_submit_button = gtk.Button(label="Submit") + self.text_submit_button.show() + self.text_submit_button.connect("clicked", self.submit_button_clicked, None) + + self.console_text_buffer = gtk.TextBuffer() + #self.console_text_buffer.set_text("This is hint text") + self.console_text_view.set_editable(False) + self.console_text_view.set_buffer(self.console_text_buffer) + + self.console_text_frame = gtk.Frame("Console:") + self.console_text_frame.add(self.console_text_sw) + self.console_text_frame.show_all() + + self.vcontainer_left.pack_start(self.console_text_frame, True, True ) + self.vcontainer_left.pack_start(self.text_input, False, True ) + self.vcontainer_left.pack_start(self.text_submit_button, False, False ) + + ################################################True################ + + #################Right pane wigets############################## + + self.v_buttonbox = gtk.VButtonBox() + + self.repeat_word_button = gtk.Button(label="Repeat Word") + self.repeat_word_button.connect("clicked", self.repeat_word_button_clicked, None) + + self.get_def_button = gtk.Button(label="Get Def") + self.get_def_button.connect("clicked", self.get_def_button_clicked, None) + + self.get_usage_button = gtk.Button("Get Usage") + self.get_usage_button.connect("clicked", self.get_usage_button_clicked, None) + + self.get_word_length_button = gtk.Button("Get Word Length") + self.get_word_length_button.connect("clicked", self.get_word_length_button_clicked, None) + + self.change_skill_level_button = gtk.Button("Change Skill Level") + self.change_skill_level_button.connect("clicked", self.change_skill_level_button_clicked, None) + + self.change_skill_level_button = gtk.Button("Speech Configuration") + self.change_skill_level_button.connect("clicked", self.speech_configuration_button_clicked, None) + + self.v_buttonbox.add(self.repeat_word_button) + self.v_buttonbox.add(self.get_def_button) + self.v_buttonbox.add(self.get_usage_button) + self.v_buttonbox.add(self.get_word_length_button) + self.v_buttonbox.add(self.change_skill_level_button) + + self.v_buttonbox.show_all() + + self.button_frame = gtk.Frame("Buttons") + self.button_frame.add(self.v_buttonbox) + self.button_frame.show() + + self.vcontainer_right.add(self.button_frame) + + self.stats_frame = gtk.Frame("Stats") + + self.stats_table = gtk.Table(4,2,True) + + self.score_label = gtk.Label("Score: ") + self.score_value_label = gtk.Label("?") + #self.score_value_label. + + self.skill_level_label = gtk.Label("Skill Level: ") + self.skill_level_value_label = gtk.Label("?") + + self.words_played_label = gtk.Label("Words played: ") + self.words_played_value_label = gtk.Label("?") + + self.words_correct_label = gtk.Label("Correct Words: ") + self.words_correct_value_label = gtk.Label("?") + + self.stats_table.attach(self.score_label, 0, 1, 0, 1) + self.stats_table.attach(self.score_value_label, 1, 2, 0, 1) + + self.stats_table.attach(self.skill_level_label, 0, 1, 1, 2) + self.stats_table.attach(self.skill_level_value_label, 1, 2, 1, 2) + + self.stats_table.attach(self.words_played_label, 0, 1, 2, 3) + self.stats_table.attach(self.words_played_value_label, 1, 2, 2, 3) + + self.stats_table.attach(self.words_correct_label, 0, 1, 3, 4) + self.stats_table.attach(self.words_correct_value_label, 1, 2, 3, 4) + + self.vcontainer_right.add(self.stats_frame) + self.stats_frame.add(self.stats_table) + + self.stats_frame.show_all() + if not self.is_stand_alone: + self._logger.debug('activity loaded') + + ################################################################ + if self.is_stand_alone: + self.main_window.show() + else: + self.set_canvas(self.Hcontainer) + self.show_all() + + ##################Call Backs#################################### + + + + def _update_configuration(self, widget, attribute ): + if attribute == "voice": + self.las.speechd_config(attribute, widget.get_active_text()) + else: + self.las.speechd_config(attribute, widget.get_value()) + + + def _speech_test(self, widget, speech_text): + self.las.say_text(str(speech_text)) + + def speech_configuration_button_clicked(self, widget, data = None): + self.config_dialog = gtk.Dialog("Change Speech Configuration", self,0,(gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) + #self.las.say_text("Skill Level") + #vbox = gtk.VBox(False, 8) + #Vbox.set_border_width(8) + + config_table = gtk.Table(4,2) + config_table.set_row_spacings(4) + config_table.set_col_spacings(4) + + speech_frame= gtk.Frame("Speech Configuration") + speech_frame.add(config_table) + + self.config_dialog.vbox.pack_start(speech_frame, False, False, 0) + + volume_adj = gtk.Adjustment(0, -100, 101, 1, 1, 1) + rate_adj = gtk.Adjustment(0, -100, 101, 1, 1, 1) + pitch_adj = gtk.Adjustment(0, -100, 101, 1, 1, 1) + + + volume_hscale = gtk.HScale(volume_adj) + rate_hscale = gtk.HScale(rate_adj) + pitch_hscale = gtk.HScale(pitch_adj) + + volume_hscale.set_digits(0) + rate_hscale.set_digits(0) + pitch_hscale.set_digits(0) + + + volume_hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) + rate_hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) + pitch_hscale.set_update_policy(gtk.UPDATE_DISCONTINUOUS) + + voice_box = gtk.combo_box_new_text() + voice_list = ["MALE1", "MALE2", "MALE3", "FEMALE1", "FEMALE2", "FEMALE3", "CHILD_MALE", "CHILD_FEMALE"] + #hscale4 = gtk.HScale(adj4) + for voice in voice_list: + voice_box.append_text(voice) + voice_box.set_active(0) + + volume_label = gtk.Label("Volume") + rate_label = gtk.Label("Rate") + pitch_label = gtk.Label("pitch") + voice_label = gtk.Label("Voice") + + volume_adj.connect('value_changed',self._update_configuration, "volume") + rate_adj.connect('value_changed',self._update_configuration, "rate") + pitch_adj.connect('value_changed',self._update_configuration, "pitch") + voice_box.connect('changed', self._update_configuration, "voice") + + + config_table.attach(volume_label, 0,1,0,1) + config_table.attach(rate_label, 0,1,1,2) + config_table.attach(pitch_label, 0,1,2,3) + config_table.attach(voice_label, 0,1,3,4) + + config_table.attach(volume_hscale, 1,2,0,1) + config_table.attach(rate_hscale, 1,2,1,2) + config_table.attach(pitch_hscale, 1,2,2,3) + config_table.attach(voice_box, 1,2,3,4) + + + speech_test_frame = gtk.Frame("Test Speech Setting") + + self.config_dialog.vbox.pack_start(speech_test_frame, False, False, 0) + + + + speech_test_table = gtk.Table(2,1) + speech_test_table.set_row_spacings(4) + speech_test_table.set_col_spacings(4) + + speech_test_frame.add(speech_test_table) + + speech_test_text_entry = gtk.Entry() + speech_test_text_entry.set_text("The quick brown fox jumps over the lazy dog") + + speech_test_button = gtk.Button("Test") + + speech_test_button.connect("clicked", self._speech_test, speech_test_text_entry.get_text()) + + speech_test_table.attach(speech_test_text_entry, 0,1,0,1) + speech_test_table.attach(speech_test_button, 0,1,1,2) + + + + self.config_dialog.show_all() + + response = self.config_dialog.run() + + + + def get_speechd_config(self): + pass + + def submit_button_clicked(self, widget, data = None): + answer = self.text_input.get_text() + self.las.say_text("You typed") + self.shout(answer) + if answer == self.elem: + self.las.say_text("Correct") + self.las.ans_correct(self.wordid) + + else: + self.las.ans_incorrect(self.wordid) + self.las.say_text("Incorrect") + self.display_console("Incorrect. The correct spelling is.. ") + self.las.say_text("The correct spelling is..\n") + self.shout(self.elem) + self.update_all() + self.play_game("next word") + if not self.is_stand_alone: + self._logger.debug('submit button clicked : ' + self.elem + '') + return False + + def text_input_focus(self, widget, event, data= None): + #print "text_input_focus_in" + return False + + def text_input_activate(self, widget, data=None): + self.submit_button_clicked(widget, data) + #print "text_input_activate" + return False + + def repeat_word_button_clicked(self, widget, data = None): + if self.elem != self.pronounelem and self.use_phoneme: + self.las.say_text(self.pronounelem, is_phoneme = True) + else: + self.las.say_text(self.elem) + if not self.is_stand_alone: + self._logger.debug('repeat button clicked : ' + self.elem + '') + + def get_def_button_clicked(self, widget, data = None): + def_list = self.las.get_word_info(self.wordid, "def") + self.display_console("Definition: ") + for (pos, definition, name) in def_list: + self.display_console(pos + "(" + name + ") : " + definition) + if not self.is_stand_alone: + self._logger.debug('get defination button clicked : ' + self.elem + '') + + def get_usage_button_clicked(self, widget, data = None): + if self.usage_used == 0: + usage = self.las.get_word_info(self.wordid, "usage") + self.total_num_usage = len(usage) + if self.total_num_usage == 0: + self.display_console("No usage in the database") + elif self.total_num_usage == self.usage_used: + self.display_console("No more usage in the database") + else: + (sample) = usage[self.usage_used] + las.say_text(sample) + self.usage_used = self.usage_used + 1 + if not self.is_stand_alone: + self._logger.debug('get usage button clicked : ' + self.elem + '') + + def get_word_length_button_clicked(self, widget, data = None): + self.display_console("Word Length: " + str(len(self.elem))) + if not self.is_stand_alone: + self._logger.debug('get word length button clicked : ' + self.elem + '') + + def ask_skill_level(self): + self.skill_level_dialog = gtk.Dialog("Enter Skill Level", self, 0,(gtk.STOCK_OK, gtk.RESPONSE_OK, "Quit Game", gtk.RESPONSE_CANCEL)) + self.las.say_text("Skill Level") + hbox = gtk.HBox(False, 8) + hbox.set_border_width(8) + self.skill_level_dialog.vbox.pack_start(hbox, False, False, 0) + + table = gtk.Table(1, 1) + table.set_row_spacings(4) + table.set_col_spacings(4) + hbox.pack_start(table, True, True, 0) + + label = gtk.Label("Skill Level") + #label.set_use_underline(True) + table.attach(label, 0, 1, 0, 1) + local_skill_level = gtk.Entry() + local_skill_level.set_text(str(self.las.get_skill_level())) + local_skill_level.connect("activate", self.local_skill_level_activate, None) + table.attach(local_skill_level, 1, 2, 0, 1) + label.set_mnemonic_widget(local_skill_level) + + self.skill_level_dialog.show_all() + response = self.skill_level_dialog.run() + + if response == gtk.RESPONSE_OK: + skill_level = int (local_skill_level.get_text()) + if not self.is_stand_alone: + self._logger.debug('level set : ' + str(skill_level) + '') + self.skill_level_dialog.destroy() + self.las.set_skill_level(skill_level) + self.update_all() + elif response == gtk.RESPONSE_CANCEL: + self.game_exit() + elif response == gtk.RESPONSE_NONE: + self.game_exit() + + def local_skill_level_focus(self, widget, event, data= None): # not in use + #print "text_input_focus_in" + return False + + def local_skill_level_activate(self, widget, data=None): + self.skill_level_dialog.response(gtk.RESPONSE_OK) + + + def change_skill_level_button_clicked(self, widget, data=None): + self.ask_skill_level() + self.play_game("start") + + def shout(self,string): + self.display_console("") + for char in string: + self.display_console(char, newline = False) + self.las.say_text(char) + self.las.say_text(string) + + + ################################################################ + + #####################Update methods############################# + def update_all(self): + self.update_score() + self.update_skill_level() + self.update_words_played() + self.update_words_correct() + + def update_score(self, score = None): + if score ==None: + score = self.las.get_points() + self.score_value_label.set_text(str(score)) + + def update_skill_level(self, skill_level = None): + if skill_level ==None: + skill_level = self.las.get_skill_level() + self.skill_level_value_label.set_text(str(skill_level)) + + def update_words_played(self, words_played = None): + if words_played ==None: + words_played = self.las.get_words_played() + self.words_played_value_label.set_text(str(words_played)) + + def update_words_correct(self, words_correct = None): + if words_correct ==None: + words_correct = self.las.get_words_correct() + self.words_correct_value_label.set_text(str(words_correct)) + + def play_word(self): + self.usage_used = -1 + self.total_num_usage = -1 + + self.text_input.set_text("") # Clear answer field + + # Initilazing variable for eacch word + + self.elem = self.las.get_word_info(self.wordid, "word") #get a word from the list + self.pronounelem = self.las.get_word_info(self.wordid, "phnm") #get a pronounciation from the list + + self.display_console("Spell...") # say the explanation if the word is ambiguous. + if self.elem != self.pronounelem and self.use_phoneme: # determine whether to bother pronouncing a description + self.las.say_text("Spell..." + self.pronounelem, is_phoneme = True) + else: + #print "Spell... " + self.las.say_text("Spell..." + self.elem) + + def play_game(self,mode = "start"): + if mode == "start": + self.this_level_size = 7 + self.this_level_max_error = 3 + self.wordid_list = self.las.load_wordid(self.this_level_size + self.this_level_max_error) + self.this_level_num_words = len(self.wordid_list) + self.this_level_words_left = self.this_level_num_words + self.word_index = 1 + self.wordid = self.wordid_list[self.word_index] + self.play_word() + elif mode == "next word": + self.this_level_words_left -= 1 + if self.this_level_num_words == 0: + if self.las.words_correct == self.this_level_size: + self.display_console("You have crossed this level") + self.las.say_text("congratulation") + self.display_console("Please select new level to play the game") + else: + self.display_console("Sorry you are not able to cross this level") + self.las.say_text("Game Over") + self.display_console("Please select lower level to play the game") + self.play_game("start") + self.word_index += 1 + self.wordid = self.wordid_list[self.word_index] + self.play_word() + + ########################Display Methods######################### + + def display_console(self, data, newline = True ): + if newline == True: + data = "\n" + data + self.console_text_buffer.insert_at_cursor(data) + + #def display_main_output(self, data, newline = True, clear_previous = True): + #if clear_previous == True: + #self.main_output_buffer.set_text(data) + #elif newline == True: + #text = "\n" + data + #self.main_output_buffer.insert_at_cursor(data) + #else: + #self.main_output_buffer.insert_at_cursor(data) + + + ################################################################ + + def game_exit(self): + self.las.exit_game() + gtk.main_quit() + + ########################Game Logic############################## + + ################################################################ + + + + def main(self): + # All PyGTK applications must have a gtk.main(). Control ends here + # and waits for an event to occur (like a key press or mouse event). + gtk.main() + +# If the program is run directly or passed as an argument to the python +# interpreter then create a HelloWorld instance and show it +if __name__ == "__main__": + gui = ListenSpell(is_stand_alone = True) + #gui.__init__() + #gui.play_game("start") + #gui.main() -- cgit v0.9.1