【问题标题】:wxPython gives different results on Windows and UbuntuwxPython 在 Windows 和 Ubuntu 上给出不同的结果
【发布时间】:2015-11-10 16:40:46
【问题描述】:

我开发了一个小型 wxPython 程序,它在 Windows 和 Ubuntu 中提供完全不同的输出(我很高兴被告知我对它的编程不正确,我会认为这是结果——只要我们可以让它工作)

程序在右侧显示四个形状。双击右侧图像可将其移至左侧,反之亦然。

Windows 上的问题(请参阅在 Windows 和 Ubuntu 中执行相同操作后拍摄的屏幕截图):按钮无法正确呈现;当我点击十字、圆环或正方形时,它们会正确移动到屏幕左侧,但仍保留多个三角形图像;左上角出现一张图片

这些问题都没有出现在 Ubuntu 中

    import wx

class ImageSizer(wx.Frame):

  def __init__(self, parent, title):
    super(ImageSizer, self).__init__(parent, title=title, 
        size=(250, 200))

    self.ShapeTypes=['available','selected']
    self.MainSizer=wx.GridBagSizer()
    self.SetSizer(self.MainSizer)           

    cmdNew=wx.Button(self, label='New')
    cmdNew.Bind(wx.EVT_BUTTON, self.onNewClick) 

    cmdCancel=wx.Button(self, label='Cancel')
    cmdCancel.Bind(wx.EVT_BUTTON, self.CancelClick)       

    self.MainSizer.Add((500,0), pos=(0,0), span=(1,2))    #dummy to position Available
    self.MainSizer.Add((0,200), pos=(1,0), span=(1,1))    #dummy to position Buttons
    self.MainSizer.Add(cmdNew, pos=(2,2), flag=wx.LEFT|wx.TOP, border=10)
    self.MainSizer.Add(cmdCancel, pos=(2,3), flag=wx.RIGHT|wx.BOTTOM|wx.TOP|wx.ALIGN_RIGHT, border=10)

    self.SetBackgroundColour((246, 244, 242))
    self.Initialise()
    self.Center()
    self.Fit()
    self.Show()

  def DisplayImages(self):
    availableSizer=ShapeSizer(self, self.AvailableShapes, self.ShapeTypes.index('available'))
    self.RefreshSizerCell(self.MainSizer, availableSizer, (1,2), (1,2))
    selectedSizer=ShapeSizer(self, self.SelectedShapes, self.ShapeTypes.index('selected'))
    self.RefreshSizerCell(self.MainSizer, selectedSizer, (1,1), (1,1))

  def Initialise(self):
    self.AvailableShapes=['square','circle','triangle','cross']
    self.SelectedShapes=[]
    self.DisplayImages()

  def RefreshSizerCell(self, sizer, item, pos, span, flag=wx.ALL, border=10):
    self.Freeze()
    oldItem=sizer.FindItemAtPosition(pos)
    if (oldItem !=None) and oldItem.IsWindow():
      oldItem.GetWindow().Destroy()
    sizer.Add(item, pos=pos, span=span, flag=flag, border=border)
    self.Layout()
    self.Thaw()

  def GetShapeName(self, event):
    imgCtrl=event.GetEventObject()
    return imgCtrl.GetName()

  def onAvailableShapeDClick(self, event):
    shape=self.GetShapeName(event)
    self.AvailableShapes.remove(shape)
    self.SelectedShapes.append(shape)
    self.DisplayImages()

  def onSelectedShapeDClick(self, event):
    shape=self.GetShapeName(event)
    self.SelectedShapes.remove(shape)
    self.AvailableShapes.append(shape)
    self.DisplayImages()

  def onNewClick(self, event):
    self.Initialise() 

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

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

    if shapeType==frame.ShapeTypes.index('available'):
      size=40
      action=frame.onAvailableShapeDClick
    elif shapeType==frame.ShapeTypes.index('selected'):
      size=80
      action=frame.onSelectedShapeDClick
    shapeSizer=wx.GridBagSizer()
    shapes.sort()
    for ii in range(0, len(shapes)):
      bitmap=wx.Bitmap(shapes[ii]+'.png',wx.BITMAP_TYPE_PNG)
      bitmap=self.ScaleBitmap(bitmap, size, size)
      img=wx.StaticBitmap(self, wx.ID_ANY, bitmap, name=shapes[ii])
      img.Bind(wx.EVT_LEFT_DCLICK, action)
      shapeSizer.Add(img, pos=(0,ii), flag=wx.RIGHT, border=10)        
    self.SetSizer(shapeSizer)

  def ScaleBitmap(self, 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()

【问题讨论】:

    标签: windows ubuntu wxpython


    【解决方案1】:

    这里的问题是线条

    self.Freeze()
    

    self.Thaw() 
    

    RefreshSizerCell()
    

    在 Windows 中似乎没有任何用处 :(

    线

    Self.Layout()
    

    似乎也是多余的

    【讨论】:

    • 我说“没用”的地方,我的意思是他们搞砸了——当我删除行时它工作得很好,留下它们会破坏输出
    • 这真的很奇怪。不过很高兴知道。
    猜你喜欢
    • 2012-12-25
    • 2020-08-01
    • 2014-01-30
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    相关资源
    最近更新 更多