pyqt5 пытается использовать QGridLayout для организации моего QLabel, QLineEdit, QPushButton и «всплывающего» QLabel - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь отобразить «Game Name:» (QLabel), поле ввода (QLineEdit) и QPushButton в одной строке и «Pop-up» 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 голосов
/ 08 октября 2018

Вы вызываете метод 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

...