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

问题描述:

我试图子类面板,用下面的代码,我打这个问题:摆脱wxPython 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

您试图在左侧面板上显示的位图大小是多少? – Igor

+0

Hi @Igor - 在这个例子中没有位图(也没有它的大小)这是我觉得困惑。 – sdaau

+1

如果你最大化框架,滚动条消失? – Igor

对,我觉得我得到了它。因为当我调整窗口大小时,滚动条的大小不会改变,这表明问题与内容大小无关(这里没有内容,首先是)。

一些尝试后,我发现这行代码:

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实例,这正是我想要在这种情况下,实现。