Разница: self.label_from = QLabel("",self) и label_from = QLabel("",self)

Разбираюсь с QMainWindow, есть такой код

#!/usr/bin/python

from PyQt6.QtWidgets import (QMainWindow, QLabel, QPushButton, QHBoxLayout, QWidget,
        QFileDialog, QApplication)
from PyQt6.QtGui import QIcon, QAction
from pathlib import Path
import sys

class Example(QMainWindow):

    recycledDir = ""

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

        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showDialog)

        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")

        self.label_from = QLabel("_____+++++___",self)
        self.label_from.resize(500, 10)
        self.label_from.move(150,55)

        button_from = QPushButton(QIcon(), "Каталог с каталогами:", self)
        button_from.move(5,30)
        button_from.resize(130,50)
        button_from.clicked.connect(self.showDialog)

        self.setCentralWidget(self.centralwidget)

        self.setGeometry(300, 300, 550, 450)
        self.setWindowTitle('C')
        self.show()

    def showDialog(self):

        home_dir = str(Path.home())
        fname = QFileDialog.getExistingDirectory(self, 'Open file', home_dir)
        print(type(self))
        self.label_from.setText(fname)
        self.recycledDir = fname


def main():

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())


if __name__ == '__main__':
    main()

Почему, если заменить:

self.label_from = QLabel("_____+++++___",self)
self.label_from.resize(500, 10)
self.label_from.move(150,55)

на:

label_from = QLabel("_____+++++___",self)
label_from.resize(500, 10)
label_from.move(150,55)

т.е. описать надпись также как описана кнопка ниже, то при выполнении self.label_from.setText(fname) в showDialog() вываливается ошибка?


Ответы (2 шт):

Автор решения: CrazyElf

self.label_from - переменная экземпляра класса, доступная во всех методах класса (которые имеют первым параметром self).

label_from - локальная переменная конкретной функции, другие функции эту переменную не увидят.

→ Ссылка
Автор решения: S. Nick

Я рекомендую вам для начала изучить основы ООП. @CrazyElf вам предоставил ответ почему вываливается ошибка.

Вы не написали почему вы так захотели сделать. Но если вам так захотелось, то вам надо передать в метод showDialog() объект label_from. Для этого вы можете воспользоваться функцией lambda:

import sys
from pathlib import Path
'''
from PyQt6.QtWidgets import (QMainWindow, QLabel, QPushButton, QHBoxLayout, QWidget,
        QFileDialog, QApplication)
from PyQt6.QtGui import QIcon, QAction
'''
from PyQt5.Qt import *


class Example(QMainWindow):
    recycledDir = ""

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

        openFile = QAction(QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open new File')
        openFile.triggered.connect(self.showDialog)

        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")

        label_from = QLabel("_____+++++___", self)
        label_from.resize(500, 10)
        label_from.move(150,55)

# ----> vvvvvvvvvvv
        button_from = QPushButton(QIcon(), "Каталог с каталогами:", self)
        button_from.move(5,30)
        button_from.resize(130,50)
# --------------------------------> vvvvvvv                vvvvvvvvvvv        
        button_from.clicked.connect(lambda: self.showDialog(label_from))

        self.setCentralWidget(self.centralwidget)

        self.setGeometry(300, 300, 550, 450)
        self.setWindowTitle('C')
        self.show()

# ---------------------> vvvvvvvvvv
    def showDialog(self, label_from):

        home_dir = str(Path.home())
        fname = QFileDialog.getExistingDirectory(self, 'Open file', home_dir)
        print(type(self))
# ----> vvvvvvvvvv
        label_from.setText(fname)
        self.recycledDir = fname


def main():
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка