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



Bild zur Tabellenstruktur:

Nach Umschalten auf Baumstruktur, sollte die Scrollbar nicht falsch reagieren

Leider ist sie hier aber sichtbar


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)