【问题标题】:wxPython paint event works on Mac OSX but not WindowswxPython 绘画事件适用于 Mac OSX 但不适用于 Windows
【发布时间】:2016-01-14 03:28:15
【问题描述】:

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

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

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

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

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

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

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

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

    另外确实没有理由在您的 EVT_PAINT 处理程序 highlight_button 中调用 self.Refresh(),我认为您也不需要 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])
    

    【讨论】:

    • 感谢您的回答!看起来,另外,我需要将这一行:dc = wx.PaintDC(self) 更改为 dc=wx.PaintDC(self.panel)
    猜你喜欢
    • 2019-07-27
    • 2012-02-08
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2017-08-20
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多