wxpython绘制到窗口会导致消息对话框崩溃

时间:2015-05-19 02:54:33

标签: python-2.7 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。

我可以毫无错误地显示其他一些对话框(Dialog,FileDialog)。

2 个答案:

答案 0 :(得分:0)

在OnPaint中,请致电:

e.Skip()

在您的测试中,请致电:

dial.ShowModal()

而不是dial.Show(),除非你真的想要显示一个无模式的消息对话框,我打赌你没有。您还应该将父级设置为MessageDialog。在这种情况下它应该是self(意思是Paint对象)。

答案 1 :(得分:0)

您将事件处理程序绑定到self,但它正在绘制self.window。油漆事件对这类事情很挑剔。您需要将处理程序绑定到将wx.PaintDC用于绘图的窗口。