为什么我 pyqt5 告诉我这个小部件不存在,如果我知道它存在?

帕多_
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'messagerGUI.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
# ""

from PyQt5 import QtCore, QtGui, QtWidgets
import socket
import threading


class Ui_MainWindow(object):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    header = 12
    connections = []
    ip = socket.gethostname()
    port = 1234
    connections_allowed = 3
    sock.bind((ip, port))
    sock.listen(connections_allowed)
    new_message = False

    def start(self):
        while True:
            self.conn, self.addr = self.sock.accept()
            threading.Thread(target=self.receive_data, args=[
                             self.conn], daemon=True).start()
            self.connections.append(self.conn)

    def receive_data(self, conn):
        self.reply = ""
        while True:
            try:

                message_lenth = conn.recv(self.header)
                lenth_of_message = message_lenth.decode("utf-8")

                if not message_lenth:
                    break

                elif message_lenth:
                    data = conn.recv(int(lenth_of_message))
                    self.reply = data.decode("utf-8")

                    print(self.reply)
                    self.new_message = True

                    for connection in self.connections:
                        if connection != conn:
                            connection.send(message_lenth.encode("utf-8"))
                            connection.send(self.reply.encode("utf-8"))

            except:
                break

    def packing_data_lenth(self, text):
        return len(text) * 4

    def send_data(self, data):
        try:
            for connection in self.connections:
                connection.send(
                    bytes(str(self.packing_data_lenth(data)), "utf-8"))
                connection.send(bytes(data, "utf-8"))
        except:
            pass


    def setupUi(self, MainWindow):
        threading.Thread(target=self.start, daemon=True).start()
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(499, 367)
        MainWindow.setStyleSheet("background-color: #113e4a;")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setContentsMargins(5, 5, 5, 5)
        self.horizontalLayout.setSpacing(5)
        self.horizontalLayout.setObjectName("horizontalLayout")

        self.info = QtWidgets.QWidget(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(
            self.info.sizePolicy().hasHeightForWidth())
        self.info.setSizePolicy(sizePolicy)
        self.info.setMinimumSize(QtCore.QSize(178, 357))
        self.info.setStyleSheet("background-color: #429178;\n"
                                "border-radius: 2px;")
        self.info.setObjectName("info")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout(self.info)

        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_3 = QtWidgets.QLabel(self.info)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_3.addWidget(self.label_3)
        spacerItem = QtWidgets.QSpacerItem(
            20, 317, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout_3.addItem(spacerItem)
        self.horizontalLayout.addWidget(self.info)

        self.message_widget()

        self.chat_area = QtWidgets.QWidget(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(
            self.chat_area.sizePolicy().hasHeightForWidth())
        self.chat_area.setSizePolicy(sizePolicy)
        self.chat_area.setMinimumSize(QtCore.QSize(306, 0))
        self.chat_area.setStyleSheet("background-color: #429178;")
        self.chat_area.setObjectName("chat_area")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.chat_area)
        self.verticalLayout.setContentsMargins(2, 2, 2, 2)
        self.verticalLayout.setSpacing(1)
        self.verticalLayout.setObjectName("verticalLayout")

        self.messages_area = QtWidgets.QScrollArea(self.chat_area)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.MinimumExpanding)
        sizePolicy.setHeightForWidth(
            self.messages_area.sizePolicy().hasHeightForWidth())
        self.messages_area.setSizePolicy(sizePolicy)
        self.messages_area.setMinimumSize(QtCore.QSize(0, 259))
        self.messages_area.setStyleSheet("background-color: #113e4a;")
        self.messages_area.setWidgetResizable(True)
        self.messages_area.setObjectName("messages_area")

        self.scrollAreaWidgetContents = QtWidgets.QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 300, 316))
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(
            self.scrollAreaWidgetContents.sizePolicy().hasHeightForWidth())
        self.scrollAreaWidgetContents.setSizePolicy(sizePolicy)
        self.scrollAreaWidgetContents.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(
            self.scrollAreaWidgetContents)
        self.verticalLayout_2.setSizeConstraint(
            QtWidgets.QLayout.SetNoConstraint)
        self.verticalLayout_2.setSpacing(6)
        self.verticalLayout_2.setObjectName("verticalLayout_2")

        spacerItem1 = QtWidgets.QSpacerItem(
            20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.MinimumExpanding)
        self.verticalLayout_2.addItem(spacerItem1)
        self.messages_area.setWidget(self.scrollAreaWidgetContents)
        self.verticalLayout.addWidget(self.messages_area)

        self.input_area = QtWidgets.QWidget(self.chat_area)
        self.input_area.setMinimumSize(QtCore.QSize(0, 30))
        self.input_area.setObjectName("input_area")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.input_area)
        self.horizontalLayout_2.setContentsMargins(1, 1, 1, 1)
        self.horizontalLayout_2.setSpacing(1)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.userInput = QtWidgets.QLineEdit(self.input_area)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.MinimumExpanding, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.userInput.sizePolicy().hasHeightForWidth())
        self.userInput.setSizePolicy(sizePolicy)
        self.userInput.setMinimumSize(QtCore.QSize(22, 32))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.userInput.setFont(font)
        self.userInput.setStyleSheet("background-color: rgb(17, 62, 74);\n"
                                     "color: #d0e8ce;\n"
                                     "border: 0px;")
        self.userInput.setInputMethodHints(QtCore.Qt.ImhNone)
        self.userInput.setFrame(True)
        self.userInput.setDragEnabled(True)
        self.userInput.setPlaceholderText("Type a message")
        self.userInput.setObjectName("userInput")
        self.horizontalLayout_2.addWidget(self.userInput)
        self.sendButton = QtWidgets.QPushButton(self.input_area)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.sendButton.sizePolicy().hasHeightForWidth())
        self.sendButton.setSizePolicy(sizePolicy)
        self.sendButton.setMinimumSize(QtCore.QSize(12, 32))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.sendButton.setFont(font)
        self.sendButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.sendButton.setMouseTracking(True)
        self.sendButton.setObjectName("sendButton")
        self.sendButton.clicked.connect(self.get_user_input)
        self.horizontalLayout_2.addWidget(self.sendButton)
        self.verticalLayout.addWidget(self.input_area)
        self.horizontalLayout.addWidget(self.chat_area)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

在这部分(函数 message_widget)中,我收到一个错误:

self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents) AttributeError: 'Ui_MainWindow' 对象没有属性 'scrollAreaWidgetContents'

即使我在 get_user_input 函数中做了类似的事情,我知道代码是一团糟,但唯一不工作的部分是这部分,套接字服务器和客户端都正常工作,我测试了打印在终端中收到的文本,所以是的,我想知道为什么我会收到这个错误?

    def message_widget(self):
        self.widget = QtWidgets.QWidget(self.scrollAreaWidgetContents)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(
            self.widget.sizePolicy().hasHeightForWidth())
        self.widget.setSizePolicy(sizePolicy)
        self.widget.setMinimumSize(QtCore.QSize(158, 25))
        self.widget.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.widget.setStyleSheet(
            "background-color: #d35439;\n" "border-radius: 4px;")
        self.widget.setObjectName("widget")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")

        self.label = QtWidgets.QLabel(self.widget)
        self.label.setScaledContents(True)
        self.label.setObjectName("label")
        self.label.text(self.reply)
        self.horizontalLayout_3.addWidget(self.label)
        self.verticalLayout_2.addWidget(self.widget)

    def get_user_input(self):
        self.user_msg = self.userInput.text()

        threading.Thread(target=self.send_data, args=[
                         self.user_msg], daemon=True).start()

        self.widget_2 = QtWidgets.QWidget(self.scrollAreaWidgetContents)
        sizePolicy = QtWidgets.QSizePolicy(
            QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum)
        sizePolicy.setHeightForWidth(
            self.widget_2.sizePolicy().hasHeightForWidth())
        self.widget_2.setSizePolicy(sizePolicy)
        self.widget_2.setMinimumSize(QtCore.QSize(182, 25))
        self.widget_2.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.widget_2.setStyleSheet("background-color: rgb(236, 172, 55);\n"
                                    "border-radius: 4px;")
        self.widget_2.setObjectName("widget_2")
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.widget_2)
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")

        self.label_2 = QtWidgets.QLabel(self.widget_2)
        self.label_2.setLayoutDirection(QtCore.Qt.RightToLeft)
        self.label_2.setAlignment(
            QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
        self.label_2.setObjectName("label_2")
        self.label_2.setText(self.user_msg)
        self.horizontalLayout_4.addWidget(self.label_2)
        self.verticalLayout_2.addWidget(self.widget_2)
        self.userInput.setText("")

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "PadoMessager"))
        self.label_3.setText(_translate("MainWindow", "Server"))
        self.sendButton.setText(_translate("MainWindow", "Send"))
        self.sendButton.setShortcut(_translate("MainWindow", "Return"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
音乐家

认为它存在,但当你调用message_widget()时,它还不存在。

实际上,您是此行之前调用该函数

self.scrollAreaWidgetContents = QtWidgets.QWidget()

因此,如果您至少创建该小部件之后放置该功能,它就可以工作


不幸的是,您的代码还存在其他严重问题。

最重要的是你正在修改 pyuic 的输出来创建你的程序,这是非常不鼓励的(而且WARNING开头消息应该是一个提示)。

从UI文件生成的Python脚本应该NEVER进行编辑,但作为在实际程序文件导入。最明显的原因是,一旦您想在 ui 中进行一些更改,您就会发现自己陷入了尝试将新生成的代码与您迄今为止编写的内容合并的麻烦之中。

要了解更多信息,请阅读有关使用 Designer的文档

代码中的其他问题:

  • Qt中的threading应该尽量和Qt自带的QThread一起使用;
  • UI对象应该从不被访问,也不由外部螺纹修改; 为此,您必须使用 QThread,并使用信号和插槽与主 Qt 线程通信;
  • QLabel.text()不接受参数,因为它用于访问 text 属性;要设置标签的文本,请使用setText();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

PyQT5:为什么我的文件窗口立即打开?

为什么AWS告诉我BucketAlreadyExists不存在?

当我在 pyqt5 中使用 Slider 时,为什么我的程序正在关闭?

为什么Java告诉我我的软件包不存在?

为什么 Flutter 编译器告诉我我的应用不存在?

PyQt5自我参考

为什么我的keyPressEvent无法注册或无法使用PyQt5?

为什么我的 QThread 类会大大减慢 PyQT5 应用程序的速度?

为什么我的 PyQt5 Webview 代码不起作用?

PyQt5 - 为什么我的标签只显示文件的最后一行?

Typescript告诉我'string'类型不存在属性'padStart'。为什么?

Django 告诉我模板不存在

pyqt5我保存图像,但是它总是空的

为什么H2数据库告诉我仅某些测试我的表不存在

为什么运行pybind11 c ++ lib的pyqt5 QThread仍然挂起我的主GUI?

为什么我不能在嵌入在 pyqt5 gui 中的 matplotlib 颜色图中成功绘制感兴趣的区域?

在 PyQt5 中,我们如何获取焦点小部件的名称/对象名称?

pyqt5:一些小部件在我的标签中消失了

pyqt5,为什么小部件在OOP版本中会重叠

realpath 告诉我我的目录不存在,但它确实存在

(PyQt)为什么我不能更改QTextEdit小部件的字体?

pyqt5我想删除QTreeWidget中的箭头图标

我无法完全关闭 PyQt5 脚本

连接按钮时,我在pyqt5中遇到错误

我无法退出程序,只是关闭窗口pyqt5

Python pyqt5 我的组合框无法正常工作

计算机告诉我文件存在时不存在

Laravel模型告诉我我要创建的属性不存在?

Ruby一直告诉我我的文件不存在