2 wx HyperTreeLists之间的同步滚动并不完美

问题描述 投票:0回答:2

简介:我需要在2个树对象之间创建一个并排的差异查看器,在其中我可以为每个项目完全自定义文本颜色和背景颜色。

Python版本:3.5.4

wxPython版本:4.0.3

结构:wx.Dialog包含使用水平boxsizer的2个派生的HyperTreeList。

代码(只有必需部分的剥离版本;树的大小始终与同步展开和折叠的相同:]

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()

Initial Start

After 1 nudge of WheelDown

PS:我使用2个超树列表,每个1列,而不是1个超树列表2个列,因为我不知道如何更改第二列中项目的颜色。如果您碰巧知道该怎么做,那也可以解决这种麻烦。

python-3.x wxpython
2个回答
0
投票

[如果您使用的是最新的Phoenix安装,则HyperTreeList具有SetItemBackgroundColour(item,colour,col)方法来设置每列的背景颜色。


0
投票

想通了。

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()与我在想的相反。

© www.soinside.com 2019 - 2024. All rights reserved.