wxpython - изменить размер изображения без мерцания?

1

Я новичок в wxPython и GUI в целом. Сейчас приложение просто отображает панель инструментов, панель состояния и следующую панель. Панель содержит boxSizer с staticBitmap в ней. Я пытаюсь изменить размер изображения, чтобы он соответствовал его контейнеру всякий раз, когда изменяется размер окна, но я сталкиваюсь с большим количеством мерцания.

Резюме
resizeImage() вызывается при изменении размера окна (EVT_SIZE fire)
resizeImage() изменяет размер панели в соответствии с новыми измерениями, а затем масштабирует изображение с помощью scaleImage() и помещается в staticBitmap

resizeImage() в основном захватывает объект изображения, изменяет его размер, устанавливает его в растровое изображение и затем устанавливает его в отображаемую статическую карту.

Код

class Canvas(wx.Panel):
"""Panel used to display selected images"""

#---------------------------------------------------------------------------
def __init__(self, parent):
    """Constructor"""
    wx.Panel.__init__(self, parent)

    # Globals
    self.image        = wx.EmptyImage(1,1)
    self.control    = wx.StaticBitmap(self, wx.ID_ANY, 
                                     wx.BitmapFromImage(self.image))    
    self.background    = wx.BLACK
    self.padding    = 5
    self.imageList    = []
    self.current    = 0
    self.total        = 0

    # Register Events
    Publisher().subscribe(self.onLoadDirectory, ("load directory"))
    Publisher().subscribe(self.resizeImage, ("resize window"))

    # Set Layout
    self.mainSizer = wx.BoxSizer(wx.VERTICAL)
    self.mainSizer.Add(self.control, 1, wx.ALL|wx.CENTER|wx.EXPAND,
            self.padding)
    self.SetSizer(self.mainSizer)
    self.SetBackgroundColour(self.background)

#---------------------------------------------------------------------------
def scaleImage(self, image, maxWidth, maxHeight):
    """asd"""
    width    = image.GetWidth()
    height    = image.GetHeight()
    ratio    = min( maxWidth / width, maxHeight/ height );
    image    = image.Scale(ratio*width, ratio*height, wx.IMAGE_QUALITY_HIGH)
    result    = wx.BitmapFromImage(image)

    return result

#---------------------------------------------------------------------------
def loadImage(self, image):
    """Load image"""
    self.image = wx.Image(image, wx.BITMAP_TYPE_ANY)
    bmp = wx.BitmapFromImage(self.image)
    w, h = self.mainSizer.GetSize()
    w = w - self.padding*2
    h = h - self.padding*2
    bmp = self.scaleImage(self.image, w, h)        
    self.control.SetBitmap(bmp)

#---------------------------------------------------------------------------
def getImageIndex(self, path):
    """Retrieve index of image from imagePaths"""
    i = 0
    for image in self.imagePaths:
        if image == path:
            return i
        i += 1
    return -1

#---------------------------------------------------------------------------
def resizeImage(self, event):
    self.SetSize(event.data)
    if self.total:
        w = event.data[0] - self.padding*2
        h = event.data[1] - self.padding*2
        bmp = self.scaleImage(self.image, w, h)
        self.control.SetBitmap(bmp)

#---------------------------------------------------------------------------
def onLoadDirectory(self, event):
    """Load the image and compile a list of image files from directory"""
    self.folderPath        = os.path.dirname(event.data)
    self.imagePaths        = glob.glob(self.folderPath + "\\*.jpg")
    self.total            = len(self.imagePaths)
    self.current        = self.getImageIndex(event.data)
    self.SetSize(self.GetSize())
    self.loadImage(self.imagePaths[self.current])
Теги:
user-interface
image
wxpython
flicker

2 ответа

1
Лучший ответ

Попробуйте рисунок на двойной буферизации вместо DC используя StaticBitmap.

  • 0
    Это сработало. Благодарю.
1

В вашем методе resizeImage это может помочь добавить замораживание и оттепель, например:

def resizeImage(self, event):
    self.SetSize(event.data)
    if self.total:
        w = event.data[0] - self.padding*2
        h = event.data[1] - self.padding*2
        self.Freeze()
        bmp = self.scaleImage(self.image, w, h)
        self.control.SetBitmap(bmp)
        self.Thaw()
  • 0
    Это не совсем работало (мерцание уменьшено, но не исчезло). Я не знал о заморозках или оттепелях, поэтому я посмотрю на них. Благодарю.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню