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

时间:2018-10-07 21:09:47

标签: python-3.x user-interface pyqt5

我试图在一行上显示“游戏名称:”(QLabel),输入框(QLineEdit)和QPushButton,并在底部显示“弹出式QLabel” 但是在使QGridLayout正常工作方面遇到困难

使用以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QPushButton, QLabel, QLineEdit, QGridLayout, QGroupBox, QDialog
from PyQt5.QtCore import pyqtSlot

class Window(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setWindowTitle("Project PiBu!!")

        self.createGridLayout()

        self.windowLayout = QVBoxLayout()
        self.windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(self.windowLayout)

        self.game_name = QLabel("Game Name:", self)

        self.game_line_edit = QLineEdit(self)

        self.search_button = QPushButton("Search", self)
        self.search_button.clicked.connect(self.on_click)

        self.game = QLabel(self)

        self.show()

    def createGridLayout(self):
        self.horizontalGroupBox = QGroupBox()
        self.layout = QGridLayout()
        self.layout.setColumnStretch(1, 4)
        self.layout.setColumnStretch(2, 4)

        self.layout.addWidget(self.game_name, 0, 0)
        self.layout.addWidget(self.game_line_edit, 0, 1)
        self.layout.addWidget(self.search_button, 0, 2)
        self.layout.addWidget(self.game, 1, 0)

        self.horizontalGroupBox.setLayout(layout)


    @pyqtSlot()
    def on_click(self):
        self.game.setText(self.game_line_edit.text())





if __name__ == '__main__':

    app = QApplication(sys.argv)
    win = Window()
    sys.exit(app.exec_())

我收到此错误:

AttributeError: 'Window' object has no attribute 'game_name'

为什么?

有一种简单而不是复杂的感觉,但也许我错了

请帮助!!!

谢谢!

1 个答案:

答案 0 :(得分:0)

调用createGridLayout方法的时间要早​​于定义其中使用的变量的时间。

import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QHBoxLayout, 
                            QVBoxLayout, QPushButton, QLabel, QLineEdit, 
                            QGridLayout, QGroupBox, QDialog)
from PyQt5.QtCore import pyqtSlot

class Window(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):

        self.setWindowTitle("Project PiBu!!")

#        self.createGridLayout()
#        self.windowLayout = QVBoxLayout()
#        self.windowLayout.addWidget(self.horizontalGroupBox)
#        self.setLayout(self.windowLayout)

        self.game_name      = QLabel("Game Name:", self)
        self.game_line_edit = QLineEdit(self)
        self.search_button  = QPushButton("Search", self)
        self.search_button.clicked.connect(self.on_click)
        self.game = QLabel(self)

        self.createGridLayout()                                 # < --
        self.windowLayout = QVBoxLayout()                       # < --
        self.windowLayout.addWidget(self.horizontalGroupBox)    # < --
        self.setLayout(self.windowLayout)                       # < --

        self.show()

    def createGridLayout(self):
        self.horizontalGroupBox = QGroupBox()
        self.layout = QGridLayout()
        self.layout.setColumnStretch(1, 4)
        self.layout.setColumnStretch(2, 4)

        # AttributeError: 'Window' object has no attribute 'game_name'
        self.layout.addWidget(self.game_name, 0, 0)

        self.layout.addWidget(self.game_line_edit, 0, 1)
        self.layout.addWidget(self.search_button, 0, 2)
        self.layout.addWidget(self.game, 1, 0)

        self.horizontalGroupBox.setLayout(self.layout)          # +++ self.

    @pyqtSlot()
    def on_click(self):
        self.game.setText(self.game_line_edit.text())

if __name__ == '__main__':

    app = QApplication(sys.argv)
    win = Window()
    sys.exit(app.exec_())

enter image description here