Как вызвать функцию из другого класса (файла)

У меня есть чат на сокетах. Я вызываю окно, в котором хочу при нажатии отправить что-либо серверу.
Вызываю из дочернего окна функцию с отцовского. \

Но пишет ошибку:

AttributeError: 'gui' object has no attribute 'client'

Код двух окон.

Отцовское:

import pickle
import socket
from PyQt5 import *
from PyQt5.QtWidgets import QMessageBox
from PyQt5.QtCore import Qt
from des import *
import sys
import time
from ls import *
from datetime import datetime

class gui(QtWidgets.QMainWindow):
        
        def __init__(self, parent=None):
            super().__init__(parent)
            self.ui = Ui_MainWindow()
            self.ui.setupUi(self)
            self.ui.pushButton.clicked.connect(self.send_message)
            self.ui.pushButton_5.clicked.connect(self.connect_server)
            self.ui.listWidget.doubleClicked.connect(self.sendLs)
            self.adresat = None
            
            
        def sendLs(self):
            if self.ui.listWidget.currentItem().text() != self.nick:
                self.ls = MyMessages(self)
                self.adresat = self.ui.listWidget.currentRow()
                self.ls.setWindowTitle('ЛС с пользователем - ' + self.ui.listWidget.currentItem().text())
                self.ls.show()
                
        def connect_server(self):   
            try:
                self.ip = self.ui.lineEdit_4.text()
                self.port = int(self.ui.lineEdit_3.text())
                self.nick = self.ui.lineEdit_5.text()
                
                if self.ui.pushButton_5.text() == 'Подключиться!':
                    if self.nick != 'EXIT_MESSAGE' and self.nick != 'CONNECT_MESSAGE' and self.nick != 'NICK_ERROR' and self.nick != 'USER_MESSAGE':
                        self.ui.pushButton_5.setText("Отключиться!")
                        icon = QtGui.QIcon()
                        icon.addPixmap(QtGui.QPixmap("icons/disconnect_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                        self.ui.pushButton_5.setIcon(icon)
                        self.client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                        self.mainThread = chat(self.client)
                        self.mainThread.mysignal.connect(self.check_message)
                        self.client.connect((self.ip, self.port))
                        self.mainThread.start()
                        self.ui.pushButton.setEnabled(True)
                        self.client.send(self.nick.encode('utf-8'))
                elif self.ui.pushButton_5.text() == 'Отключиться!':
                        self.ui.pushButton_5.setText("Подключиться!")
                        icon = QtGui.QIcon()
                        icon.addPixmap(QtGui.QPixmap("icons/connect_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                        self.ui.pushButton_5.setIcon(icon)
                        
                        message_data = ['SERVER', 'exit', 'SYSTEM_MESSAGE']
                        self.client.send(pickle.dumps(message_data))
                        self.client.close()

                        self.ui.plainTextEdit.clear()
                        self.ui.listWidget.clear()
                        self.ui.pushButton.setEnabled(True)
            except Exception as e:
                self.ui.pushButton_5.setText("Подключиться!")
                msg = QMessageBox()
                self.ui.pushButton.setEnabled(False)
                msg.setWindowTitle("Ошибка!")
                msg.setText(f"Не удалось подключиться к серверу!")
                msg.setIcon(QMessageBox.Warning)
                x = msg.exec_()
                icon = QtGui.QIcon()
                icon.addPixmap(QtGui.QPixmap("icons/connect_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                self.ui.pushButton_5.setIcon(icon)
        def closeEvent(self, event):
            try:
                message_data = ['SERVER', 'exit', 'SYSTEM_MESSAGE']
                self.client.send(pickle.dumps(message_data))
                self.client.close()
            except:
                pass    
        def check_message(self, value:list):
            now = datetime.now()
            current_time = now.strftime("%H:%M")
            
            if "EXIT_MESSAGE"  in value or 'KICK_MESSAGE' in value or 'ADRESS_MESSAGE' in value or 'SERVER_MESSAGE' in value or "CONNECT_MESSAGE" in value or "USER_MESSAGE" in value or "NICK_ERROR" in value:
                if value[2] == "CONNECT_MESSAGE":
                    self.ui.plainTextEdit.appendPlainText(f'[{current_time}] [Сервисное сообщение] {value[1].decode("utf-8")}')     
                        
                elif value[2] == "EXIT_MESSAGE":
                    self.ui.plainTextEdit.appendPlainText(f'[{current_time}] [Сервисное сообщение] {value[1].decode("utf-8")}')     
                elif value[2] == "SERVER_MESSAGE":
                    self.ui.plainTextEdit.appendPlainText(f'[{current_time}] [Сервисное сообщение] {value[1]}')     

                elif value[2] == "USER_MESSAGE" :
                    self.ui.plainTextEdit.appendPlainText(f'[{current_time}] {value[0]}: {value[1]}')
                elif value[2] == 'ADRESS_MESSAGE':
                    MyMessages().ui.plainTextEdit.appendPlainText(f'[{current_time}] [Личное сообщение от {value[0]}]: {value[1]}')
                elif value[2] == "NICK_ERROR":
                    self.ui.pushButton_5.setText("Подключиться!")
                    icon = QtGui.QIcon()
                    icon.addPixmap(QtGui.QPixmap("icons/connect_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                    self.ui.pushButton_5.setIcon(icon)
                    self.ui.pushButton.setEnabled(False)
                    msg = QMessageBox()
                    self.client.close()

                    self.ui.plainTextEdit.clear()
                    self.ui.listWidget.clear()
                    self.ui.pushButton.setEnabled(False)
                    msg.setWindowTitle("Ошибка!")
                    msg.setText(f"{value[1]}")
                    msg.setIcon(QMessageBox.Warning)
                    x = msg.exec_()
                elif value[2] == 'KICK_MESSAGE':
                    self.ui.pushButton_5.setText("Подключиться!")
                    icon = QtGui.QIcon()
                    icon.addPixmap(QtGui.QPixmap("icons/connect_icon.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
                    self.ui.pushButton_5.setIcon(icon)
                    self.ui.pushButton.setEnabled(False)
                    msg = QMessageBox()
                    self.client.close()

                    self.ui.plainTextEdit.clear()
                    self.ui.listWidget.clear()
                    self.ui.pushButton.setEnabled(False)
                    msg.setWindowTitle("Ошибка!")
                    msg.setText(f"{value[1]}")
                    msg.setIcon(QMessageBox.Warning)
                    x = msg.exec_() 
            else:
                self.ui.listWidget.clear()
                for i in value:
                    
                    item = QtWidgets.QListWidgetItem()
                    item.setTextAlignment(QtCore.Qt.AlignHCenter)
                    
                    item.setText(i)
                    self.ui.listWidget.addItem(item)
                
        def send_message(self):
            
            if len(self.ui.lineEdit_2.text()) > 0:
                message = self.ui.lineEdit_2.text()
                message_data = [self.nick, message, 'USER_MESSAGE']
                self.client.send(pickle.dumps(message_data))
                now = datetime.now()


                current_time = now.strftime("%H:%M")    
                self.ui.plainTextEdit.appendPlainText(f'[{current_time}] {self.nick}(Вы): {message}')
                self.ui.lineEdit_2.clear()
            
        def send_to_address(self, message):
            self.nick = self.ui.lineEdit_5.text()
            if len(message) > 0:
                
                self.client.send(pickle.dumps(
                                [self.nick, message, 'ADRESS_MESSAGE', self.adresat]))

                

            
        
class chat(QtCore.QThread):
    mysignal = QtCore.pyqtSignal(list)
    mysignal2 = QtCore.pyqtSignal(list)
    def __init__(self,server_socket, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.server_socket = server_socket
    

        self.message = None
    def run(self):
            while True:
                try:

                    self.message = pickle.loads(self.server_socket.recv(7168))
                    print(self.message)
                    
                    self.mysignal.emit(self.message)
                    
                except Exception as e:
                    pass
        

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = gui()
    MainWindow.show()
    sys.exit(app.exec_())
    

Дочернее:

import pickle
import socket
from PyQt5 import *
from lsdes import *
import sys
from main import gui
from datetime import datetime


class MyMessages(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = Ui_LsWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.send)
        
        
    def send(self):
        gui().send_to_address(self.ui.lineEdit_2.text())
        
        

class send(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)

    

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = MyMessages()
    MainWindow.show()
    sys.exit(app.exec_())

нужно с дочернего вызвать send_to_address и передать написанное юзером в lineEdit.


Ответы (1 шт):

Автор решения: S. Nick

Я не могу проверить ваше приложение, но предложу попробовать внести изменения в 'Дочернее':

import pickle
import socket
from PyQt5 import *
from lsdes import *
import sys

# --- from main import gui                                                  # ---

from datetime import datetime


class MyMessages(QtWidgets.QMainWindow):

    def __init__(self, parent=None):
        super().__init__(parent)
        
        self.parent = parent                                                # +++
        
        self.ui = Ui_LsWindow()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.send)
        
        
    def send(self):
#        gui().send_to_address(self.ui.lineEdit_2.text())
        self.parent.send_to_address(self.ui.lineEdit_2.text())             # +++
        

# ??? vvvv <---- класса именуются с заглавной буквы !!!
class send(QtCore.QThread):
    def __init__(self, parent=None):
        QtCore.QThread.__init__(self, parent)
→ Ссылка