wxPython горизонтальная прокрутка с помощью shift+ колесико мыши
Кажется, wx.lib.scrolledpanel поддерживает вертикальную прокрутку колесика мыши по умолчанию, но не поддерживает горизонтальную прокрутку при нажатой клавише Shift. Я не могу найти способ активировать его. Это вообще где-то или я должен написать соответствующий обработчик событий самостоятельно? Как это сделать, если так?
3 ответа
Это лучший ответ в 2022 году.
ИспользоватьBind(wx.EVT_MOUSEWHEEL)
а затем в обработчике дляevent:wx.MouseEvent
делать
if event.shiftDown:
event.SetWheelAxis(wx.MOUSE_WHEEL_HORIZONTAL)
event.Skip()
Для горизонтальной прокрутки необходимо навести указатель мыши на горизонтальную полосу прокрутки, а затем вращать колесико мыши.
import wx
import wx.lib.scrolledpanel as scrolled
class TestPanel(scrolled.ScrolledPanel):
def __init__(self, parent):
scrolled.ScrolledPanel.__init__(self, parent, -1)
vbox = wx.BoxSizer(wx.VERTICAL)
desc1 = wx.StaticText(self, -1, "1. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
desc2 = wx.StaticText(self, -1, "2. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
desc3 = wx.StaticText(self, -1, "3. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
desc4 = wx.StaticText(self, -1, "4. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
desc5 = wx.StaticText(self, -1, "5. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
desc6 = wx.StaticText(self, -1, "6. These lines are really quite long and should not fit in the window requiring you to use the horizontal scroll bar or position the mouse over the scroll bar and spin the wheel\n\n")
vbox.Add(desc1, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(desc2, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(desc3, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(desc4, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(desc5, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
vbox.Add(desc6, wx.NewId(), wx.ALIGN_LEFT|wx.ALL, 5)
self.SetSizer(vbox)
self.SetAutoLayout(1)
self.SetupScrolling(scroll_x=True, scroll_y=True, rate_x=20, rate_y=20, scrollToTop=True, scrollIntoView=True)
app = wx.App(0)
frame = wx.Frame(None, wx.ID_ANY,size=(500,200))
tp = TestPanel(frame)
frame.Show()
app.MainLoop()
Кажется, что вы можете использовать событие wx.EVT_SCROLLWIN и убедиться, что оно вызывает простой метод, который устанавливает ориентацию события на wx.HORIZONTAL (когда вы нажали shift.)
sw = wx.ScrolledWindow(p, style = wx.HSCROLL)
def onScroll(event):
event.SetOrientation(wx.HORIZONTAL)
event.Skip()
sw.Bind(wx.EVT_SCROLLWIN, onScroll)
Это заставит окно прокрутки прокручиваться в горизонтальном направлении, когда вы прокручиваете "в нем" колесом мыши. Вот небольшой код, который можно вставить в консоль.
app = wx.App()
f = wx.Frame(None)
p = wx.Panel(f)
sw = wx.ScrolledWindow(p)
sw.SetScrollbars(20,20,500,500)
bb = wx.Button(sw, label='big button', pos=(0,0), size=(500,500))
def onScroll(event):
event.SetOrientation(wx.HORIZONTAL)
event.Skip()
sw.Bind(wx.EVT_SCROLLWIN, onScroll)
sz = wx.BoxSizer(wx.HORIZONTAL)
sz.Add(sw, 1, wx.EXPAND)
p.SetSizer(sz)
sz.Fit(f)
f.Show(); app.MainLoop()