wxPython绘制事件适用于Mac OSX但不适用于Windows

时间:2016-01-13 19:09:22

标签: python wxpython

在我的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。

1 个答案:

答案 0 :(得分:1)

你有一些问题......我只会部分解决这些问题

首先,你正在绘制你的面板所覆盖的框架,所以你没有看到你的绘图...(一个简单的修复,虽然可能不是你想要的如下)

"awards" : 
{

    "oscars" : [
        {"award": "bestAnimatedFeature", "result": "won"},
        {"award": "bestMusic", "result": "won"},
        {"award": "bestPicture", "result": "nominated"},
        {"award": "bestSoundEditing", "result": "nominated"},
        {"award": "bestScreenplay", "result": "nominated"}
    ],
    "wins" : 56,
    "nominations" : 86,
    "text" : "Won 2 Oscars. Another 56 wins and 86 nominations."
    }

您更有可能想要将EVT_PAINT绑定到面板而不是框架

第二个问题是,即使你在EVT_BUTTON中绑定EVT_PAINT,wx仍然不会触发事件绘制(它只重绘脏东西......)你可以用def InitUI(self): self.panel = self # wx.Panel(self, name='main_panel') ... # rest of this method stays the same 触发EVT_PAINT或或者使wx.Frame变脏的各种其他活动...在这种情况下我们可能只是强制刷新

self.Refresh()

此外,没有理由在你的EVT_PAINT处理程序def do_button(self, event): self.Bind(wx.EVT_PAINT, self.highlight_button) self.Refresh() 内调用self.Refresh()我不认为你需要highlight_button ......

event.Skip()