Auto-Scroll fehlerhaft

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

hi
ich habe in meinem Code das Problem, daß wenn man mit der Maus das Fenster so weit vergrößert, daß die Scrollbar(s) verschwinden und dann
wieder zurück verkleinert, die Scrollbars dann nicht mehr richtig angezeigt werden.
Würde gern wissen, was da falsch ist :)
Nach meinem Verständnis liegt das an der Funktion 'on_configure', da nach dem Start erstmal alles korrekt funktioniert.
Würde mich über Hilfe freuen.

Code: Alles auswählen

import tkinter as tk
import os
import pandas as pd


class Main(tk.Tk):
    def __init__(self,
                 main_path, input_folder, process_folder, db_folder
                 ):
        tk.Tk.__init__(self)
        # self.geometry('600x300+450+100')
        self.main_path = main_path
        self.process_folder = process_folder
        self.db_folder = db_folder

        self.preview = {}
        # Auslesen einer Excel-Datei...
        for file_name in os.listdir(input_folder):
            if file_name.endswith(".xlsx"):
                if "~$" not in file_name:
                    input_file = os.path.join(input_folder, file_name)
                    xlsx = pd.ExcelFile(input_file)
                    if file_name not in self.preview:
                        self.preview[file_name] = {}
                    for sheet_name in xlsx.sheet_names:
                        df = pd.DataFrame(pd.read_excel(input_file, sheet_name=sheet_name))
                        if not df.empty:
                            self.preview[file_name][sheet_name] = pd.read_excel(input_file,
                                                                                header=None,
                                                                                sheet_name=sheet_name
                                                                                )
        self.preview_frame = tk.Frame(self, bg="yellow")

    def main(self):
        self.preview_frame.pack(fill=tk.BOTH, expand=True)
        Preview_Table(self.preview_frame, 'Name_der_Excel_Datei.xlsx', self.preview)


class Preview_Table(tk.Frame):
    def __init__(self, preview_frame, process_name, preview_dict):
        tk.Frame.__init__(self)
        self.preview_frame = preview_frame
        self.process_name = process_name
        self.preview_dict = preview_dict

        label_bg = "white"
        label_fg = "black"

        key, values = list(self.preview_dict[self.process_name].items())[0]
        # print('Dateiname:', self.process_name)
        # print('Tabellenname:', key)
        # print("Zeilen:", values)
        # print('---')

        canvas_yscroll = tk.Frame(self.preview_frame, bg="green")
        canvas_yscroll.pack(side=tk.TOP, fill=tk.BOTH, expand=True)

        # Add a canvas in that frame.
        self.canvas = tk.Canvas(canvas_yscroll)
        self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

        vsbar = tk.Scrollbar(canvas_yscroll, orient=tk.VERTICAL, command=self.canvas.yview)
        vsbar.pack(side=tk.RIGHT, fill=tk.Y)
        self.canvas.configure(yscrollcommand=vsbar.set)

        hsbar = tk.Scrollbar(self.preview_frame, orient=tk.HORIZONTAL, command=self.canvas.xview)
        hsbar.pack(side=tk.BOTTOM, fill=tk.X)
        self.canvas.configure(xscrollcommand=hsbar.set)

        label_frame = tk.Frame(self.canvas, bd=2)

        for i, cell_list in values.items():
            for j, cell_text in enumerate(cell_list.tolist()):
                label = tk.Label(label_frame,
                                 padx=7,
                                 pady=7,
                                 relief=tk.RIDGE,
                                 bg=label_bg,
                                 fg=label_fg,
                                 text=cell_text)
                label.grid(column=i, row=j, sticky=tk.NSEW)

        self.canvas.create_window((0, 0), window=label_frame, anchor=tk.NW)

        label_frame.update_idletasks()
        self.bbox = self.canvas.bbox(tk.ALL)
        self.canvas.configure(scrollregion=self.bbox,
                              xscrollcommand=lambda mx_f, mx_l: self.auto_scroll(hsbar, mx_f, mx_l),
                              yscrollcommand=lambda my_f, my_l: self.auto_scroll(vsbar, my_f, my_l)
                              )

        self.canvas.bind('<Configure>', self.on_configure)

    # Hier ist der Fehler (denke ich)
    def on_configure(self, event):
        self.canvas.configure(scrollregion=self.bbox)

    @staticmethod
    def auto_scroll(sbar, first, last):
        first, last = float(first), float(last)
        if first <= 0 and last >= 1:
            sbar.pack_forget()
        else:
            sbar.pack()
        sbar.set(first, last)


if __name__ == '__main__':
    path_main = os.getcwd()
    path_input_folder = os.path.join(path_main, "input")
    path_process_folder = os.path.join(path_main, 'process')
    path_db_folder = os.path.join(path_main, "database")
    frontend = Main(path_main,
                    path_input_folder,
                    path_process_folder,
                    path_db_folder)
    frontend.main()
    frontend.mainloop()

Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Es ist sehr umständlich, einen Beispielcode zu haben, der nicht lauffähig ist, weil man die Dateien nicht hat. Das lesen der Excel-Dateien ist sehr umständlich, vor allem, weil immer wieder die selbe Datei gelesen wird. Statt os.listdir solltest Du pathlib.Path.glob benutzen. Das Lesen der Daten gehört auch in eine eigene Funktion. `Main.main` sieht auch komisch aus. Die zwei Zeilen gehören wohl in __init__. In `auto_scroll` hast Du andere Parameter für `pack` als Du beim erstenmal in Preview_Table.__init__ benutzt.
Antworten