我正在尝试将Panel子类化,并且使用下面的代码,我遇到了这个问题:
在右侧,正常的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()
答案 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实例完全相同,这就是我想要在这种情况下实现的。