首先,ScrolledWindow和ScrolledPanel的关系是
object
--+ |Object
--+ |EvtHandler
--+ |Window
--+ |Panel
--+ |ScrolledWindow
--+ |PyScrolledWindow
--+ | ScrolledPanel
参考wxpython api (http://www.wxpython.org/docs/api/wx.ScrolledWindow-class.html)
其中有三个方法
- SetScrollRate(xstep, ystep)
- SetScrollBars(pixelsPerUnitX, pixelsPerUnitY, noUnitsX, noUnitsY, xPos=0, yPos=0, noRefresh=False)
- Scroll(x, y)
其中有个概念叫滚动单位:即滚动条一次移动所引起窗口中的移动距离。
先说方法2,SetScrollBars:
- pixelsPerUnitX和pixelsPerUnitY即滚动单位大小,接下来的两个参数noUnitsX和noUnitsY使你能够按滚动单位设置滚动区域的尺寸。
- 换句话说,滚动区域的象素尺寸是(pixelsPerUnitX * noUnitsX, pixelsPerUnitY * noUnitsY)。
- 参数xPos和yPos以滚动单位(非像素)为单位,它设置滚动条的初始位置。
- 如果参数noRefresh为true,那么就阻止了在因SetScrollbars()的调用而引起的滚动后的窗口的自动刷新。
再说方法1,SetScrollRate:
- xstep和ystep其实就是SetScrollBars中的pixelsPerUnitX和pixelsPerUnitY。
- 这两个方法的区别在于:
- SetScrollRate要和另外一个方法SetVirtualSize(size)(它是Window类中的方法,因为继承关系所以也可以调用)一起使用,size = (pixelsPerUnitX * noUnitsX, pixelsPerUnitY * noUnitsY)
最后说方法3,Scroll:
- Scroll(x, y)函数很容易理解,就是将窗口滚动到某个位置,但是要注意的是,x, y参数是滚动单位。
为什么要强调这个,因为当我在动态添加组件,需要将按钮位置固定在屏幕上时,需要调用Scroll来处理。
代码如下:
panel.SetScrollbars(0, 20, 0, 20)
sizer.Layout() # 动态插入组件后要调用Layout来重新布局
y = self.btn.GetPosition()[1] # 获取按钮位置
panel.Scroll(0, (y - self.size[1] / 2) / 20) # self.size为窗口大小