使用QDialog中的QPushButton更新QLabel

安德烈斯

我才刚开始使用PyQt5,并且试图通过子类(QDialog)内的按钮来更新标签的信息。当我按下按钮时,程序停止并显示消息:

"AttributeError: 'New_Player_Window' object has no attribute 'name_window_label'

这个想法是,当按下按钮时,默认情况下为“ Anonimous”的Qlabel成为用户名。

代码是:

from PyQt5 import QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, 
QLineEdit, QLabel, QWidget, QPushButton, QMessageBox, QAction, QMenu, 
QDialog
import sys

class General_Window(QMainWindow):
  def __init__(self):
    super().__init__()
    self.initUI()
  def initUI(self):
    self.resize(500, 500)
    self.move(300, 100)
    self.setWindowTitle('Black Jack')
    #MENUBAR
    menubar = self.menuBar()
    fileMenu = menubar.addMenu('File')
    newAct = QAction('New Player', self)
    newAct.triggered.connect(General_Window.new_player)
    fileMenu.addAction(newAct)
    #LABEL
    self.name_window_label = QLabel('Anonimous', self)
    self.name_window_label.move(245, 15)
    self.show()

  def update_window(self, value):
    print(str(value))
    self.name_window_label.setText(str(value))

  def new_player(self):
    class New_Player_Window(QDialog, General_Window):
        def __init__(self):
            super().__init__()
            self.initUI()

        def create(self):
            try:
                int(self.money.text()) + 2
            except:
                QMessageBox.question(self, 'PyQt5 message', "You need to 
                insert a Number", QMessageBox.Ok , QMessageBox.Ok) 
            else:
                global value
                value = self.name.text()
                print(value)
                self.update_window(value)

        def initUI(self):                   
            self.setGeometry(300, 230, 250, 120)
            self.setWindowTitle('User Information')    
            #TEXTBOX1
            self.name = QLineEdit(self)
            self.name.move(110, 5)
            self.name.resize(110,20)
            #TEXTBOX2
            self.money = QLineEdit(self)
            self.money.move(110, 40)
            self.money.resize(110,20)
            #BUTTON1
            self.button = QPushButton('Create', self)
            self.button.move(5,80)
            self.button.clicked.connect(self.create)
            #BUTTON2
            self.button2 = QPushButton('Cancel', self)
            self.button2.move(120,80)
            #LABELNAME
            self.name_label = QLabel('SHORT NAME', self)
            self.name_label.move(20,10)
            #LABELNAME
            self.money_label = QLabel('MONEY AVAILABLE', self)
            self.money_label.move(10,45)

            self.show()
            self.exec_()


    if __name__=="__main__":
        New_Player_Window()

if __name__=="__main__":
 app = QApplication(sys.argv)
 ag = General_Window()  
 sys.exit(app.exec_())
永乐

您有几个错误:

  • 如您所指出的,General_Window具有name_window_label属性,因此可以预期New_Player_Window也将具有它,但是name_window_label是在initUI中创建的,但是您已经在New_Player_Window类中覆盖了它,因此即使该属性存在,它也不存在,它不是另一个窗口的name_window_label,因为它是另一个具有另一个对象的类,我建议阅读有关OOP的文章,尤其是有关继承和组合的文章。

  • 拥有另一个类的内部类被认为是一种不好的做法(django等例外),因为您随时都在创建该类,从而不必要地花费了资源。

  • 这本身不是错误,而是一种错误做法,请不要使用全局变量,因为调试全局变量很复杂,因为它的生命周期很困难,可能会掩盖其他类型的问题。

  • 最后,考虑为用户使用适当的小部件以输入适当的数据类型,例如,对整数值使用QSpinBox,这样可以避免不必要的检查。我还将建议添加到布局的使用中,如我将在答案中所示。

在解决方案的设计中,创建小部件时,将其视为接收输入并生成输出的黑盒,如果输出是同步的,则使用一种方法来检索信息;如果是异步的,则使用信号在QDialog的另一侧,是专门用于请求信息的类,因此您不应在New_Player_Window中更新信息,而必须在General_Window中更新信息。QDialog用于exec_()返回用户是否接受或拒绝请求,但为此必须调用接受或拒绝。

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class New_Player_Window(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.initUI()

    def get_values(self):
        return self.name.text(), self.money.value()

    def initUI(self):
        self.setWindowTitle('User Information')   
        #TEXTBOX1
        self.name = QtWidgets.QLineEdit()
        #TEXTBOX2
        self.money = QtWidgets.QSpinBox(maximum=2147483647)
        #BUTTON1
        self.button = QtWidgets.QPushButton('Create')
        self.button.clicked.connect(self.accept)
        #BUTTON2
        self.button2 = QtWidgets.QPushButton('Cancel')
        self.button2.clicked.connect(self.reject)

        lay = QtWidgets.QVBoxLayout(self)
        flay = QtWidgets.QFormLayout()
        flay.addRow("SHORT NAME", self.name)
        flay.addRow("MONEY AVAILABLE", self.money)
        lay.addLayout(flay)
        hlay = QtWidgets.QHBoxLayout()
        hlay.addWidget(self.button)
        hlay.addWidget(self.button2)
        lay.addLayout(hlay)
        self.setFixedSize(self.sizeHint())


class General_Window(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Black Jack')
        #MENUBAR
        menubar = self.menuBar()
        fileMenu = menubar.addMenu('File')
        newAct = QtWidgets.QAction('New Player', self)
        newAct.triggered.connect(self.new_player)
        fileMenu.addAction(newAct)
        #LABEL
        self.name_window_label = QtWidgets.QLabel('Anonimous', alignment=QtCore.Qt.AlignCenter)
        widget = QtWidgets.QWidget()
        self.setCentralWidget(widget)
        lay = QtWidgets.QVBoxLayout(widget)
        lay.addWidget(self.name_window_label, alignment=QtCore.Qt.AlignTop)

    def update_window(self, value):
        self.name_window_label.setText(value)

    def new_player(self):
        w = New_Player_Window()
        if w.exec_() == QtWidgets.QDialog.Accepted:
            name, value = w.get_values()
            print(name, value)
            self.update_window(name)


if __name__=="__main__":
     app = QtWidgets.QApplication(sys.argv)
     ag = General_Window()  
     ag.show()
     sys.exit(app.exec_())

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

QLabel和QPushButton对齐

pyqt5 尝试使用 QGridLayout 来组织我的 QLabel、QLineEdit、QPushButton 和“弹出式”QLabel

使用QLabel在PyQt GUI中显示gif

PyqQt将代码中的QLabel / QPushButton的颜色更改为红色(以显示“忙”状态),并在执行后再次返回

在PyQt5中找到多个随机创建的小部件(例如QLabel,QPushButton等)的mousepress事件的父级

在PYQT4中创建和更新多个QLabel

如何在 PyQt5 中更新 QLabel?

使用 QTimer 时 QLabel 文本不会更新

从文件中动态更新Qdialog中的QTextBrowser(由另一个作业更新)

如何在Qpushbutton的帮助下更改QDialog框的宽度

不更新 QLabel 值

通过QDialog框内的QLabel显示计时器

如何在Qt的CentralWidget中用QLabel替换QPushButton?

项目的Qt多种样式类型(QLabel,QPushbutton等)

使用PySide在灵活的网格布局中布局QPushButton

如何使用变量在 QLabel 中嵌入 url 链接

PyQt5使用内存中的QLabel显示图像

自动更新QLabel文字

使用QLinearGradient绘制QPushButton

QLabel中的gif图像

覆盖 QLabel 中的 setText()

使用 QLabel 修改 Qdial

QDialog 中的居中 OK 按钮

如何使用USB串行数据(来自Arduino)刷新/更新QLabel?

QDialog:如何使用问号(?)按钮?

无法通过关闭操作从对话框内的 QPushButton 关闭 QDialog

QDialog - 如何在pyqt5中使用自定义按钮关闭

QTableWidget中QPushButton的Lambda插槽

在 QMessageBox 中设置 QPushButton 的背景