我正在使用像这样的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)。
答案 0 :(得分:0)
在OnPaint中,请致电:
e.Skip()
在您的测试中,请致电:
dial.ShowModal()
而不是dial.Show(),除非你真的想要显示一个无模式的消息对话框,我打赌你没有。您还应该将父级设置为MessageDialog。在这种情况下它应该是self(意思是Paint对象)。
答案 1 :(得分:0)
您将事件处理程序绑定到self
,但它正在绘制self.window
。油漆事件对这类事情很挑剔。您需要将处理程序绑定到将wx.PaintDC
用于绘图的窗口。