【问题标题】:Pass variable from one class to another Python将变量从一个类传递到另一个 Python
【发布时间】:2015-10-23 16:00:55
【问题描述】:

我设法创建了 2 个在 Python 中独立运行的类。我想将从类DataCom() 收到的data 变量传递给第二类的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()  

【问题讨论】:

  • 我仍然不明白如何将数据从 DataCom.data 传递到 tkinter 标签示例框架。

标签: python class variables


【解决方案1】:

如果您使用线程,请尝试使用Queue 在线程之间共享数据。

另一种选择是将class DataCom() 中的变量声明为global,但请注意,这可能会导致很多混乱和错误。

关于这个主题的几个很好的 StackOverflow 问题和答案:

【讨论】:

  • 如果您想同步多个线程的活动,队列很有用。如果您只想 share 数据,则它们是不必要的,因为所有 Python 变量都占用相同的地址空间(除非您使用多个进程,这里不是这种情况)。不需要我可以看到的全局变量。
【解决方案2】:

您不需要公共变量,只需将 myThread1 作为第二个参数传递给 Example 构造函数。然后修改Example.__init__ 以将新参数分配给成员变量,例如theThread。现在 Example 中的所有代码都可以通过 self.theThread.data 访问 DataCom.data。

【讨论】:

  • 我认为这很容易,但看起来我今晚会坐下来阅读更多内容,直到我了解这些新概念。感谢你的帮助。 Python 不错。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-08
  • 1970-01-01
相关资源
最近更新 更多