Ram*_*hum 5 python user-interface scroll wxpython
在我的wxPython应用程序中,我创建了wx.ScrolledPanel一个wx.StaticBitmap需要滚动的大型应用程序.
滚动条确实出现,我可以用它们滚动,但我也希望能够用鼠标滚轮和键盘上的箭头键滚动.如果"Home","Page Up"和其他键也可以按预期运行,那将是很好的.
我该怎么做呢?
更新:
我看到了问题.ScrolledPanel能够滚动,但仅在焦点处于焦点时.问题是,我如何成为焦点?即使点击它也不会这样做.只有当我在其中放置一个文本控件时,我才可以专注于它,然后滚动滚轮.但我不想在其中有文本控件.那么我该如何让它集中注意力呢?
更新2:
这是一个显示这种现象的代码示例.取消注释以查看文本控件如何使鼠标滚轮工作.
import wx, wx.lib.scrolledpanel
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
scrolled_panel = \
wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1)
scrolled_panel.SetupScrolling()
text = "Ooga booga\n" * 50
static_text=wx.StaticText(scrolled_panel, -1, text)
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(static_text, wx.EXPAND, 0)
# Uncomment the following 2 lines to see how adding
# a text control to the scrolled panel makes the
# mouse wheel work.
#
#text_control=wx.TextCtrl(scrolled_panel, -1)
#sizer.Add(text_control, wx.EXPAND, 0)
scrolled_panel.SetSizer(sizer)
self.Show()
if __name__=="__main__":
app = wx.PySimpleApp()
my_frame=MyFrame(None, -1)
#import cProfile; cProfile.run("app.MainLoop()")
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
我希望这是一个可以满足您要求的示例。(编辑:回想起来,这不太有效,例如,当有两个滚动面板时......我会将其留在这里,以便人们可以对它进行否决或其他任何操作。)基本上,我将所有内容都放在面板中框架(通常是个好主意),然后将焦点设置到该主面板。
import wx
import wx, wx.lib.scrolledpanel
class MyFrame(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
main_panel = wx.Panel(self, -1)
main_panel.SetBackgroundColour((150, 100, 100))
self.main_panel = main_panel
scrolled_panel = \
wx.lib.scrolledpanel.ScrolledPanel(parent=main_panel, id=-1)
scrolled_panel.SetupScrolling()
self.scrolled_panel = scrolled_panel
cpanel = wx.Panel(main_panel, -1)
cpanel.SetBackgroundColour((100, 150, 100))
b = wx.Button(cpanel, -1, size=(40,40))
self.Bind(wx.EVT_BUTTON, self.OnClick, b)
self.b = b
text = "Ooga booga\n" * 50
static_text=wx.StaticText(scrolled_panel, -1, text)
main_sizer=wx.BoxSizer(wx.VERTICAL)
main_sizer.Add(scrolled_panel, 1, wx.EXPAND)
main_sizer.Add(cpanel, 1, wx.EXPAND)
main_panel.SetSizer(main_sizer)
text_sizer=wx.BoxSizer(wx.VERTICAL)
text_sizer.Add(static_text, 1, wx.EXPAND)
scrolled_panel.SetSizer(text_sizer)
self.main_panel.SetFocus()
self.Show()
def OnClick(self, evt):
print "click"
if __name__=="__main__":
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1)
frame.Show(True)
self.SetTopWindow(frame)
return True
app = MyApp(0)
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
对于键盘控制,例如通过主页键设置操作,我认为您需要绑定到这些事件,并做出适当的响应,例如使用mypanel.Scroll(0,0)该home键(并记住调用evt.Skip()您不执行操作的键盘事件) 。(编辑:我认为没有任何用于滚动的默认键绑定。我不确定我是否想要任何绑定,例如,如果滚动面板中有滚动面板会发生什么?)