话莫多说,直接上案例
test2中嵌套了一个test,分别使用t1声明test2,用t2调用test2并传入参数"uuuuu",用t3调用test2后再调用其中的test3并传入参数"aaaaaa",最后重复调用t2中的test3并传入"tttttt"和"wwwwwww"
def test2(td):
print("初始化")
def test3(td1 = "get"):
print("测试数据1:",td1)
print("测试数据:",td)
return test3
t1 = test2
print("~~~~~~~~~~~~~~~~~~~")
t2 = test2("uuuuu")
print("______________________________")
t3 = test2("uuuuu")("aaaaaa")
print("————————————————————————————————")
t2("tttttt")print("————————————————————————————————")
t2("wwwwwww")
输出结果如下所示
~~~~~~~~~~~~~~~~~~~
初始化
______________________________
初始化
测试数据1: aaaaaa
测试数据: uuuuu
————————————————————————————————
测试数据1: tttttt
测试数据: uuuuu
————————————————————————————————
测试数据1: wwwwwww
测试数据: uuuuu
t1 = test2,为t1声明了一个test2对象并赋给t1但是没调用他(也就是没执行其中的代码),t2 = test2("uuuuu")调用了test2并传入了参数
但是因为test2中最后一句是“return test3”所以是在执行完后,把test3赋给t2,而并没有执行test3对比t3 = test2("uuuuu")("aaaaaa"),这里直接调用了test2然后再调用了test3所以他走完了全程。
如果此时在使用t2("tttttt")那就是调用test3并传入参数"tttttt",因为t2只是"print("初始化")" 和"return test3" 执行完了,而test3只是声明并赋予给了t2所以可以重复调用t2,达到保存传入test2的数据的情况下重复执行test3,如果此时你使用t3("ppppp")他就会报错,因为t3已经执行完了
正好最近在练习tkinter的事件绑定,于是这不就用上了。(canvas 不能直接绑定按键事件,你可以选择绑到tk上去)
def test(td):
def test1(event):
print(event.char)
print("测试数据:",td)
return test1root = Tk()
canvas = Canvas(root,height=600, width=800)
root.bind("<KeyPress>", test("拈得银丝做梦引"))
root.mainloop()
这样就可以在保留了传入的"拈得银丝做梦引"数据的同时让按键事件能重复执行
如果不写成嵌套函数直接写成
#event自己不传入数据
def test(event,td):
print(event.char)
print("测试数据:",td)root = Tk()
canvas = Canvas(root,height=600, width=800)
root.bind("<KeyPress>", test("拈得银丝做梦引"))
root.mainloop()
——————————————————————————————————————
#event自己传入数据
def test(event,td):
print(event.char)
print("测试数据:",td)
TestEvent = type("Event", (object,), {"char": "p"})()root = Tk()
canvas = Canvas(root,height=600, width=800)
root.bind("<KeyPress>", test(TestEvent ,"拈得银丝做梦引"))
root.mainloop()
如果此时不传入event的值他就会报错,因为现在你的event就莫得传入值,如果咋们自己弄一个event给他传进去,那么会执行一次,也就是启动那一次,此后就不会执行了
def test(self,a):
def get(self):
print(a.text())
return getfor a in self.errotxt:
label = QLabel(self)
label.setText("字符:"+a)
label.mousePressEvent = self.test(label)ly.addWidget(label)
这也是嵌套函数的一个用法,当程序运行的时候,会先运行def test(self,a):,然后将一个get声明返回,然后等到你点击label组件的时候,触发mousePressEvent方法的时候,就回去调用get(),然后因为嵌套函数可以在内部保留之前的变量,所以你这时可以继续使用a来调用之前label的方法(可以拿来获得文字呀,改变文字,或者改变背景颜色什么的)
(self是调用的时候默认传入的,所以就没细说了,因为是在另一个class里面运行的,所以默认传入的self就不是QLabel类型的自然就没有.text()方法,所以我选择用一个a来接收一个QLabel,,当然其实你直接重写一个QLadel方法,并在这里调用,会更好,因为那样有更强的自定义性,更灵活,能干的事儿更多)