我想给我绘制的图片一个事件。
目前,我用wxPython绘制矩形,
我希望像按钮一样连接链接。
有可能吗?
如果有可能请告诉我。
以下是我的代码。
import wx class Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__(parent, title=title, size=(350, 280)) self.Bind(wx.EVT_PAINT, self.OnPaint) self.Centre() self.Show() def OnPaint(self, e): dc = wx.ClientDC(self) dc.SetBrush(wx.Brush("YELLOW")) self.original = dc.DrawRectangle(10, 15, 90, 60) if __name__ == '__main__': app = wx.App() Example(None, 'Colours') app.MainLoop()
答案 0 :(得分:0)
当您第一次看到这个时,按下按钮时调用OnPaint方法会很诱人。但这不会按你想要的方式运作。
关于绘制内容的一个重点是,每次需要重新绘制屏幕时都需要调用OnPaint事件处理程序 - 显然。这意味着您需要在任何时候都可以使用绘制的逻辑,因此可以根据需要随时调用它。你不能在按下按钮时绘制一些东西,并期望它保持绘制 - 下一个绘画事件将擦除它。
这意味着你需要这样的逻辑:
import wx
class Example(wx.Frame):
def __init__(self, parent, title):
super(Example, self).__init__(parent, title=title,
size=(350, 280))
self._showRectangle = False
draw_button = wx.Button(self, label="Press Me")
self.Bind(wx.EVT_BUTTON, self.OnButtonPressed, draw_button)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Centre()
self.Show()
def OnButtonPressed(self, e):
self._showRectangle = not(self._showRectangle)
def OnPaint(self, e):
# This must be called from EVT_PAINT, not EVT_BUTTON
print "painting..."
if self._showRectangle:
dc = wx.ClientDC(self)
dc.SetBrush(wx.Brush("YELLOW"))
self.original = dc.DrawRectangle(10, 15, 90, 60)
app = wx.App()
Example(None, 'Colours')
app.MainLoop()
我在其中放置了一个print语句,以强调需要了解何时调用此处理程序。尝试最小化和最大化应用程序等...
HTH
答案 1 :(得分:0)
注意:
您不希望在绘图事件中使用ClientDC!您改为使用PaintDC。
只要系统需要重新绘制窗口,就会出现Paint。所以你想做的是:
这将触发油漆事件。
(您也可以使用ClientDC并绘制,但它可以使用Update() - 这样可以让系统更好地计算绘图时间)
关于绘制Wiki的内容有很多:
http://wiki.wxpython.org/RecipesImagesAndGraphics
我还没有用按钮回答你关于衬里的问题,因为我不明白你想做什么。但是寻找鼠标事件 - 这可能是你想要的。