问个弱智的问题:Python有没有向前引用啊????
- Python code
#coding=gb2312''''''import sysimport ttkimport timeimport socketimport tkFontimport threadingimport Tkinter as tkroot = tk.Tk()root.title("uIP TCP Demo")font = tkFont.Font(family=u"宋体",size=11)tk.Label(root,text=u'下面这些LED灯的亮灭由单片机按键控制',fg='red',font=font).pack(side='top',pady=5)cnv1 = tk.Canvas(root,height=50,width=280)cnv1.pack(side='top',padx=5,pady=3)cnv1.create_oval(30,5,70,45,fill='black',tag='led1')cnv1.create_oval(90,5,130,45,fill='black',tag='led2')cnv1.create_oval(150,5,190,45,fill='black',tag='led3')cnv1.create_oval(210,5,250,45,fill='black',tag='led4')tk.Label(root,text=u'下面这些按键可以控制单片机上的LED灯',fg='red',font=font).pack(side='top',pady=5)cnv2 = tk.Canvas(root,height=50,width=280)cnv2.pack(side='top',padx=5,pady=3)cnv2.create_rectangle(20,5,60,35,fill='#FFAA55',tag='key1')cnv2.create_rectangle(80,5,120,35,fill='#FFAA55',tag='key2')cnv2.create_rectangle(140,5,180,35,fill='#FFAA55',tag='key3')cnv2.create_rectangle(200,5,240,35,fill='#FFAA55',tag='key4')cnv3 = tk.Canvas(root,height=30,width=280)cnv3.pack(side='top',padx=1,pady=1)cnv3.create_window(120,15,window=tk.Entry(root,width=8))cnv3.create_window(30,15,window=tk.Button(root,text=u'连接',command=sockConn))cnv3.create_oval(160,5,170,15,fill='black',tag='led0')cnv3.create_text(200,10,text=u'连接中...',tag='txt0')cnv2.tag_bind('key1',"<Button>",lambda e:conn.send('1'))cnv2.tag_bind('key2',"<Button>",lambda e:conn.send('2'))cnv2.tag_bind('key3',"<Button>",lambda e:conn.send('4'))cnv2.tag_bind('key4',"<Button>",lambda e:conn.send('8'))com_thread = threading.Thread(target=sockRecv)com_thread.setDaemon(True)com_thread.start()root.mainloop()def sockConn(): global cnv3 try: sock1 = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock1.bind(('localhost',1038)) #不得大于1023 sock1.listen(5) conn,addr = sock1.accept() cnv3.itemconfig('led0',fill='red') cnv3.itemconfig('txt0',text=u'已连接上') except Exception: cnv3.itemconfig('txt0',text="HOST or PORT error!") def sockRecv(): global cnv1 conn.settimeout(2) while True: buf = conn.recv(1500) if len(buf)==0: pass time.sleep(0.1) if (buf[0] & 0x01) != 0: cnv1.itemconfig('led1',fill='red') else: cnv1.itemconfig('led1',fill='black') if (buf[0] & 0x01) != 0: cnv1.itemconfig('led2',fill='red') else: cnv1.itemconfig('led2',fill='black') if (buf[0] & 0x01) != 0: cnv1.itemconfig('led3',fill='red') else: cnv1.itemconfig('led3',fill='black') if (buf[0] & 0x01) != 0: cnv1.itemconfig('led4',fill='red') else: cnv1.itemconfig('led4',fill='black')如代码所示:写代码的时候先在threading.Thread(target=sockRecv)中引用了sockRecv,但是该函数的定义在下面,这时会报错未定义。。
请问,如何向前引用啊???
[解决办法]
把代码写到main里,然后在文件的最后判断__main___,调用main(),这是个基本的习惯。不养成这个习惯以后还会有各种各样奇怪的问题。