Esempio n. 1
0
    def __init__(self, parent, controller, **kwargs):
        tk.Frame.__init__(self, parent, **kwargs)
        self.controller = controller
        self.configure(bg=theme.background_color)

        self.grid_columnconfigure(0, weight=1)

        # top_navbar
        top_frame = tk.Frame(self)
        top_frame.configure(bg=theme.background_color_accent)
        top_frame.grid(sticky="ew")
        # top_frame.pack_propagate(False)

        top_frame.grid_columnconfigure(0, weight=1)
        top_frame.grid_columnconfigure(1, weight=1)
        top_frame.grid_columnconfigure(2, weight=1)
        top_frame.grid_rowconfigure(0, minsize=100, weight=1)

        # top_navbar common
        download_button = common.Button(
            top_frame,
            command=lambda: controller.set_current_frame("CreateCorpusView"),
            text="Download New Data",
        )
        download_button.configure(padx=10, pady=10)

        create_report_button = common.Button(
            top_frame,
            command=lambda: controller.set_current_frame("CreateReportView"),
            text="Create New Report",
        )
        create_report_button.configure(padx=10, pady=10)

        lexicon_button = common.Button(
            top_frame,
            command=lambda: controller.set_current_frame("CreateLexiconView"),
            text="Create New Lexicon",
        )
        lexicon_button.configure(padx=10, pady=10)

        top_frame.grid(row=0, column=0, columnspan=1)
        download_button.grid(row=0, column=0)
        create_report_button.grid(row=0, column=1)
        lexicon_button.grid(row=0, column=2)

        welcome_header = common.Label(self,
                                      text="Welcome!",
                                      justify=tk.LEFT,
                                      size=20)
        welcome_header.grid(column=0, row=1)

        welcome_message = common.Label(
            self,
            text=
            "To get started, select 'Download New Data' or 'Create New Lexicon'.",
            justify=tk.LEFT,
            size=12,
        )
        welcome_message.grid(column=0, row=2)
Esempio n. 2
0
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(bg=theme.background_color)

        self.selected_lexicon = util.Observable(None)
        self.lexicon_names = []

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)

        self.listbox = common.Listbox(
            self,
            exportselection=0,
        )
        self.listbox.bind("<<ListboxSelect>>",
                          self.on_select)  # select lexicon

        self.listbox.grid(column=0, row=1, sticky="nesw")

        top_frame = tk.Frame(self)
        top_frame.configure(bg=theme.background_color_accent)
        top_frame.grid(column=0, row=0, sticky="ew")
        top_frame.grid_columnconfigure(0, minsize=100, weight=1)
        top_frame.grid_columnconfigure(1, minsize=100, weight=1)
        top_frame.grid_columnconfigure(2, minsize=100, weight=1)
        top_frame.grid_rowconfigure(0, minsize=100, weight=1)

        self.open_button = common.Button(
            top_frame,
            self.open_lexicon,
            "Edit Selected",
        )
        self.open_button.grid(column=0, row=0)

        create_lexicon_button = common.Button(top_frame, self.create_lexicon,
                                              "New lexicon")
        create_lexicon_button.grid(column=1, row=0)

        self.delete_button = common.Button(
            master=top_frame,
            command=lambda: self.controller.delete_lexicon(
                self.selected_lexicon.get()),
            text="Delete Selected",
        )
        self.delete_button.grid(column=2, row=0)

        scrollbar = tk.Scrollbar(self)
        scrollbar.grid(column=1, row=1, sticky="ns")

        self.listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.listbox.yview)

        self.controller.lexica.subscribe(self.update_listbox)
        self.selected_lexicon.subscribe(self.update_common)
Esempio n. 3
0
    def __init__(self, parent: tk.Frame, controller: "App"):
        tk.Frame.__init__(self, parent)
        self.controller = controller
        self.configure(bg=theme.background_color)

        self.selected_report = util.Observable[Optional[str]](None)
        self.report_names: List[str] = []

        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)

        self.listbox = common.Listbox(
            self,
            exportselection=0,
        )
        self.listbox.bind("<<ListboxSelect>>", self.on_select)  # select report

        self.listbox.grid(column=0, row=1, sticky="nesw")

        top_frame = tk.Frame(self)
        top_frame.configure(bg=theme.background_color_accent)
        top_frame.grid(column=0, row=0, sticky="ew")
        top_frame.grid_columnconfigure(0, minsize=100, weight=1)
        top_frame.grid_columnconfigure(1, minsize=100, weight=1)
        top_frame.grid_columnconfigure(2, minsize=100, weight=1)
        top_frame.grid_rowconfigure(0, minsize=100, weight=1)

        self.open_button = common.Button(
            top_frame,
            self.open_report,
            "Open Selected",
        )
        self.open_button.grid(column=0, row=0)

        create_report_button = common.Button(top_frame, self.create_report,
                                             "New Report")
        create_report_button.grid(column=1, row=0)

        self.delete_button = common.Button(
            master=top_frame,
            command=self.delete_report,
            text="Delete Selected",
        )
        self.delete_button.grid(column=2, row=0)

        scrollbar = tk.Scrollbar(self)
        scrollbar.grid(column=1, row=1, sticky="ns")

        self.listbox.config(yscrollcommand=scrollbar.set)
        scrollbar.config(command=self.listbox.yview)

        self.controller.reports.subscribe(self.update_listbox)
        self.selected_report.subscribe(self.update_common)
Esempio n. 4
0
    def update_dashboard(self, _):
        current_report = self.controller.current_report.get()

        frame = self.content.scrollable_frame

        for widget in frame.winfo_children():
            widget.destroy()

        if current_report is None:
            self.report = None
            return

        print("report updated, report is", current_report)

        self.report = self.controller.reports.get()[current_report]

        common.Label(
            frame,
            text=self.report.name,
            justify=tk.LEFT,
            size=20,
        ).grid(column=0, row=0, sticky="w")

        common.Label(
            frame,
            text=f"Corpus: {self.report.corpus_name}",
            justify=tk.LEFT,
        ).grid(column=0, row=1, sticky="w")

        common.Label(
            frame,
            text=f"Lexica: {', '.join(self.report.lexicon_names)}",
            justify=tk.LEFT,
        ).grid(column=0, row=2, sticky="w")

        self.run_progress = ttk.Progressbar(
            frame, orient=tk.HORIZONTAL, length=100, mode="indeterminate"
        )
        run_report_button = common.Button(
            frame,
            self.run_report,
            "Run Report",
        )
        if self.run_in_progress:
            self.run_progress.grid(column=0, row=3)
        else:
            run_report_button.grid(column=0, row=3)

        if self.report.complete:
            report_results = common.Label(
                frame, text=self.report.get_results(), justify=tk.LEFT
            )
            report_results.grid(column=0, row=4)
Esempio n. 5
0
    def __init__(self, parent, controller, **kwargs):
        tk.Frame.__init__(self, parent, **kwargs)
        self.controller = controller
        self.configure(bg=theme.background_color)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

        # labels
        self.reddit_label = common.Label(self, text="Download from Reddit")
        self.reddit_label.grid(columnspan=2, sticky="new")
        self.start_label = common.Label(self,
                                        text="Start Date and (optional) Time")
        self.start_label.grid(column=0, row=1, sticky="new")
        self.end_label = common.Label(self,
                                      text="End Date and (optional) Time")
        self.end_label.grid(column=0, row=2, sticky="new")
        self.subs_label = common.Label(self, text="Subreddit(s), one per line")
        self.subs_label.grid(column=0, row=3, sticky="new")
        self.name_label = common.Label(self, text="Corpus Name")
        self.name_label.grid(column=0, row=4, sticky="new")

        self.start_entry = common.Entry(self)
        self.start_entry.grid(column=1, row=1, sticky="new")
        self.end_entry = common.Entry(self)
        self.end_entry.grid(column=1, row=2, sticky="new")
        self.subs_entry = tk.Text(self)
        self.subs_entry.grid(column=1, row=3, sticky="new")
        self.name_entry = common.Entry(self)
        self.name_entry.grid(column=1, row=4, sticky="new")

        # button
        bottom_frame = tk.Frame(self)
        bottom_frame.configure(bg=theme.background_color_accent)
        bottom_frame.grid(column=0, columnspan=2, sticky="nesw")
        bottom_frame.grid_columnconfigure(0, weight=1)
        bottom_frame.grid_columnconfigure(2, weight=1)

        self.download_button = common.Button(
            bottom_frame,
            command=self.download,
            text="Download",
        )
        self.download_button.configure(padx=10, pady=5)
        self.download_button.grid(column=1, row=4, sticky="sew")
        self.download_in_progress = False

        self.download_progress = ttk.Progressbar(bottom_frame,
                                                 orient=tk.HORIZONTAL,
                                                 length=100,
                                                 mode="indeterminate")
Esempio n. 6
0
    def __init__(self, parent: tk.Frame, controller: "App", **kwargs: Any):
        tk.Frame.__init__(self, parent, **kwargs)
        self.controller = controller
        self.configure(bg=theme.background_color)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

        # labels
        self.corpus_label = common.Label(self, text="Select a Corpus")
        self.corpus_label.grid(column=0, row=0, rowspan=1, sticky="sew")
        self.lexicon_label = common.Label(
            self, text="Select Lexica (click to select multiple)")
        self.lexicon_label.grid(column=1, row=0, rowspan=1, sticky="sew")

        self.corpus_listbox = common.Listbox(self, exportselection=0)
        self.corpus_listbox.grid(column=0, row=1, sticky="nsew")

        self.lexicon_listbox = common.Listbox(self,
                                              selectmode="multiple",
                                              exportselection=0)
        self.lexicon_listbox.grid(column=1, row=1, sticky="nsew")

        self.corpus_names: List[str] = []
        self.lexicon_names: List[str] = []

        self.controller.corpora.subscribe(self.update_corpora)
        self.controller.lexica.subscribe(self.update_lexica)

        # button
        bottom_frame = tk.Frame(self)
        bottom_frame.configure(bg=theme.background_color_accent)
        bottom_frame.grid(column=0, columnspan=2, sticky="nesw")
        bottom_frame.grid_columnconfigure(0, weight=1)
        bottom_frame.grid_columnconfigure(2, weight=1)

        report_name_label = common.Label(bottom_frame, text="Report Name:")
        report_name_label.grid(column=0, row=0)

        self.report_name_entry = common.Entry(bottom_frame)
        self.report_name_entry.grid(column=1, row=0, sticky="ns")

        report_params_button = common.Button(
            bottom_frame,
            command=self.create_report,
            text="Confirm Selections",
        )
        report_params_button.grid(column=2, row=0, sticky="ns")

        report_params_button.configure(padx=10, pady=5)
Esempio n. 7
0
    def __init__(self, parent: tk.Frame, controller: "App", **kwargs: Any):
        tk.Frame.__init__(self, parent, **kwargs)
        self.controller = controller
        self.configure(bg=theme.background_color_accent)
        self.grid_columnconfigure(0, weight=1)
        # self.grid_columnconfigure(1, weight=1)

        # labels
        self.name_label = common.Label(self, text="Name:")
        self.name_label.grid(column=0, row=0, rowspan=1, sticky="w")

        self.name_entry = common.Entry(self)
        self.name_entry.grid(column=0, row=1, sticky="w")

        self.words_label = common.Label(self, text="Words:")
        self.words_label.grid(column=0, row=2, sticky="w")

        self.words_text = common.Text(self)
        self.words_text.grid(column=0, row=3, sticky="ns")
        self.grid_rowconfigure(3, weight=1)

        # button
        bottom_frame = tk.Frame(self)
        bottom_frame.configure(bg=theme.background_color_accent)
        bottom_frame.grid(column=0, columnspan=1, sticky="nesw")
        bottom_frame.grid_columnconfigure(0, weight=1)
        # bottom_frame.grid_columnconfigure(2, weight=1)

        self.confirm_button = common.Button(
            bottom_frame,
            command=self.create_lexicon,
            text="Confirm Selections",
        )
        self.controller.current_lexicon.subscribe(self.update_info)
        self.confirm_button.grid(column=1, row=0, sticky="ns")

        self.confirm_button.configure(padx=10, pady=5)
Esempio n. 8
0
    def __init__(self, parent, controller, **kwargs):
        tk.Frame.__init__(self, parent, **kwargs)
        self.controller = controller
        self.configure(bg=theme.background_color_accent)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

        # labels
        self.name_label = common.Label(self, text="Name")
        self.name_label.grid(column=0, row=0, rowspan=1, sticky="sew")
        self.words_label = common.Label(self, text="Words")
        self.words_label.grid(column=0, row=1, rowspan=1, sticky="new")

        self.name_listbox = common.Entry(self)
        self.name_listbox.grid(column=1, row=0, sticky="nsew")

        self.words_listbox = tk.Text(self)
        self.words_listbox.grid(column=1, row=1, sticky="nsew")

        # button
        bottom_frame = tk.Frame(self)
        bottom_frame.configure(bg=theme.background_color_accent)
        bottom_frame.grid(column=0, columnspan=2, sticky="nesw")
        bottom_frame.grid_columnconfigure(0, weight=1)
        bottom_frame.grid_columnconfigure(2, weight=1)

        report_params_button = common.Button(
            bottom_frame,
            command=self.create_lexicon,
            text="Confirm Selections",
        )
        self.controller.current_frame.subscribe(self.update_info)
        report_params_button.grid(column=1, row=0, sticky="ns")

        report_params_button.configure(padx=10, pady=5)
Esempio n. 9
0
    def update_dashboard(self, _: Any) -> None:
        """Reset the page when the current report changes"""
        frame = self.content.interior
        frame.grid_columnconfigure(0, weight=1)

        for widget in frame.winfo_children():
            widget.destroy()

        reports = self.controller.reports.get()
        current_report = self.controller.current_report.get()

        if current_report is None or current_report not in reports:
            self.report = None
            self.in_progress_observer.stop()
            self.progress_observer.stop()
            return

        self.report = reports[current_report]
        assert self.report

        self.progress_observer.set_observable(self.report.progress, call=False)
        self.in_progress_observer.set_observable(self.report.in_progress, call=False)

        common.Label(
            frame,
            text=self.report.name,
            justify=tk.LEFT,
            size=20,
        ).grid(column=0, row=0, sticky="w")

        common.Label(
            frame,
            text=f"Corpus: {self.report.corpus_name}",
            justify=tk.LEFT,
        ).grid(column=0, row=1, sticky="w")

        common.Label(
            frame,
            text=f"Lexica: {', '.join(self.report.lexicon_names)}",
            justify=tk.LEFT,
        ).grid(column=0, row=2, sticky="w")

        run_report_button = common.Button(
            frame,
            self.run_report,
            "Run Report",
        )

        if self.report.in_progress.get():
            self.progressbar = ttk.Progressbar(
                frame, orient=tk.HORIZONTAL, length=100, mode="determinate"
            )
            self.progressbar.grid(column=0, row=3)
            return

        run_report_button.grid(column=0, row=4)
        include_body_button = common.Checkbutton(
            frame,
            text="Include body of comments in report",
            variable=self.include_body,
        )
        include_body_button.grid(column=0, row=3)

        if self.report.complete:
            export_button = common.Button(
                frame,
                self.export,
                "Export as TSV",
            )
            export_button.grid(column=0, row=5)

            current_row = 6

            df = self.report.get_results()
            figure = self.make_timeseries_figure(df)
            if figure is not None:
                canvas = FigureCanvasTkAgg(figure, master=frame)
                canvas.draw()

                canvas_widget = canvas.get_tk_widget()
                canvas_widget.grid(column=0, row=current_row, sticky="nesw")
                current_row += 1

            for lexicon_name in self.report.lexicon_names:
                if lexicon_name == DefaultLexicon.name:
                    continue

                df = self.report.get_frequencies()
                figure = self.make_frequency_figure(df, lexicon_name)

                if figure is None:
                    continue

                canvas = FigureCanvasTkAgg(figure, master=frame)
                canvas.draw()
                canvas_widget = canvas.get_tk_widget()
                canvas_widget.grid(column=0, row=current_row, sticky="nesw")
                current_row += 1