我有以下课程
class GUI( QtGui.QMainWindow ):
'''
classdocs
'''
"""**********************************************************************"""
""" Constructor """
"""**********************************************************************"""
def __init__( self, parent = None ):
self.udpClass = MCUDP.MCUDP()
def insertText( self, string ):
string = time.ctime() + ': ' + string + '\n'
self.messageField.insertPlainText( string )
Run Code Online (Sandbox Code Playgroud)
我还在GUI类中创建了MCUDP类.我的问题是如何在MCUDP中访问GUI类insertText函数
更新
这是MCUDP
'''
Created on 09.06.2011
@author: robu
'''
import socket
import time
import MCGui;
class MCUDP( object ):
'''
classdocs
'''
"""**********************************************************************"""
""" UDP: Broadcasting """
"""**********************************************************************"""
def UDPBroadcast( self, ip = "255.255.255.255", UDPport = 15000, message = 'whoisthere', timeout = 10, TCPport = 30000 ):
# ip="255.255.255.255" stands for a broadcast
ip = str( ip )
s = socket.socket( socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP )
s.setsockopt( socket.SOL_SOCKET, socket.SO_BROADCAST, True )
s.settimeout( timeout )
ownIP = socket.gethostbyname( socket.gethostname() )
if message.upper() == 'WHOISTHERE':
message = message + ';' + ownIP + ':' + str( TCPport )
#print "Trying to send '%s' to IP %s, Port %s!" %(message, ip, port)
#self.Eingang.put("Trying to send '%s' to IP %s, Port %s!" %(message, ip, UDPport))
s.sendto( message, ( ip, UDPport ) )
answer = "%s: '%s' broadcasted to %s!" % ( time.asctime(), message, ip )
GUI.insertText( 'test' );
#print answer
s.close()
return answer
Run Code Online (Sandbox Code Playgroud)
您有两个需要相互通信的对象,这是一个相当标准的通信问题.有很多方法可以解决这个问题:
(1)依赖注入 - 使您的MCUDP()类在构造时需要MCGUI类.然后,您可以随时使用它:
class MCUDP(object):
def __init__(self, gui): self.gui = gui
def UDPBroadcast(...):
# ... as necessary ...
self.gui.insertText("YourText")
class MCGUI(...)
def __init__( self, parent = None ):
self.udpClass = MCUDP.MCUDP(self)
Run Code Online (Sandbox Code Playgroud)
如果这样做,您的MCUDP类将依赖于实现self.gui该MCUDP使用的所有方法的对象.换句话说,MCUDP现在直接耦合到MCGUI类.当然,MCGUI类在某种程度上已经依赖于MCUDP.
(2)消息传递 - 在Qt,信号和插槽中.惯用的Qt路由使用消息而不是函数调用:
class MCGUI(...)
def __init__( self, parent = None ):
self.udpClass = MCUDP.MCUDP()
self.connect(self.udpClass, PYSIGNAL("textUpdated"), self.insertText);
Run Code Online (Sandbox Code Playgroud)
然后你只需要让你的MCUDP类成为一个QObject,这样它就可以发出事件:
class MCUDP(QObject):
def __init__(self, parent = None):
QObject.__init__(self, parent)
def UDPBroadcast(...):
# ... as necessary ...
self.emit(PYSIGNAL("textUpdated"), ("yourText",))
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,现在MCUDP不需要了解有关MCGUI类的任何信息,这将使测试和未来的更改变得更容易.