【问题标题】:Remove Duplicate Image From wx.StaticBitmap从 wx.StaticBitmap 中删除重复的图像
【发布时间】:2016-03-25 07:22:14
【问题描述】:

我遇到了wx.StaticBitmap 的问题,当我在其中使用SetBitmap 时,它会显示图像但总是复制图像:一张作为静态背景,一张作为我显示的位图。请看这个截图 -> duplicate_image_wxstaticbitmap.png

这是我的代码:

import wx
import wx.xrc
from PIL import Image

class MyFrame1 ( wx.Frame ):

    def __init__( self, parent ):
        wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size( 440,514 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

        self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )

        bSizer1 = wx.BoxSizer( wx.VERTICAL )

        sbSizer1 = wx.StaticBoxSizer( wx.StaticBox( self, wx.ID_ANY, u"COMPOSITE" ), wx.VERTICAL )

        self.composite_sb = wx.StaticBitmap( sbSizer1.GetStaticBox(), wx.ID_ANY, wx.NullBitmap, wx.DefaultPosition, wx.Size( 400,400 ), 0 )
        sbSizer1.Add( self.composite_sb, 0, wx.ALL, 5 )


        bSizer1.Add( sbSizer1, 1, wx.ALL|wx.EXPAND, 5 )

        self.load_img_btn = wx.Button( self, wx.ID_ANY, u"Load Image", wx.DefaultPosition, wx.DefaultSize, 0 )
        bSizer1.Add( self.load_img_btn, 0, wx.ALL|wx.EXPAND, 5 )


        self.SetSizer( bSizer1 )
        self.Layout()

        self.Centre( wx.BOTH )

        self.load_img_btn.Bind( wx.EVT_BUTTON, self.loadImage )

    def loadImage( self, event ):
        myPilImage = Image.open('result.tiff')
        myWxImage = wx.EmptyImage( myPilImage.size[0], myPilImage.size[1] )
        myWxImage.SetData( myPilImage.convert( 'RGB' ).tobytes() )  
        #myWxImage = myWxImage.Scale(400,400)   
        self.composite_sb.SetBitmap(wx.BitmapFromImage(myWxImage))

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame1(None)
    frame.Show()
    app.MainLoop()

【问题讨论】:

  • 稍微调整框架大小(拖动框架边框)会发生什么?
  • 如果我调整框架大小会影响整个布局。我只是想知道为什么它是重复的图像我的代码有什么问题吗?

标签: python bitmap wxpython wxwidgets wxformbuilder


【解决方案1】:

这种行为(在 MSW 上同时在两个不同位置显示位图)与 this wxwidgets trac ticket 类似。应该解决,但似乎仍然是一个问题。 这似乎也与本机 MSW 控件的行为有关,它将位图在分配的空间中居中(而不是将其放在左上角)。如果您正在搜索,可以找到更多关于此问题的票证。

一个简单的解决方法是:

def loadImage( self, event ):
    # ...
    self.composite_sb.SetBitmap(wx.BitmapFromImage(myWxImage))
    self.Layout()

显然self.Layout() 强制框架中的控件“决定”应该在哪里绘制内容。

【讨论】:

    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多