2015-11-05 77 views
0

此代碼讀取圖片並將其作爲背景放在窗口中。 有兩個問題,我無法解釋:事件處理後wxpython窗口崩潰

  • 一旦你導入的圖片,點擊在右上角的紅色「X」不會關閉該窗口。

  • 如果您嘗試拖動圖像,程序崩潰。

這是爲什麼? 謝謝

import wx 
import wx.lib.buttons as buttons 

class Main(wx.Frame): 
    def __init__(self, parent, title): 
     wx.Frame.__init__(self, parent, id=-1, title=title, size=(300, 300)) 
     self.initUI() 
     self.panel = wx.Panel(self, wx.ID_ANY, wx.DefaultPosition, size=(10000, 10000)) 
     self.backGroundImage='' 
     self.Layout() 

    def initUI(self): 
     menubar = wx.MenuBar() 
     fileMenu = wx.Menu() 
     fileMenu.AppendSeparator() 

     imp = wx.Menu() 
     importBackgroundButton = imp.Append(wx.ID_ANY, 'Import background') 
     self.Bind(wx.EVT_MENU, self.OnImportBackground, importBackgroundButton) 
     fileMenu.AppendMenu(wx.ID_ANY, 'I&mport', imp) 
     menubar.Append(fileMenu, '&File') 
     self.SetMenuBar(menubar) 
     self.SetTitle('test') 
     self.Centre() 
     self.Show(True) 

    #load background 
    def OnImportBackground(self, e): 
     app = wx.App(None) 
     style = wx.FD_OPEN | wx.FD_FILE_MUST_EXIST 
     dialog = wx.FileDialog(None, 'Open', wildcard='*.png', style=style) 
     if dialog.ShowModal() == wx.ID_OK: 
      path = dialog.GetPath() 
     else: 
      path = None 
     dialog.Destroy() 
     self.backgroundImage = ButtonImage(self, self.panel, path, (0, 0)) 
     W = self.backgroundImage.bmp.GetSize()[0] 
     H = self.backgroundImage.bmp.GetSize()[1] 
     self.SetSize((W+16, H+58)) 
     self.Refresh() 
     #crash 


class ButtonImage(): 
    def __init__(self, parent, panel, nameImage, pos): 
     self.panel = panel 
     self.bmp = wx.Bitmap(nameImage, wx.BITMAP_TYPE_ANY) 
     self.maxPiecePositionX = self.panel.GetSize()[0] - self.bmp.GetSize()[0] 
     self.maxPiecePositionY = self.panel.GetSize()[1] - self.bmp.GetSize()[1] 
     self.bmapBtn = wx.BitmapButton(self.panel, id=wx.ID_ANY, bitmap=self.bmp, style=wx.NO_BORDER, pos=pos) 
     self.bmapBtn.Bind(wx.EVT_LEFT_DOWN, self.OnClickDown, self.bmapBtn) 
     self.bmapBtn.Bind(wx.EVT_LEFT_UP, self.OnClickUp, self.bmapBtn) 
     self.bmapBtn.Bind(wx.EVT_MOTION, self.MoveButton, self.bmapBtn) 
     self.hold = 0 
     self.holdPosition = (0, 0) 

    def EnterButton(self, event): 
     pass 

    def LeaveButton(self, event): 
     self.hold = 0 

    def OnClickDown(self, event): 
     obj = event.GetEventObject() 
     self.hold = 1 
     self.holdPosition = (event.GetX(), event.GetY()) 

    def OnClickUp(self, event): 
     self.hold = 0 

    def MoveButton(self, event): 
     deltaX, deltaY = 0, 0 
     if self.hold: 
      deltaX = event.GetPosition()[0] - self.holdPosition[0] 
      deltaY = event.GetPosition()[1] - self.holdPosition[1] 
      newPositionX = self.bmapBtn.GetPosition()[0] + deltaX 
      newPositionY = self.bmapBtn.GetPosition()[1] + deltaY 
      if (0 < newPositionX < self.maxPiecePositionX) and (0 < newPositionY < self.maxPiecePositionY): 
       self.bmapBtn.SetPosition((newPositionX, newPositionY)) 
      else: 
       self.holdPosition = self.holdPosition[0] + deltaX, self.holdPosition[1] + deltaY 
      self.bmapBtn.Raise() 
      self.bmapBtn.Refresh() 

app = wx.App() 
frame = Main(None, "Test") 
frame.Show() 
app.MainLoop() 
+0

另外:嘗試取消註釋事件處理程序中的「#crash」行,並拖動圖像工程..我很困惑。 –

回答

1

這個例子有,這需要很長的時間來解釋這麼多的問題。例如,你創建一個新的ButtonImage,這實際上是一個wx.BitmapButton,每次你調用OnImportBackground而不破壞舊的,堆積一些位圖按鈕的集合而沒有正確地佈局它們。

但是,每次調用OnImportBackground時,什麼會將釘子釘入棺材中,從而實例化新的wx.App。如果你刪除這條線(這是完全沒有意義的),框架至少可以關閉。

但要查看「正確的方法(TM)」要做到這一點,請看this stackoverflow post

+0

啊..就是這樣。 wx.App的實例化!我真的錯過了。非常感謝。 重新堆疊背景:這是一個「功能」:) 我剝離了代碼,只保留了工作版本的基本功能。 –