摆脱wxPython Panel子类中的滚动条?

时间:2017-04-08 12:30:32

标签: wxpython wxwidgets

我正在尝试将Panel子类化,并且使用下面的代码,我遇到了这个问题:

panel-test.png

在右侧,正常的wx.Panel被实例化,并且可见,它没有滚动条。在左边,子类TImagePanel被实例化(以与wx.Panel相同的方式) - 并且可见,有两条细绿线,这是Ubuntu 14.04上的MATE桌面显示滚动条的方式(如果将鼠标悬停在它们上面,你得到一个滚动条元素,它显示在屏幕截图上;这是在Ubuntu 14.04,MATE桌面,python 2.7,python-wxgtk2.8 2.8.12.1)。

我可以在TImagePanel中做些什么来摆脱这些滚动条?

TImagePanel.py

import wx

# via https://www.blog.pythonlibrary.org/2010/03/18/wxpython-putting-a-background-image-on-a-panel/
class TImagePanel(wx.Panel):
  def __init__(self, parent, style):
    """Constructor"""
    wx.Panel.__init__(self, parent=parent, style=style)
    self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) #(wx.BG_STYLE_ERASE)
    self.frame = parent
    self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground)

  def OnEraseBackground(self, evt):
    """
    Add a picture to the background
    """
    # yanked from ColourDB.py
    dc = evt.GetDC()

    if not dc:
      dc = wx.ClientDC(self)
      rect = self.GetUpdateRegion().GetBox()
      dc.SetClippingRect(rect)
    dc.SetBackground(wx.Brush(self.GetBackgroundColour())) # SO: 11766759
    dc.Clear()

paneltest.py

import wxversion
wxversion.select("2.8")
import wx, wx.html
import sys

from TImagePanel import TImagePanel

class Frame(wx.Frame):
  def __init__(self, *args, **kwds):
    kwds["style"] = wx.DEFAULT_FRAME_STYLE
    wx.Frame.__init__(self, *args, **kwds)

    self.label = wx.StaticText(self, wx.ID_ANY, "TImagePanel below left: ")
    bt_main = wx.Button(self, label="Click ME")
    bt_main.Bind(wx.EVT_BUTTON, self.BtnClickHandler)

    sizer_vmain_app = wx.BoxSizer(wx.VERTICAL)
    sizer_vmain_app.Add(self.label, proportion=0, flag=wx.EXPAND, border=0)
    sizer_vmain_app.Add(bt_main, proportion=0, flag=0, border=0)

    self.mypanel = TImagePanel(self, wx.ID_ANY)
    normpanel = wx.Panel(self, wx.ID_ANY)
    self.mypanel.SetBackgroundColour(wx.Colour(200, 200, 200))
    normpanel.SetBackgroundColour(wx.Colour(200, 200, 200))

    sizer_hpanel = wx.BoxSizer(wx.HORIZONTAL)
    sizer_hpanel.Add(self.mypanel, proportion=1, flag=wx.ALL|wx.EXPAND, border=10)
    sizer_hpanel.Add(normpanel, proportion=1, flag=wx.ALL|wx.EXPAND, border=10)
    sizer_vmain_app.Add(sizer_hpanel, proportion=1, flag=wx.EXPAND, border=0)

    self.SetSizer(sizer_vmain_app)
    self.Layout()

  def BtnClickHandler(self, event):
    print("Am clicked")

if __name__ == "__main__":
  app = wx.PySimpleApp(0)
  wx.InitAllImageHandlers()
  app_frame = Frame(None, wx.ID_ANY, "")
  app.SetTopWindow(app_frame)
  app_frame.Show()
  app.MainLoop()

1 个答案:

答案 0 :(得分:1)

是的,我想我明白了。因为,当我调整窗口大小时,滚动条的大小不会改变,这表明问题与内部内容的大小无关(这里没有内部内容,开头)。

经过一些尝试,我注意到这行代码:

self.mypanel = TImagePanel(self, wx.ID_ANY)

显然,这是从正常的wx.Panel实例中复制的,该实例具有签名__init__(self, parent, id, pos, size, style, name),确实parent之后的参数是id

但是,在我的TImagePanel子类中,构造函数具有签名:__init__(self, parent, style)。所以基本上,这个wx.ID_ANY应该引用一个ID,当父类在构造函数中初始化时传播为 style !因此,它启用了所有类型的东西,并且很可能wx.ALWAYS_SHOW_SB强制显示滚动条。

然后,我需要做的就是投入:

self.mypanel = TImagePanel(self, 0)

...因为样式显然是位掩码的,所以“不要改变样式”标志应为0(否则我无法找到wx.NO_STYLE标志);或者更明确地使用预定义的wx样式:

self.mypanel = TImagePanel(self, wx.NO_BORDER)

在上述任何一种情况下,滚动条都会消失,而子类的项看起来与wx.Panel实例完全相同,这就是我想要在这种情况下实现的。