簡體   English   中英

wxPython繪畫事件在Mac OSX上有效,但在Windows上無效

[英]wxPython paint event works on Mac OSX but not Windows

在我的wxPython GUI中,我試圖將用戶定向到特定的小部件。

在我的簡化代碼中,所需的行為是這樣的:單擊按鈕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。

你有一些問題...我只會部分解決

首先,您是在被面板覆蓋的框架上繪圖,因此您看不到繪圖...(一個簡單的解決方法,盡管可能不完全是您想要的,如下所示)

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仍不會觸發事件繪制(它僅重繪臟東西...),您仍可以使用self.Refresh()或其他各種活動來觸發EVT_PAINT 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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM