Введение: мне нужно создать средство просмотра различий между двумя объектами дерева, в котором я могу полностью настроить цвет текста и цвет фона для каждого элемента.
Версия Python: 3.5.4
wxPython версия: 4.0.3
Структура: wx.Dialog, содержащая 2 производных HyperTreeLists с использованием горизонтального boxsizer.
Код (версия с удалением только с необходимыми частями; деревья всегда будут иметьтот же размер, что и при развертывании, и при свернении):
import wx
import wx.lib.agw.hypertreelist as HTL
class AutoColumnSizeHTL(HTL.HyperTreeList):
def __init__(self, parent, agw_style, column_name):
super().__init__(parent, agwStyle=agw_style)
self.parent = parent
self.AddColumn(column_name)
self.SetColumnWidth(0, 350)
self.main_window = self.GetMainWindow()
self.root = self.AddRoot("")
self.current_item = None
self.twin_tree = None
self.main_window.Bind(wx.EVT_SCROLLWIN, self.on_scroll_change)
def add_new_item(self, text, fg_color):
self.current_item = self.main_window.AppendItem(self.root, text)
self.main_window.SetItemTextColour(self.current_item, fg_color)
def add_new_item_child(self, text, fg_color, bg_color):
child_item = self.main_window.AppendItem(self.current_item, text)
self.main_window.SetItemTextColour(child_item, fg_color)
self.main_window.SetItemBackgroundColour(child_item, bg_color)
def set_twin_tree(self, twin):
self.twin_tree = twin
def OnSize(self, event):
row_width = self.parent.GetSize()[0] / 2
scrollbar_width = 21
self.SetColumnWidth(0, row_width-scrollbar_width)
super().OnSize(event)
def on_scroll_change(self, event):
scroll_units = self.main_window.GetScrollPos(wx.VERTICAL)
self.twin_tree.main_window.Scroll(-1, scroll_units)
event.Skip()
Начальный запуск
После 1 смещения WheelDown
PS: я использую 2 гипертрелистов с 1 столбцом каждый вместо 1 гипертреелиста с 2 столбцами, потому что я не мог понять, как изменить цвет элемента во 2-м столбце. Если вы знаете, как это сделать, это также решит эту неприятность.