Вызов метода из другого класса - PullRequest
0 голосов
/ 19 июня 2020

Я новичок в PyQt5, и я пытаюсь создать интерактивный gui для построения графиков данных. Однако эта проблема вполне может быть совершенно не связана с PyQt5 и больше связана с моим пониманием объектно-ориентированного программирования в целом.

У меня есть класс MainWindow, SupportClass1 и SupportClass2. Когда я создаю экземпляр SupportClass1, я хочу вызвать метод DoSomething в классе MainWindow, ссылаясь на объект window, но получаю сообщение об ошибке NameError: name 'window' is not defined.

У меня нет проблем с созданием метода в SupportClass2 и его вызовом из класса MainWindow, поэтому у меня создается впечатление, что я не создал экземпляр класса MainWindow правильно, чего я не понимаю, поскольку думал, что определил window как экземпляр класса MainWindow.

Может ли кто-нибудь помочь мне понять, что не так в моем логи c и как решить эту проблему?

from PyQt5 import QtWidgets, QtCore
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
import sys
import os
from random import randint


class MainWindow(QWidget):

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

        self.graphWidget = pg.PlotWidget()

        self.x = list(range(100))
        self.y = [randint(0,100) for _ in range(100)]

        self.graphWidget.setBackground('w')

        pen = pg.mkPen(color=(255, 0, 0))
        self.data_line =  self.graphWidget.plot(self.x, self.y, pen=pen)

        self.button = QPushButton('Test')
        self.button.clicked.connect(self.InstantiateSupportClasses)

        self.gui_box = QVBoxLayout()
        self.gui_box.addWidget(self.graphWidget)
        self.gui_box.addWidget(self.button)

        self.setLayout(self.gui_box)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Test application')
        self.show()

    def InstantiateSupportClasses(self):
        supp_class2 = SupportClass2()
        print(supp_class2.GetVariable())

        supp_class1 = SupportClass1()

    def DoSomething(self):
        print('I did something!')


class SupportClass1():
    def __init__(self):
        window.DoSomething

class SupportClass2():
    def __init__(self):
        self.some_variable = 5

    def GetVariable(self):
        return self.some_variable


def main():
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    window = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()```

1 Ответ

0 голосов
/ 19 июня 2020

Я вижу, что вы используете объект «окно» из класса «SupportClass1». но этот класс не распознает этот объект, одно из решений - вставить этот объект в «SupportClass1 ()»

from PyQt5 import QtWidgets, QtCore
from pyqtgraph import PlotWidget, plot
import pyqtgraph as pg
import sys
import os
from random import randint


class MainWindow(QWidget):

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

        self.graphWidget = pg.PlotWidget()

        self.x = list(range(100))
        self.y = [randint(0,100) for _ in range(100)]

        self.graphWidget.setBackground('w')

        pen = pg.mkPen(color=(255, 0, 0))
        self.data_line =  self.graphWidget.plot(self.x, self.y, pen=pen)

        self.button = QPushButton('Test')
        self.button.clicked.connect(self.InstantiateSupportClasses)

        self.gui_box = QVBoxLayout()
        self.gui_box.addWidget(self.graphWidget)
        self.gui_box.addWidget(self.button)

        self.setLayout(self.gui_box)

        self.setGeometry(300, 300, 300, 150)
        self.setWindowTitle('Test application')
        self.show()

    def InstantiateSupportClasses(self):
        supp_class2 = SupportClass2()
        print(supp_class2.GetVariable())

        supp_class1 = SupportClass1(self)

    def DoSomething(self):
        print('I did something!')


class SupportClass1():
    def __init__(self, window):
        window.DoSomething()

class SupportClass2():
    def __init__(self):
        self.some_variable = 5

    def GetVariable(self):
        return self.some_variable


def main():
    app = QApplication(sys.argv)
    app.setStyle('Fusion')
    window = MainWindow()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...