Синхронизированная прокрутка не идеальна между двумя недействительными HyperTreeLists - PullRequest
0 голосов
/ 04 ноября 2019

Введение: мне нужно создать средство просмотра различий между двумя объектами дерева, в котором я могу полностью настроить цвет текста и цвет фона для каждого элемента.

Версия 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-м столбце. Если вы знаете, как это сделать, это также решит эту неприятность.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2019

Понял.

def __init__(...):
    ...
    self.main_window.Bind(wx.EVT_MOUSEWHEEL, self.on_scroll_change)

def on_scroll_change(self, event):
    delta = event.GetWheelDelta()
    rotation = event.GetWheelRotation()
    lines_per_action = event.GetLinesPerAction()
    lines = rotation / delta
    if lines != 0:
        lines = lines * lines_per_action
        vsx, vsy = self.twin_tree.main_window.GetViewStart()
        scroll_to = vsy - lines
        self.twin_tree.main_window.Scroll(-1, scroll_to)
        self.main_window.Scroll(-1, scroll_to)

event.Skip () сделал противоположное тому, что я думал.

0 голосов
/ 05 ноября 2019

Если вы используете современную установку Phoenix, то HyperTreeList имеет метод SetItemBackgroundColour (item, color, col) для установки цвета фона для столбца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...