在学《活学活用wxPython》第三章的时候,我遇到一点疑惑,那就是下面语句的区别是什么
例 3.1 第4,5行:
panel = wx.Panel(self, -1) button = wx.Button(panel, -1, "Close", pos=(130, 15),
例 3.3 第10,11行:
self.panel = wx.Panel(self) self.button = wx.Button(self.panel, label="Not Over", pos=(100, 15))
第二个例子中为什么定义为self的方法?
所以就将3.3的部分代码修改为第一种风格
import wx class MouseEventFrame(wx.Frame): """docstring for MouseEventFrame""" def __init__(self, parent, id): # You need define parent and id wx.Frame.__init__(self, parent, id, 'Frame with Button', size = (300, 100)) panel = wx.Panel(self) button = wx.Button(panel, label = 'Not Over', pos = (100,15)) self.Bind(wx.EVT_BUTTON, self.OnButtonClick, button) def OnButtonClick(self,event): panel.SetBackgroundColour('Green') panel.Refresh() if __name__ =='__main__': app = wx.PySimpleApp() frame = MouseEventFrame(parent = None, id = -1) frame.Show() app.MainLoop()
运行无问题,可以正确地生成窗口,但是点击按钮后报错:global name 'panel' is not defined。
我的理解如下:
panel 和 button 定义在 __init__() 方法中,无法传递到 OnButtonClick()中。但是self作为传递对象,一定会在方法中传递,所以要将 panel & button 定义 self 的一部分。