Python pyqt5“;AttributeError:type object';窗口';“没有属性标签”;但确实如此?

Python pyqt5“;AttributeError:type object';窗口';“没有属性标签”;但确实如此?,python,python-3.x,methods,pyqt5,Python,Python 3.x,Methods,Pyqt5,我正在尝试创建一个文本游戏的用户界面 这很好,但是我想创建我自己的简单打印函数来打印到UI的各个部分(在示例中是QLabel)。如果函数在UI文件中,但当我将函数移动到另一个文件时,我得到 “AttributeError:类型对象'Window'没有属性'label'” 即使我的IDE说Window.label在运行之前存在 这是怪癖还是QT?还是我犯了一个错误 UI.py import sys from PyQt5 import QtWidgets, QtGui, QtCore from Py

我正在尝试创建一个文本游戏的用户界面

这很好,但是我想创建我自己的简单打印函数来打印到UI的各个部分(在示例中是QLabel)。如果函数在UI文件中,但当我将函数移动到另一个文件时,我得到

“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_())
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")
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_())
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")
Game.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_())
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")
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_())
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")

我认为问题在于,您试图进行面向对象编程,但实际上并没有进行面向对象编程。例如,您试图在
Game.py
Game
类中使用
窗口
类,只需导入它并调用它的函数即可。相反,您需要做的是使用继承。也就是说,您的
Game.py
Game
类应该继承自您的
UI.py
窗口的

将您的
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")

您可以查看函数的说明,而不是使用
窗口。

我认为问题在于您试图进行面向对象编程,但实际上没有进行面向对象编程。例如,您试图在
Game.py
Game
类中使用
窗口
类,只需导入它并调用它的函数即可。相反,您需要做的是使用继承。也就是说,您的
Game.py
Game
类应该继承自您的
UI.py
窗口的

将您的
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")

您可以查看函数的说明,而不是使用
窗口。

您可以将窗口对象作为参数传递给游戏的构造函数,而不是在窗口类中导入游戏,并在游戏中再次导入窗口,因为这样会使标签成员未初始化

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_())
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")
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_())
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")
game.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_())
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")
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_())
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")

您可以将window对象作为参数传递给Game的构造函数,而不是在window类中导入Game并在Game中再次导入window,因为这样会使标签成员未初始化

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_())
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")
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_())
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")
game.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_())
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")
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_())
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")

的可能重复项对我不起作用,如果我安装Window(),它经常打开窗口,然后出现递归错误。的可能重复项对我不起作用,如果我安装Window(),它经常打开窗口,然后出现递归错误。