wxPython 绘画事件适用于 Mac OSX 但不适用于 Windows
wxPython paint event works on Mac OSX but not Windows
在我的 wxPython GUI 中,我试图将用户定向到特定的小部件。
在我的简化代码中,所需的行为是这样的:单击按钮二,这会在触发绘制事件后立即在按钮一周围绘制一条红线。此行为在 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_BUTTON中绑定EVT_PAINT,wx仍然不会触发事件绘制(它只会重绘脏东西......)你可以触发一个EVT_PAINT
与 self.Refresh()
或其他各种会使 wx.Frame 变脏的活动...在这种情况下,我们可能只能强制刷新
def do_button(self, event):
self.Bind(wx.EVT_PAINT, self.highlight_button)
self.Refresh()
此外,真的没有理由在你的 EVT_PAINT 处理程序中调用 self.Refresh()
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])
在我的 wxPython GUI 中,我试图将用户定向到特定的小部件。
在我的简化代码中,所需的行为是这样的:单击按钮二,这会在触发绘制事件后立即在按钮一周围绘制一条红线。此行为在 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_BUTTON中绑定EVT_PAINT,wx仍然不会触发事件绘制(它只会重绘脏东西......)你可以触发一个EVT_PAINT
与 self.Refresh()
或其他各种会使 wx.Frame 变脏的活动...在这种情况下,我们可能只能强制刷新
def do_button(self, event):
self.Bind(wx.EVT_PAINT, self.highlight_button)
self.Refresh()
此外,真的没有理由在你的 EVT_PAINT 处理程序中调用 self.Refresh()
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])