Как вызвать функцию из другого класса (файла)
У меня есть чат на сокетах. Я вызываю окно, в котором хочу при нажатии отправить что-либо серверу.
Вызываю из дочернего окна функцию с отцовского. \
Но пишет ошибку:
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)