wx.panel不显示背景位图

时间:2017-03-20 07:09:25

标签: bitmap wxpython background-image panel frame

我在显示面板背景图片时遇到wxpython问题。 我在win10 surface pro上声明了一个大小为800x600的wx.frame。 然后在框架中,我首先声明了相同大小的背景面板。 然后我用一个相同大小的位图填充它的staticbitmap。

然后我在中间底部宣布了一个尺寸为320x320的小面板。 我还用一个320x320的位图填充了它的staticbitmap。

但不知何故,第一个背景面板始终是背景颜色(240,240,240,255),没有我放在staticbitmap中的图片。 但是,小面板的图片始终显示正确。

代码如下。

class backgroundPanel(wx.Panel):
    def __init__(self, *args, **kw):
        x = 0
        y = 0
        w = 800
        h = 600
        kw.update({'pos':wx.Position(x, y), 'size':wx.Size(w, h)})
        super(backgroundPanel, self).__init__(*args, **kw)
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)

        currentBitmap = util.queryGuiFrame().canvasBackgroundBitmap
        self.staticBitmap = wx.StaticBitmap(self, wx.ID_ANY, currentBitmap)
        self.Enable() 
        self.Refresh() 
        return 





class actioner(wx.Panel):
    def __init__(self, *args, **kw):
        x = 240
        y = 360
        w = 320
        h = 320
        newCanvasState = kw.pop('newCanvasState', None)
        print("New actioner from state: ", canvasState, " to :", newCanvasState)
        kw.update({'pos':wx.Position(x, y), 'size':wx.Size(w, h)})
        super(actioner, self).__init__(*args, **kw)
        self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM)
        self.currentBitmap = util.queryGuiFrame().testerSittingBitmap

        if newCanvasState == None:
            #draw the initial actioner
            currentBitmap = util.queryGuiFrame().testerSittingBitmap
        elif newCanvasState == 'standbyFirst' \
        or newCanvasState == 'standby' \
        or newCanvasState == 'clockwise1' \
        or newCanvasState == 'clockwise2' \
        or newCanvasState == 'counterClockwise1' \
        or newCanvasState == 'counterClockwise2':
            print("drawing actioner standby at (", util.queryGuiFrame().actionerPanelX, ",",
                util.queryGuiFrame().actionerPanelY, ")")
            currentBitmap = util.queryGuiFrame().testerCuteBitmap

        self.staticBitmap = wx.StaticBitmap(self, wx.ID_ANY, currentBitmap)
        self.Enable(False) 
        self.Refresh() 
        return 

我已经为此工作了一天,毫不知道wxpython隐藏了什么。 我检查了两个面板的属性,没有看到任何区别。 我还尝试按声明顺序切换两个面板 它是相同的,只有较小的面板现在被大米色背景面板隐藏。

我还尝试将背景面板位图放到框架的staticbitmap中。结果是相同的,所有(240,240,240,255)像素的面板。

另外,令人讨厌的是,IDE对wxpython做出了不同的假设和解释。 我使用了pyscriptor,似乎问题少了。 特别是,需要声明整个窗口的边界 但是pyscriptor不接受子线程中的断点。 所以我切换到了PyDev。 但它以不同的方式解释整个窗口边界,我的布局看起来错位 我不确定我的客户在运行应用程序时会看到什么。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

感谢您的关注。 问题已经解决了。 现在我也删除了背景面板并直接在框架背景上绘制。 背景小组似乎无关紧要。

问题是由两个问题引起的。 首先,我们确实需要双缓冲。如果我们直接将staticBitmap设置为canvasbitmap,则框架背景仍为空白。

其次,我试图在帧实例化之后动态声明帧的其他一些面板。这似乎也导致了这个问题。 现在我在框架实例化中实例化了所有面板 然后在一个无知的日子之后问题就消失了。

但是这种没有说服力的规则有时会让新手感到非常沮丧和疲惫。