pyqt5 «AttributeError: объект типа« Окно »не имеет метки атрибута», но так ли это? - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь создать пользовательский интерфейс для текстовой игры.

Это прекрасно работает, однако я хотел создать свою собственную простую функцию печати для печати на частях пользовательского интерфейса (в примере QLabel)это работает, если функция находится в файле пользовательского интерфейса, но когда я перемещаю функции в другой файл, я получаю

"AttributeError: тип объекта" Window "не имеет атрибута" label ""

даже если в моей IDE написано, что Window.label существует до его запуска.

Это какая-то причуда или QT?или я ошибаюсь?

UI.py

import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *

class Window(QWidget):

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

        self.show()
        import game     

        self.label = QLabel("Text")
        self.label.setAlignment(Qt.AlignCenter | Qt.AlignTop)        

        self.output = QTextEdit()
        self.output.setReadOnly(True)        

        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.label,0,0,1,10)
        grid.addWidget(self.output,1,0,10,10)

        self.setLayout(grid)

        game.Game.test()    

if __name__ == '__main__':

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

Game.py

from UI import Window

class Game():

    def print_UI(self,*Args, **Kwargs):

        Window.setup.output.insertPlainText(*Args, **Kwargs)

    def print_label(self,*Args, **Kwargs):

        Window.label.setText(*Args, **Kwargs) 

    def test():

        Game.print_label("HI")

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Вы можете передать объект окна в качестве параметра конструктору Game вместо импорта игры в класс Window и повторного импорта Window в игре, так как это оставляло элемент метки неинициализированным

UI.py

import sys
from PyQt5 import QtWidgets, QtGui, QtCore
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import game

class Window(QWidget):

    def __init__(self):
        super().__init__()
        self.show()
        self.label = QLabel("Text")
        self.label.setAlignment(Qt.AlignCenter | Qt.AlignTop)        
        self.output = QTextEdit()
        self.output.setReadOnly(True)        
        grid = QGridLayout()
        grid.setSpacing(10)
        grid.addWidget(self.label,0,0,1,10)
        grid.addWidget(self.output,1,0,10,10)
        self.setLayout(grid)



if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Window()
    game.Game(ex).test()   
    sys.exit(app.exec_())

game.py

class Game():

    def __init__(self,window):

        self.Window = window
    def print_UI(self,*Args, **Kwargs):

        self.Window.setup.output.insertPlainText(*Args, **Kwargs)

    def print_label(self,*Args, **Kwargs):

        self.Window.label.setText(*Args, **Kwargs) 

    def test(self):
        self.print_label("HI")
0 голосов
/ 31 мая 2018

Я считаю, что проблема в том, что вы пытаетесь заниматься объектно-ориентированным программированием, но на самом деле не занимаетесь объектно-ориентированным программированием.Например, вы пытаетесь использовать свой класс Window в классе Game.py Game, просто импортируя его и вызывая его функции.Вместо этого вам нужно использовать наследование.А именно, ваш Game.py класс Game должен наследовать от вашего UI.py Window класса.

Измените Game.py на следующее:

from UI import Window

class Game(Window): # Game is inheriting from Window
    def __init__(self):
        Window.__init__(self) # Game is inheriting Window class attributes & functions

    def print_UI(self,*Args, **Kwargs):        
        self.setup.output.insertPlainText(*Args, **Kwargs) # self refers to Game as well as Window class 

    def print_label(self,*Args, **Kwargs):        
        self.label.setText(*Args, **Kwargs) # self refers to Game as well as Window class

    def test():        
        Game.print_label("HI")

Вместо использования Window.__init__(self) вы можете ознакомиться с объяснением функции super().

...