Разница: 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 шт):
self.label_from - переменная экземпляра класса, доступная во всех методах класса (которые имеют первым параметром self).
label_from - локальная переменная конкретной функции, другие функции эту переменную не увидят.
Я рекомендую вам для начала изучить основы ООП.
@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()

