linux - Windows 上的 wx python 图像刷新

标签 linux windows image wxpython

我有一个涉及显示多个图像的应用程序。这在 linux 上工作正常,但在 Windows 上,在绘制图像时会出现恼人的闪光。最好将其视为屏幕左上角的一个小方 block ,其中会出现一闪而过的颜色。我没有以正确的方式接近这个要求吗?或者我应该应用一些修复来克服 Windows 效果吗?或者它只是我在 Windows 上的版本(我只有一个可以测试它:Windows 7 Ultimate)?

我已经在 refresh_sizer_cell 中尝试了卡住和解冻,但它没有像我预期的那样运行

import wx


class ImageSizer(wx.Frame):
    BACKGROUND_COLOUR = (246, 244, 242)
    def __init__(self, parent, title):
        super(ImageSizer, self).__init__(parent, title=title)

        self.main_sizer = wx.GridBagSizer()
        self.SetSizer(self.main_sizer)

        cmd_reset = wx.Button(self, label='Reset')
        cmd_reset.Bind(wx.EVT_BUTTON, self.on_cmd_reset_click)

        cmd_cancel = wx.Button(self, label='Cancel')
        cmd_cancel.Bind(wx.EVT_BUTTON, self.on_cmd_cancel_click)

        self.main_sizer.Add((400, 0), pos=(0, 0), span=(1, 2))    # dummy to position Available
        self.main_sizer.Add((0, 100), pos=(1, 0), span=(1, 1))    # dummy to position Buttons
        self.main_sizer.Add(cmd_reset, pos=(2, 2), flag=wx.LEFT | wx.TOP, border=10)
        self.main_sizer.Add(cmd_cancel, pos=(2, 3), flag=wx.RIGHT | wx.BOTTOM | wx.TOP | wx.ALIGN_RIGHT, border=10)

        self.SetBackgroundColour(self.BACKGROUND_COLOUR)
        self.shape_types = {'available': 0, 'selected': 1}
        self.available_shapes = []
        self.selected_shapes = []
        self.initialise()
        self.Center()
        self.Fit()
        self.Show()

    def initialise(self):
        self.available_shapes = ['square', 'circle', 'triangle', 'cross']
        self.selected_shapes = []
        self.display_images()

    def display_images(self):
        available_sizer = ShapeSizer(self, self.available_shapes, self.shape_types['available'])
        self.refresh_sizer_cell(self.main_sizer, available_sizer, (1, 2), (1, 3))
        selected_sizer = ShapeSizer(self, self.selected_shapes, self.shape_types['selected'])
        self.refresh_sizer_cell(self.main_sizer, selected_sizer, (1, 1), (2, 1))
        self.Layout()

    @staticmethod
    def refresh_sizer_cell(sizer, item, pos, span, flag=wx.ALL, border=10):
        old_item = sizer.FindItemAtPosition(pos)
        if old_item is not None and old_item.IsWindow():
            old_item.GetWindow().Hide()
            sizer.Detach(old_item.GetWindow())
        sizer.Add(item, pos=pos, span=span, flag=flag, border=border)

    def on_available_shape_double_click(self, event):
        shape = event.GetEventObject().GetName()
        self.available_shapes.remove(shape)
        self.selected_shapes.append(shape)
        self.display_images()

    def on_selected_shape_double_click(self, event):
        shape = event.GetEventObject().GetName()
        self.selected_shapes.remove(shape)
        self.available_shapes.append(shape)
        self.display_images()

    def on_cmd_reset_click(self, event):
        self.initialise()

    def on_cmd_cancel_click(self, event):
        self.Destroy()


class ShapeSizer(wx.Panel):
    def __init__(self, parent, shapes, shape_type):
        wx.Panel.__init__(self, parent, id = wx.ID_ANY)

        if shape_type == parent.shape_types['available']:
            size = 40
            action = parent.on_available_shape_double_click
        else:
            size = 80
            action = parent.on_selected_shape_double_click
        panel_sizer = wx.BoxSizer(wx.HORIZONTAL)
        shapes.sort()
        for shape in shapes:
            bitmap = wx.Bitmap(shape + '.png', wx.BITMAP_TYPE_PNG)
            bitmap = self.scale_bitmap(bitmap, size, size)
            img = wx.StaticBitmap(self, wx.ID_ANY, bitmap, name=shape)
            img.Bind(wx.EVT_LEFT_DCLICK, action)
            panel_sizer.Add(img, flag=wx.RIGHT, border=10)
        self.SetSizer(panel_sizer)

    @staticmethod
    def scale_bitmap(bitmap, width, height):
          image = wx.ImageFromBitmap(bitmap)
          image = image.Scale(width, height, wx.IMAGE_QUALITY_HIGH)
          result = wx.BitmapFromImage(image)
          return result

if __name__  ==  '__main__':
        app = wx.App()
        ImageSizer(None, title='Image Sizer')
        app.MainLoop()

图片如下:

circle.png

cross.png

square.png

triangle.png

最佳答案

每次您双击一个形状时,您的程序都会创建面板及其 wx.StaticBitmap 小部件的新实例,您看到的正是这些新实例,因为它们最初是用一个小的默认大小,然后由下一个布局重新定位。相反,您应该重新组织事情,这样您只创建一次面板集,并且随着形状选择状态的变化,您可以让现有面板自行更新。这将大大减少用户可见的闪烁。

关于linux - Windows 上的 wx python 图像刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39051877/

相关文章:

java - 从 Java 在 Mac 中启动外部安装程序应用程序

image - 两个图像之间的互相关

C# - 调整图像 Canvas 大小(保持源图像的原始像素尺寸)

php - 想像 |渐变贴图

linux - 如何在不同版本的 Julia 之间切换(特别是在 Ubuntu 上的 v0.3 和 v0.4 之间)?

python - 如何通过 Python 计算 Linux 上具有特定标题的窗口的数量?

c++ - 查找堆损坏

c# - Microsoft.CSharp 库中的 BadImageFormat 异常

c - 如何添加文件大小

linux - Bash - 将 2 个 ssh 调用合并为 1 个(带有可选和强制命令)