Horizontale Scrollbar in Treeview umschalten

Fragen zu Tkinter.
Antworten
DMD-OS
User
Beiträge: 165
Registriert: Freitag 28. Dezember 2018, 13:52

Hi
Ich habe ein Problem mit dem Umschalten meiner horizontalen Scrollbar in Treeview.
Und zwar habe ich einen Mastertree (BAUMSTRUKTUR - Gesamtansicht), der nicht umschaltbar ist
und einen Slavetree (TABELLEN- oder BAUMSTRUKTUR - Feinansicht), der durch einen Button umschaltbar ist.
Ich habe überall eine Scrollbar mit Autofunktion eingebaut, die für sich alle korrekt funktionieren,
soll heißen:
Wenn ich das Programm starte, kann ich im Mastertree (im Bild oben) ein Event anklicken, das im Slavetree (im Bild unten) dann dargestellt wird.
Im Slavetree (unten) funktioniert die horizontale Scrollbar für beide Seiten immer korrekt, SOLANGE MAN NICHT UMSCHALTET.
Sobald man aber von Tabellenstruktur auf Baumstruktur umschaltet (oder umgekehrt), reagiert die horizontale Auto-Scrollbar nicht mehr richtig.
Ich versuche schon seit längerem eine Lösung zu finden, was mich dazu getrieben hat, mein Problem hier zu posten.
Ich habe den Verdacht, daß es an den unterschiedlichen Column-Breiten liegen kann.
In der Baumansicht habe ich einen Header, der über die gesamte Frame-Breite geht, beim Umschalten auf Tabellenansicht wechselt der Header in eine gestückelte Form.
Hab schon sehr viel ausprobiert, ohne Erfolg :( :( :oops:

Bild zur Tabellenstruktur:
Bild

Nach Umschalten auf Baumstruktur, sollte die Scrollbar nicht falsch reagieren :)
Leider ist sie hier aber sichtbar :(
Bild

Natürlich fehlt noch der Code, in gekürzter Form:

Code: Alles auswählen

# Erklärungsversuch:
# Nach Klick im Mastertree (BAUMANSICHT - Gesamtstruktur) wird
# die Auswahl in tabellarischer Form im Slavetree (TABELLENSTRUKTUR - Feinansicht) dargestellt.
# Was man in den Bildern nicht sehen, ist ein Umschaltbutton, der von Baumansicht auf Tabellenansicht
# schaltet. Jedesmal, wenn etwas angeklickt wird, wird die "Tabellen- oder Baum-Weitenkontrolle"
# für die entsprechenden Struktur neu geladen.
# (Ich habe hier meinen Code gekürzt zusammengefasst.)
# Dargestellt ist hier der Wechsel zwischen Baum- und Tabellenansicht:
# Mit dem Wechselbutton wird immer "switch_TREESTRUCTURE" angesteuert, die Scrollbar wird dann geladen, Text wird dargestellt
# und als letztes kommt dann die jeweilige Weitenkontrolle "slavetree_WIDTHCONTROL".

def switch_TREESTRUCTURE(self, event):
    self.slave_overwrite.set(self.slave_tables[self.slave_table_pointer])

    self.vsb_table = ttk.Scrollbar(self.treeFrame_slave, orient="vertical")
    self.hsb_table = ttk.Scrollbar(self.treeFrame_slave, orient="horizontal")

    self.tree_slave = ttk.Treeview(self.treeFrame_slave, style='Slave.Treeview',
                                   yscrollcommand=lambda sy_f, sy_l:
                                   self.auto_scroll_SLAVE(self.vsb_table, sy_f, sy_l),
                                   xscrollcommand=lambda sx_f, sx_l:
                                   self.auto_scroll_SLAVE(self.hsb_table, sx_f, sx_l)
                                   )
    self.tree_slave.grid(row=0, column=0, sticky='nsew')

    self.vsb_table['command'] = self.tree_slave.yview
    self.vsb_table.grid(column=1, row=0, sticky='ns')
    self.hsb_table['command'] = self.tree_slave.xview
    self.hsb_table.grid(column=0, row=1, sticky='we')

    # ---> SLAVETREE
    # SWITCH BETWEEN NODE- AND TABLE-STRUCTURE - SLAVETREE
    if self.slave_table_pointer == len(self.slave_tables) - 1:
        self.slave_table_pointer = 0
        # NODE STRUCTURE - SLAVE SWITCH
        self.node_STRUCTURE(self.data_SHOWTREE(), sum_node=[])
    else:
        self.slave_table_pointer += 1
        # TABLE STRUCTURE - SLAVE SWITCH
        self.table_STRUCTURE(self.data_SHOWTREE())


# NODE STRUCTURE - SLAVETREE
def node_STRUCTURE(self, data_dict, sum_node):
    [...]
    self.slavetree_WIDTHCONTROL(column_list=[])


#  TABLE STRUCTURE - SLAVETREE
def table_STRUCTURE(self, data_dict):
    [...]
    self.slavetree_WIDTHCONTROL(columns)


def slavetree_WIDTHCONTROL(self, column_list, level=None):
    # NODE STRUCTURE - SLAVE SWITCH
    if self.slave_table_pointer == 0:
        open_opt_slave = tk.BooleanVar()
        level_str_slave = tk.StringVar()
        slave_width_calculation = []
        def slave_wide_CALCULATION(lvl, tree_slave, font_data_slave):
            for node_slave in tree_slave.get_children(lvl):
                level_str_slave.set(node_slave)
                open_opt_slave.set(tree_slave.item(node_slave, option='open'))
                if open_opt_slave.get() is True:
                    txt_opened_slave = tree_slave.item(node_slave)['text']
                    slave_width_calculation.append(get_TEXTWIDTH(txt_opened_slave, font_data_slave))
                    slave_wide_CALCULATION(level_str_slave.get(), tree_slave, font_data_slave)
                else:
                    txt_closed_slave = tree_slave.item(node_slave)['text']
                    slave_width_calculation.append(get_TEXTWIDTH(txt_closed_slave, font_data_slave))
        slave_wide_CALCULATION(level, self.tree_slave, self.slave_font_tree)
        if slave_width_calculation:
            header_slave_calculate = int(max(slave_width_calculation) * 1.12)
            slave_node_width = - 25
            self.treeFrame_slave.update()
            if self.treeFrame_slave.winfo_width() >= header_slave_calculate:
                slave_node_width += int(self.treeFrame_slave.winfo_width())
            else:
                slave_node_width += header_slave_calculate
            self.tree_slave.column("#0", width=slave_node_width, stretch=False)

    # TABLE STRUCTURE - SLAVE SWITCH
    elif self.slave_table_pointer == 1:
        num_intvar = len(column_list)
        intvar_list = [tk.IntVar() for _ in range(num_intvar)]
        for ele_intvar in intvar_list:
            ele_intvar.set(75)
        for child_element in self.tree_slave.get_children():
            row_list = (self.tree_slave.item(child_element)["values"])
            col_counter = 0
            for row_index, row_element in enumerate(row_list):
                ele_row_width = get_TEXTWIDTH(row_element, self.slave_font_tree) + 20
                if ele_row_width >= intvar_list[col_counter].get():
                    intvar_list[col_counter].set(int(ele_row_width))
                self.tree_slave.column(column_list[col_counter], width=int(intvar_list[col_counter].get()),
                                       stretch=False)
                if col_counter == len(column_list) - 1:
                    col_counter = 0
                else:
                    col_counter += 1

@staticmethod
def auto_scroll_SLAVE(sbar, first, last):
    first, last = float(first), float(last)
    if first <= 0 and last >= 1:
        sbar.grid_remove()
    else:
        sbar.grid()
    sbar.set(first, last)
Freue mich über jegliche Anteilnahme von Euch, schon klar nä?
Antworten