問個弱智的問題:Python有沒有向前引用啊????



#coding=gb2312
'''
'''

import sys
import ttk
import time
import socket
import tkFont
import threading
import Tkinter as tk



root = 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,但是該函數的定義在下面,這時會報錯未定義。。

請問,如何向前引用啊???

4 个解决方案

#1


把代碼寫到main里,然后在文件的最后判斷__main___,調用main(),這是個基本的習慣。不養成這個習慣以后還會有各種各樣奇怪的問題。

#2


偶,謝啦,這是個好辦法。。

#3


又有些問題:
把tk相關的代碼都放在main函數中,那么其他函數中如何引用main中第一的變量呢???

#4


引用 1 樓 iambic 的回復:
把代碼寫到main里,然后在文件的最后判斷__main___,調用main(),這是個基本的習慣。不養成這個習慣以后還會有各種各樣奇怪的問題。


大俠,我把tk相關代碼放到main函數之后,各個函數不能使用其他函數中定義的變量,怎么辦啊???

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com