2016-01-13 106 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)'。 –

相關問題