Ejemplo n.º 1
0
class HonorsGUI(EasyFrame):
    """Contains the GUI"""
    def __init__(self):
        EasyFrame.__init__(self, title='Markov Bot GUI')

        #row 0
        self.addLabel('Build:', 0, 0)
        self.addLabel('', 0, 9)

        #row 1
        self.addLabel('Input file name:', 1, 0)
        self.input_file_name = self.addTextField('',
                                                 1,
                                                 1,
                                                 columnspan=8,
                                                 width=50,
                                                 sticky=N + W)

        #row 2
        self.addLabel('Tokenizer select:', 2, 0)
        self.tokenizer_select = self.addRadiobuttonGroup(2,
                                                         1,
                                                         columnspan=7,
                                                         orient=HORIZONTAL)
        self.tokenizer_select_basic = self.tokenizer_select.addRadiobutton(
            'basic')
        self.tokenizer_select_group_aware = self.tokenizer_select.addRadiobutton(
            'group aware')
        self.tokenizer_select.setSelectedButton(
            self.tokenizer_select_group_aware)

        #row 3
        self.build_button = self.addButton('Build',
                                           3,
                                           0,
                                           columnspan=9,
                                           command=self.build)

        #row 4
        self.addLabel('Generate:', 4, 0)

        #row 5
        self.addLabel('Output select:', 5, 0)
        self.output_select = self.addRadiobuttonGroup(5,
                                                      1,
                                                      columnspan=2,
                                                      orient=HORIZONTAL)
        self.output_select_console = self.output_select.addRadiobutton(
            'console')
        self.output_select_file = self.output_select.addRadiobutton('file')
        self.output_select.setSelectedButton(self.output_select_console)
        self.addLabel('Output file name:', 5, 3)
        self.output_file_name = self.addTextField('',
                                                  5,
                                                  4,
                                                  columnspan=5,
                                                  width=50,
                                                  sticky=N + W)

        #row 6
        self.addLabel('Start string:', 6, 0)
        self.start_string = self.addTextField('', 6, 1, sticky=N + W)
        self.addLabel('Stop string:', 6, 2)
        self.stop_string = self.addTextField('.', 6, 3, sticky=N + W)
        self.addLabel('Limit:', 6, 4)
        self.limit = self.addIntegerField(15, 6, 5, sticky=N + W)

        #row 7
        self.addLabel('Repeat:', 7, 0)
        self.repeat = self.addIntegerField(3, 7, 1, sticky=N + W)
        self.repeat_select = self.addRadiobuttonGroup(7,
                                                      2,
                                                      columnspan=4,
                                                      orient=HORIZONTAL)
        self.repeat_select_new_line = self.repeat_select.addRadiobutton(
            'new line')
        self.repeat_select_append = self.repeat_select.addRadiobutton('append')
        self.repeat_select.setSelectedButton(self.repeat_select_new_line)

        #row 8
        self.generate_button = self.addButton('Generate',
                                              8,
                                              0,
                                              columnspan=9,
                                              command=self.generate)

        #row 9
        self.console = self.addTextArea('', 9, 0, columnspan=9)

        #row 10
        self.addLabel('By Jeffrey Matthews', 10, 0)

        #non GUI members
        self.mbot = MarkovBot()

    def build(self):
        fname = self.input_file_name.getText()
        if not fname:
            self.cprint('Error: file name is empty')
            return
        if fname.find('.') == -1:
            fname = fname + '.txt'

        try:
            text = Tokenizer.read_all(fname)
        except FileNotFoundError:
            self.cprint('Error: file not found')
            return

        if self.tokenizer_select.getSelectedButton(
        ) == self.tokenizer_select_group_aware:
            tokens = Tokenizer.group_aware(text)
        else:
            tokens = Tokenizer.basic(text)

        self.cprint('Building from ' + fname + '...')
        self.mbot.build(tokens)
        self.cprint('Successfully added ' + str(len(tokens)) + ' tokens')

    def cprint(self, s):
        self.console.appendText(s)
        self.console.appendText('\n')

    def generate(self):
        try:
            count = self.limit.getNumber()
        except ValueError:
            self.cprint('Error: limit field is not a number')
            return
        start = self.start_string.getText()
        if start:  #if the start string is not empty make sure it is a key
            if start not in self.mbot.keys():
                self.cprint("Error: the start string '" + start +
                            "' is not a key")
                return
        else:  #if the start string is empty set it to none
            start = None
        stop = self.stop_string.getText()
        if not stop:
            stop = None
        try:
            repeat = self.repeat.getNumber()
        except ValueError:
            self.cprint('Error: repeat field is not a number')
            return

        if self.output_select.getSelectedButton() == self.output_select_file:
            fname = self.output_file_name.getText()
            if not fname:
                self.cprint(
                    'Error: output to file selected but no output file name given'
                )
                return
            if fname.find('.') == -1:
                fname = fname + '.txt'
            file = open(fname, mode='w')

            self.cprint('Writing result to ' + fname)
            for i in range(repeat):
                tokens = self.mbot.walk(count, start, stop)
                result = Formatter.capped_sentences(tokens)
                if i != 0:
                    if self.repeat_select.getSelectedButton(
                    ) == self.repeat_select_new_line:
                        file.write('\n')
                    else:
                        file.write(' ')
                file.write(result)
            file.close()

        else:
            for i in range(repeat):
                tokens = self.mbot.walk(count, start, stop)
                result = Formatter.capped_sentences(tokens)
                if i != 0:
                    if self.repeat_select.getSelectedButton(
                    ) == self.repeat_select_new_line:
                        self.console.appendText('\n')
                    else:
                        self.console.appendText(' ')
                self.console.appendText(result)
            self.console.appendText('\n')