我设法创建了2个在Python中独立运行的类。我想将从类data
收到的DataCom()
变量传递给第二类的tkinter cf_label。
这是一个正确的开始方式吗?我知道我必须以某种方式公开一些变量,但我无法弄清楚。有人可以帮忙吗?
from Tkinter import *
import socket
import sys
import time
import datetime
from threading import Thread
def get_constants(prefix):
"""Create a dictionary mapping socket module constants to their names."""
return dict( (getattr(socket, n), n)
for n in dir(socket)
if n.startswith(prefix)
)
class Example(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.friend_check = IntVar()
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Home.local")
self.cl_label=Label(text="data from socket")
self.cl_label.grid(row=0,column=0,columnspan=2)
class DataCom(Thread):
def __init__(self, val):
Thread.__init__(self)
self.val = val
def run(self):
families = get_constants('AF_')
types = get_constants('SOCK_')
protocols = get_constants('IPPROTO_')
# Create a TCP/IP socket
sock = socket.create_connection(('localhost', 10000))
while True:
try:
message = 'INFO'
print >>sys.stderr, 'sending "%s" Length: %s' % (message,len(message))
sock.sendall(message)
amount_received = 0
amount_expected = len(message)
while amount_received < amount_expected:
data = sock.recv(1024)
amount_received += len(data)
if len(data) != 0:
print >>sys.stderr, 'Server received %s %s:Length %s' % (data, len(data))
else:
sock.close()
print >>sys.stderr, 'No more data, closing socket'
break
if not data:
break
finally:
time.sleep(1)
def main():
myThread1 = DataCom(4)
myThread1.setName('Thread 1')
myThread1.start()
root = Tk()
root.geometry("600x450+900+300")
root.resizable(0,0)
app = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
答案 0 :(得分:2)
您不需要公共变量,只需将myThread1作为第二个参数传递给Example构造函数。然后修改Example.__init__
以将新参数分配给成员变量,例如theThread
。现在,Example中的所有代码都可以访问DataCom.data self.theThread.data
。
答案 1 :(得分:2)
如果您正在使用线程,请尝试使用Queue
在线程之间共享数据。
另一种选择是将class DataCom()
中的变量声明为global
,但要注意,这可能会导致很多混乱和错误。
关于这个主题的几个很棒的StackOverflow问题和答案: