2015-05-19 35 views
0

IM使用wxPython的這樣做了一點漆應用:wxPython的繪圖窗口會導致消息對話框崩潰

from wx import * 

class Canvas(ScrolledWindow): 
    def __init__(self, parent): 
     ScrolledWindow.__init__(self, parent, ID_ANY,(0, 0), size=DefaultSize, style=wx.SUNKEN_BORDER) 
     self.SetBackgroundColour('#666666') 

     self.sizer = BoxSizer() 
     self.EnableScrolling(True,True) 
     self.window = Window(self, size=(200,200)) 
     self.window.SetBackgroundColour('#ffffff') 
     self.sizer.Add(self.window) 
     self.SetSizer(self.sizer) 
     self.SetVirtualSize((1000,1000)) 
     self.SetScrollRate(1, 1) 

     self.Bind(EVT_PAINT, self.OnPaint) 

    def OnPaint(self, e): 
     dc = PaintDC(self.window) 
     dc.BeginDrawing() 
     dc.DrawLine(0,0, 100, 100) 
     dc.EndDrawing() 

class Paint(Frame): 
    def __init__(self, parent, title): 
     Fraself.__init__(self, parent, title=title, size=(500,400), style= CAPTION | RESIZE_BORDER | CLOSE_BOX) 
     self.CreateStatusBar(2,style= STB_DEFAULT_STYLE & ~(STB_SIZEGRIP)) 
     self.canvas = Canvas(self) 
     self.Show(True) 

     menu= Menu() 
     test = menu.Append(ID_ANY, "Create","Shows a MessageDialog") 
     self.Bind(EVT_MENU, self.Test, test) 

     menubar = MenuBar() 
     menubar.Append(menu,"Dialog") 
     self.SetMenuBar(menubar) 

    def Test(self, e): 
     dial = wx.MessageDialog(None, 'This is a test dialog.', 'Hi', 
      wx.OK) 
     dial.Show() 

app = App(False) 
frame = Paint(None, 'Paintbox') 
app.MainLoop() 

,但有與MessageDialog一些奇怪的問題,即由於我使用的是我不能表現出來PaintDC中的其他地方。如果我註釋掉線self.Bind(EVT_PAINT, self.OnPaint)我可以獲得對話框顯示,但是如果我也繪畫,對話框將崩潰程序而不打印任何錯誤輸出。我正在使用wxpython 3.0,python 2.7和Windows 8.

其他類型的對話框(對話框,FileDialog)我可以顯示沒有錯誤。

回答

0

在你的OnPaint,請致電:

e.Skip() 

在您的測試,請致電:

dial.ShowModal() 

代替dial.Show(),除非你真的想顯示模式少消息對話框,我敢打賭你沒有。您還應該將MessageDialog設置爲父級。在這種情況下它應該是self(意思是Paint對象)。

0

您正在將事件處理程序綁定到self,但它正在繪製self.window。油漆事件對這樣的事情很挑剔。您需要將處理程序綁定到將使用wx.PaintDC進行繪製的窗口。