Пример #1
0
class InstructionsWindow(tk.Toplevel):
    def __init__(self, parent, instructions, *args, **kwargs):
        tk.Toplevel.__init__(self, parent.root, *args, **kwargs)
        self.geometry(fm.geometry)
        self.parent = parent
        self.current_sel = 0

        text_frame = tk.Frame(self)

        self.listbox = tk.Listbox(text_frame, width=20)
        self.instructions = instructions

        for k in self.instructions.keys():
            self.listbox.insert(tk.END, k)

        self.listbox.pack(side=tk.LEFT, fill=tk.Y)
        self.listbox.bind('<<ListboxSelect>>', self.on_lb_select)
        self.listbox.selection_set(0, 0)

        self.text = FancyText(text_frame, height=150, wrap=tk.WORD, edit=True)
        self.text.bind('<KeyRelease>', self.on_text_modify)

        vsb = tk.Scrollbar(self)
        vsb.pack(side=tk.RIGHT, fill=tk.Y)
        vsb.config(command=self.text.yview)
        self.text.pack(expand=tk.YES,
                       fill=tk.X,
                       side=tk.LEFT,
                       padx=vsb.winfo_width())
        self.text.insert(1.0, self.instructions.get(0))
        self.text.config(yscrollcommand=vsb.set)

        text_frame.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH)

    def on_text_modify(self, event):
        self.instructions.set(self.current_sel, event.widget.get(1.0, tk.END))
        if self.current_sel == 0:
            self.parent.status_text.d_delete(1.0, tk.END)
            self.parent.status_text.d_insert(1.0,
                                             event.widget.get(1.0, tk.END))

    def on_lb_select(self, event):
        cs = self.listbox.curselection()[0]
        if cs != self.current_sel:
            self.current_sel = cs
            self.text.delete(1.0, tk.END)
            self.text.insert(tk.END, self.instructions.get(cs))
Пример #2
0
class TextWindow(tk.Toplevel):
    def __init__(self,
                 parent,
                 view=None,
                 font=fm.text_font,
                 title='',
                 wrap=tk.WORD,
                 *args,
                 **kwargs):
        tk.Toplevel.__init__(self, parent.root, *args, **kwargs)
        self.parent = parent
        self.title(title)
        # self.results = None
        self.results = []
        self.complete = True
        self.order = [True, False, True, True, False]
        self.rows_n = 0

        if view is not None:
            inst = self.parent.instructions.get(view)

            instructions_frame = tk.Frame(self)
            self.instructions_lbl = tk.Label(instructions_frame,
                                             text=inst,
                                             justify=tk.LEFT)

            self.instructions_lbl.bind("<Configure>", self.set_label_wrap)
            self.instructions_lbl.pack(side=tk.LEFT, expand=tk.YES, fill=tk.X)
            instructions_frame.pack(side=tk.TOP, expand=tk.YES, fill=tk.X)

        top_frame = tk.Frame(self)

        self.text = FancyText(top_frame,
                              gui_obj=self.parent,
                              wrap=wrap,
                              padx=10,
                              pady=5,
                              font=font)
        self.text.pack(side=tk.LEFT, expand=tk.YES, fill=tk.BOTH)

        self.text.tag_config('text_bg', background=fm.text_bg)
        self.text.tag_config('white', background=fm.white)
        self.text.tag_config('heading', font=fm.bold_ms_font)
        # give priority to formatting of selected text over that of tags
        self.text.tag_raise('sel')

        self.text.tag_bind('heading', '<Button-1>', self.heading_click)

        self.vsb = tk.Scrollbar(top_frame)
        self.vsb.pack(side=tk.RIGHT, fill=tk.Y)
        self.vsb.config(command=self.text.yview)
        self.text.config(yscrollcommand=self.vsb.set)

        top_frame.pack(side=tk.TOP, expand=tk.YES, fill=tk.BOTH)

    def set_label_wrap(self, event):
        wraplength = event.width - 12  # 12, to account for padding and borderwidth
        event.widget.configure(wraplength=wraplength)

    def add_result(self, result):

        self.text.insert(tk.END, result.row(), fm.list_bgs[self.rows_n % 2])
        self.results.append(result)
        self.rows_n += 1

    def heading_click(self, event, tag='heading'):
        if self.complete:
            # get the index of the mouse click
            index = self.text.index("@%s,%s" % (event.x, event.y))

            # get the indices of all "adj" tags
            tag_indices = list(self.text.tag_ranges('heading'))

            # iterate them pairwise (start and end index)
            for start, end in zip(tag_indices[0::2], tag_indices[1::2]):
                # check if the tag matches the mouse click index
                if self.text.compare(start, '<=', index) and self.text.compare(
                        index, '<', end):
                    # return string between tag start and end
                    clicked_heading = self.text.get(start, end)
                    for i, h in enumerate(self.results[0].heading()):
                        if clicked_heading.startswith(h):
                            self.text.delete(2.0, tk.END)
                            self.text.insert(tk.END, '\n\n')
                            self.order[i] = not self.order[i]
                            for k, res in enumerate(
                                    sorted(self.results,
                                           key=attrgetter(Result.attrs[i]),
                                           reverse=self.order[i])):
                                self.text.insert(tk.END, res.row(),
                                                 fm.list_bgs[k % 2])
                            break