Вызов функции Python - PullRequest
       3

Вызов функции Python

1 голос
/ 09 июня 2011

У меня есть следующий класс

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 )

И у меня также есть класс MCUDP, созданный в классе GUI.У меня вопрос, как я могу добраться до функции GUI класса insertText в MCUDP

ОБНОВЛЕНО

это 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 ]

6 голосов
/ 09 июня 2011

У вас есть два объекта, которые должны общаться друг с другом, что является довольно стандартной проблемой коммуникации. Существует несколько способов решения этой проблемы:

(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 станет зависимым от объекта, который реализует все методы self.gui, которые использует MCUDP. Другими словами, MCUDP теперь напрямую связан с классом MCGUI. Конечно, класс MCGUI уже в некоторой степени зависит от MCUDP.

(2) Передача сообщений - In 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 голос
/ 09 июня 2011

Доступно как insertText во время объявления и как GUI.insertText или GUI().insertText во время выполнения. Если вы не уверены, где вы находитесь, попробуйте оба :). Я бы сказал, какой вам нужен, если вы опубликовали полный код.

[обновление] Ваш класс MCDUP не «создан в классе GUI». Вы просто создаете экземпляр MCDUP и держите ссылку на него внутри 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 - фридом.

0 голосов
/ 09 июня 2011

Как правило, второй вариант, предложенный Kaleb Pederson, - это путь.
Тем не менее, если вам нужна ссылка на MainWindow, вы можете сохранить его как свойство экземпляра вашего QApplication.
Когда вы запускаете свое приложение:

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

Тогда, когда вы хотите использовать ссылку:

...
mainwindow = qApp.property('mainwindow').toPyObject()
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...