2016-01-13 99 views
0

在我的wxPython GUI中,我试图将用户引导至特定的窗口小部件。wxPython绘画事件适用于Mac OSX,但不适用于Windows

在我的简化代码中,期望的行为是这样的:点击按钮2,一旦绘制事件被触发,就会在按钮1周围绘制一条红线。此行为在OSX上按预期工作,但该行不显示在Windows上。这里有一些简化的代码:

class MyFrame(wx.Frame): 

    def __init__(self): 
     wx.Frame.__init__(self, None, -1, name='Name') 
     self.InitUI() 

    def InitUI(self): 
     self.panel = wx.Panel(self, name='main_panel') 
     self.btn1 = wx.Button(self.panel, -1, 'button 1') 
     self.btn2 = wx.Button(self.panel, -1, 'button 2') 
     self.Bind(wx.EVT_BUTTON, self.do_button, self.btn2) 
     sizer = wx.BoxSizer(wx.HORIZONTAL)            
     sizer.Add(self.btn1, flag=wx.ALL, border=10) 
     sizer.Add(self.btn2, flag=wx.ALL, border=10) 
     self.panel.SetSizer(sizer) 

    def do_button(self, event): 
     self.Bind(wx.EVT_PAINT, self.highlight_button) 

    def highlight_button(self, event): 
     """                       
     Draw a red highlight line around button 1           
     """ 
     wind = self.btn1 
     pos = wind.GetPosition() 
     size = wind.GetSize() 
     dc = wx.PaintDC(self) 
     dc.SetPen(wx.Pen('red', 5, wx.SOLID)) 
     dc.DrawRectangle(pos[0], pos[1], size[0], size[1]) 
     self.Refresh() 
     event.Skip() 

app = wx.App() 
app.frame = MyFrame() 
app.frame.Centre() 
app.frame.Show() 
app.MainLoop() 

我成功地捕获了Windows上的绘图事件,但红线从不出现。我正在使用Windows 10,wxPython 3.0.2。

回答

1

你有几个问题...我只能部分地解决这些问题

第一你是你的框架,这是你的面板覆盖上绘制,所以你不要看你的图纸......(一个简单的办法,虽然可能不太你想要什么如下)

def InitUI(self): 
    self.panel = self # wx.Panel(self, name='main_panel') 
    ... # rest of this method stays the same 

更可能你会想在EVT_PAINT绑定到面板,而不是框架

第二个问题是,即使你绑定在EVT_PAINT EVT_BUTTON,wx仍然不会触发事件漆(只重绘脏东西......),你可以触发一个EVT_PAINTself.Refresh()或或其他各种活动,这将使wx.Frame脏......在这种情况下,我们可能只需要强制刷新

def do_button(self, event): 
    self.Bind(wx.EVT_PAINT, self.highlight_button) 
    self.Refresh() 

有另外我们实在没有理由骂你self.Refresh()处理EVT_PAINT里面highlight_button我不认为你需要的event.Skip()要么...

def highlight_button(self, event): 
    """ 
    Draw a red highlight line around button 1 
    """ 
    wind = self.btn1 
    pos = wind.GetPosition() 
    size = wind.GetSize() 
    dc = wx.PaintDC(self) 
    dc.SetPen(wx.Pen('red', 5, wx.SOLID)) 
    dc.DrawRectangle(pos[0], pos[1], size[0], size[1]) 
+0

谢谢您的回答!看起来,另外,我需要改变这一行:'dc = wx.PaintDC(self)'到'dc = wx.PaintDC(self.panel)'。 –

相关问题