Python函数调用

时间:2011-06-09 14:12:01

标签: python class pyqt

我有以下课程

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

3 个答案:

答案 0 :(得分:6)

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

(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)

如果这样做,您的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类,这将使测试和未来的更改变得更容易。

答案 1 :(得分:1)

在声明期间可用insertText,在执行期间可用GUI.insertTextGUI().insertText。如果你不确定你在哪里,试试两个:)。 如果您发布了实际的完整代码,我会说你需要哪一个。

<强> [更新] 您的MCDUP类不是“在GUI类中创建的”。您只需创建一个MCDUP实例并在GUI中保存对它的引用。引用是单向的,因此如果您需要访问父GUI实例,则需要一个反向引用,例如:

class GUI(QtGui.QMainWindow):
    def __init__(self, parent=None):
          self.udp = MCUDP.MCUDP(gui=self)

然后在MCDUP:

class MCUDP(object):
    def __init__(self, gui):
        self.gui = gui
    def udp_broadcast(self, ...):
        ...
        self.gui.insertText('test')
        ...

我还使代码更加PEP8 - 油炸。

答案 2 :(得分:0)

一般来说,Kaleb Pederson提出的第二个选择是要走的路 但是,如果您想要引用MainWindow,可以保存它 作为QApplication实例的属性。
当您开始申请时:

app = QApplication(sys.argv)
...
mainwindow = GUI()
app.setProperty("mainwindow", QVariant(mainwindow))

然后当你想使用引用时:

...
mainwindow = qApp.property('mainwindow').toPyObject()
...