Skip to main content
 首页 » 编程设计

Python函数调用

2025年05月04日15Free-Thinker

我有以下类(class)

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 ) 

而且我还在 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 

请您参考如下方法:

您有两个对象需要相互通信,这是一个相当标准的通信问题。有多种方法可以解决此问题:

(1) 依赖注入(inject) - 让您的 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) 

如果您这样做,您的 MCUDP 类将依赖于一个对象,该对象实现了 MCUDP 使用的 self.gui 的所有方法。换句话说,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); 

然后您只需要将 MCUDP 类设为 QObject,以便它可以发出事件:

class MCUDP(QObject): 
    def __init__(self, parent = None): 
        QObject.__init__(self, parent) 
    def UDPBroadcast(...): 
        # ... as necessary ... 
        self.emit(PYSIGNAL("textUpdated"), ("yourText",)) 

这样做的好处是现在 MCUDP 不需要知道任何关于 MCGUI 类的信息,这将使测试和 future 的更改更加容易。