摆脱wxPython Panel子类中的滚动条?
我试图子类面板,用下面的代码,我打这个问题:摆脱wxPython 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()
对,我觉得我得到了它。因为当我调整窗口大小时,滚动条的大小不会改变,这表明问题与内容大小无关(这里没有内容,首先是)。
一些尝试后,我发现这行代码:
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,当父类在构造函数中初始化时,传播为样式!所以,它启用了各种各样的东西,并且很有可能会强制显示滚动条的wx.ALWAYS_SHOW_SB
。
所有我需要做的,那么,是摆在代替:
self.mypanel = TImagePanel(self, 0)
...因为风格显然bitmasked,“不改文风”标志应为0(我不能”否则找到一个wx.NO_STYLE标志);或者是预定义的WX风格更为明确:
self.mypanel = TImagePanel(self, wx.NO_BORDER)
在这两种情况下,滚动条消失,子类的项目看起来等同于wx.Panel实例,这正是我想要在这种情况下,实现。
您试图在左侧面板上显示的位图大小是多少? – Igor
Hi @Igor - 在这个例子中没有位图(也没有它的大小)这是我觉得困惑。 – sdaau
如果你最大化框架,滚动条消失? – Igor