我在显示面板背景图片时遇到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。 但它以不同的方式解释整个窗口边界,我的布局看起来错位 我不确定我的客户在运行应用程序时会看到什么。
任何建议将不胜感激。
答案 0 :(得分:1)
感谢您的关注。 问题已经解决了。 现在我也删除了背景面板并直接在框架背景上绘制。 背景小组似乎无关紧要。
问题是由两个问题引起的。 首先,我们确实需要双缓冲。如果我们直接将staticBitmap设置为canvasbitmap,则框架背景仍为空白。
其次,我试图在帧实例化之后动态声明帧的其他一些面板。这似乎也导致了这个问题。 现在我在框架实例化中实例化了所有面板 然后在一个无知的日子之后问题就消失了。
但是这种没有说服力的规则有时会让新手感到非常沮丧和疲惫。