Когда-нибудь вам обязательно понадобится сделать так, чтобы две параллельных таблицы скроллились синхронно. Также вы можете захотеть использовать данный метод для того, чтобы находить различия между этими таблицами. Иногда вам нужно сравнить два фрагмента данных, или даже два фото.
В данной статье мы поместим две таблицы в SplitterWindow и синхронизируем их. Учтите, что показанные мною в примерах способы будут работать только в случае скроллинга посредством полосы прокрутки, а не колёсика мыши.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Когда вы запустить тот фрагмент кода, который я предлагаю в качестве примера, то должны будете увидеть что-то вроде:
Теперь же давайте взглянем на код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
import wx import wx.grid as gridlib class ScrollSync(object): def __init__(self, panel1, panel2): self.panel1 = panel1 self.panel2 = panel2 self.panel1.grid.Bind(wx.EVT_SCROLLWIN, self.onScrollWin1) self.panel2.grid.Bind(wx.EVT_SCROLLWIN, self.onScrollWin2) def onScrollWin1(self, event): if event.Orientation == wx.SB_HORIZONTAL: self.panel2.grid.Scroll(event.Position, -1) else: self.panel2.grid.Scroll(-1, event.Position) event.Skip() def onScrollWin2(self, event): if event.Orientation == wx.SB_HORIZONTAL: self.panel1.grid.Scroll(event.Position, -1) else: self.panel1.grid.Scroll(-1, event.Position) event.Skip() class GridPanel(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) self.grid = gridlib.Grid(self, style=wx.BORDER_SUNKEN) self.grid.CreateGrid(25,8) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(self.grid, 1, wx.EXPAND) self.SetSizer(sizer) class MainPanel(wx.Panel): """""" def __init__(self, parent): """Constructor""" wx.Panel.__init__(self, parent) split = wx.SplitterWindow(self) panelOne = GridPanel(split) panelTwo = GridPanel(split) ScrollSync(panelOne, panelTwo) split.SplitVertically(panelOne, panelTwo) split.SetSashGravity(0.5) sizer = wx.BoxSizer(wx.VERTICAL) sizer.Add(split, 1, wx.EXPAND) self.SetSizer(sizer) class MainFrame(wx.Frame): """""" def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Sync Grids", size=(800,400)) panel = MainPanel(self) self.Show() if __name__ == "__main__": app = wx.App(False) frame = MainFrame() app.MainLoop() |
Фрагмент, который интересует нас больше всего – это класс ScrollSync. Он принимает две панели, в которых таблицы расположены в качестве аргументов. Когда мы привязываем таблицы к wx.EVT_SCROLLWIN и, пока он запущен, мы изменяем положение противоположной таблиц.
В данной момент у этого кода есть несколько ограничений. Он работает только тогда, когда вы физически передвигаете полосу прокрутки используя курсор своей мышки. Если вы будете использовать колёсико мышки, или же клавиши PageUp и PageDown, таблицы синхронизироваться не будут. Я пытался добавить поддержку прокрутки посредством колёсика мышки, используя событие wx.EVT_MOUSEWHEEL, но оно не обеспечивает такого варианта Ориентации или Позиции, который обеспечивает wx.EVT_SCROLLWIN. Проще – его Position является wx.Point, а wx.EVT_SCROLLWIN, в свою очередь, возвращает Integer. Добавление этих битов – весьма забавный процесс, но они остаются за бортом данной статьи.
Итоги
К этому моменту вы уже должны иметь чёткое представление о том, как синхронизировать скроллинг в двух окнах без чьей-либо помощи. Это отличный способ сделать так, чтобы ваше приложение, вернее его функционал, качественно выделялся на фоне остальных.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»