Python Глобальные переменные

Есть переменная where_save, которая сохраняет путь сохранения файла и используется в нескольких функциях:

def save():
    global where_save
    where_save = QFileDialog.getExistingDirectory()

def select_the_directory():
    directory = QFileDialog.getExistingDirectory()
    print(f"Выбрать папку: {directory}")
    shutil.copy2(f"{directory}", f"{where_save}")

ui.pushButton_3.clicked.connect(select_the_directory)
ui.pushButton_2.clicked.connect(save)

Выводит ошибку в терминале:

File "C:\Users\Lenovo\Desktop\Squirrel (Backups easy) by  kapitanov\core\main.py", line 52, in select_the_directory
    shutil.copy2(f"{directory}", f"{where_save}")
NameError: name 'where_save' is not defined

Вопрос: почему переменная where_save не стала глобальной?


Update

https://github.com/immadev2k21/Squirrel извиняюсь, но по-другому невозможно.


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

Автор решения: KLEYZYツ

В общем добавил во всех функциях копирования, переменную сохранения, спасибо тем, кто прокомментировал

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

Некоторые рекомендации для вас:

  • срочно займитесь изучением ООП;

  • чтобы иметь доступ к объекту, например where_save, вам надо сделать его атрибутом класса. В конструкторе класса self.where_save = None

  • создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения формой созданной в Qt Designer;

    class MainWindow(QMainWindow, Ui_MainWindow):
        def __init__(self):
            super().__init__()
            self.setupUi(self)
        ...
  • прежде чем копировать файл, проверьте все ли необходимые данные у вас имеются и если да, то выполняйте задуманную операцию.
    if file and self.where_save:
        ...

main.py

import sys
import os
import shutil
from PyQt5.QtWidgets import QFileDialog, QMessageBox, \
    QMainWindow, QApplication
from main_ui import Ui_MainWindow 


class MainWindow(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self.select_the_file)
        self.pushButton_3.clicked.connect(self.select_the_directory)
        self.pushButton_4.clicked.connect(self.select_the_files)
        self.checkBox_3.stateChanged.connect(self.show_dialog) 
        
        self.where_save = None                                       # +++

    def select_the_file(self):
        file = QFileDialog.getOpenFileName()[0]
#        where_save = QFileDialog.getExistingDirectory()
        if file and self.where_save:                      # +++ self.where_save
            print(f"Выбран файл: {file}")
            shutil.copy2(f"{file}", f"{self.where_save}") # +++ self.where_save
            msg = QMessageBox.information(
                self,
                "Success!", 
                f"Файл {file} \nсохранен в: \n{self.where_save}"
            )
        else:
            print(f"\nВы не выбрали файл: `{file}` или Directory: `{self.where_save}`")

    def select_the_directory(self):
# ???        os.system('cls')                      
        self.where_save = QFileDialog.getExistingDirectory()  # +++ self.where_save

    def select_the_files(self):
        files = QFileDialog.getOpenFileNames()[0]
#        file_2 = QFileDialog.getOpenFileName()[0] 
#        where_save = QFileDialog.getExistingDirectory()

        if files and self.where_save:                         # +++ self.where_save
            for file in files:
                shutil.copy2(f"{file}", f"{self.where_save}") # +++ self.where_save
        else:
            print(f"\nВы не выбрали файлы или Directory.")

    def show_dialog(self, state):
        if state:                                        # == QtCore.Qt.Checked:
            question = QMessageBox()
            question.setIcon(QMessageBox.Question)
            question.setText("Поставить пароль на архив?")
            question.setWindowTitle("Вопрос")
            question.setIcon(QMessageBox.Question)
            question.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
            answer = question.exec()
            if answer == QMessageBox.Yes:
                print(f'Yes') 
            else:
                pass
        else:
            return
   
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

main_ui.py

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("Squirrel")
        MainWindow.resize(720, 400)
        MainWindow.setStyleSheet("QMainWindow {\n"
"    font-family: \'Poppins\', sans-serif;\n"
"    background: #161623;\n"
"}")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(240, 20, 281, 71))
        font = QtGui.QFont()
        font.setFamily("Poppins")
        font.setPointSize(-1)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setStyleSheet("QLabel {\n"
"    font-size: 48px;\n"
"    color: #f2f2f2;\n"
"}")
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(550, 360, 131, 16))
        font = QtGui.QFont()
        font.setFamily("Poppins Medium")
        self.label_2.setFont(font)
        self.label_2.setStyleSheet("QLabel {\n"
"    color: #f2f2f2;\n"
"}")
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(230, 130, 241, 41))
        font = QtGui.QFont()
        font.setFamily("Poppins")
        font.setPointSize(-1)
        font.setBold(True)
        font.setWeight(62)
        self.pushButton.setFont(font)
        self.pushButton.setStyleSheet("QPushButton {\n"
"    text-transform: uppercase;\n"
"    background-color: #6B6ABE;\n"
"    padding: 10px 30px;\n"
"    font-size: 18px;\n"
"    letter-spacing: 2px;\n"
"    color: #fff;\n"
"    border-radius: 2px;\n"
"    font-weight: 500;\n"
"}\n"
"\n"
"QPushButton:hover {\n"
"    background-color: #535293;\n"
"}\n"
"\n"
"QPushButton:pressed {\n"
"    background-color: #444378;\n"
"}")
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("../core/static/images/folder (1).svg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        self.pushButton.setIcon(icon)
        self.pushButton.setObjectName("pushButton")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(210, 270, 281, 41))
        font = QtGui.QFont()
        font.setFamily("Poppins")
        font.setPointSize(-1)
        font.setBold(True)
        font.setWeight(62)
        self.pushButton_3.setFont(font)
        self.pushButton_3.setStyleSheet("QPushButton {\n"
"    text-transform: uppercase;\n"
"    background-color: #6B6ABE;\n"
"    padding: 10px 30px;\n"
"    font-size: 18px;\n"
"    letter-spacing: 2px;\n"
"    color: #fff;\n"
"    border-radius: 2px;\n"
"    font-weight: 500;\n"
"}\n"
"\n"
"QPushButton:hover {\n"
"    background-color: #535293;\n"
"}\n"
"\n"
"QPushButton:pressed {\n"
"    background-color: #444378;\n"
"}")
        self.pushButton_3.setIcon(icon)
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setGeometry(QtCore.QRect(220, 200, 261, 41))
        font = QtGui.QFont()
        font.setFamily("Poppins")
        font.setPointSize(-1)
        font.setBold(True)
        font.setWeight(62)
        self.pushButton_4.setFont(font)
        self.pushButton_4.setStyleSheet("QPushButton {\n"
"    text-transform: uppercase;\n"
"    background-color: #6B6ABE;\n"
"    padding: 10px 30px;\n"
"    font-size: 18px;\n"
"    letter-spacing: 2px;\n"
"    color: #fff;\n"
"    border-radius: 2px;\n"
"    font-weight: 500;\n"
"}\n"
"\n"
"QPushButton:hover {\n"
"    background-color: #535293;\n"
"}\n"
"\n"
"QPushButton:pressed {\n"
"    background-color: #444378;\n"
"}")
        self.pushButton_4.setIcon(icon)
        self.pushButton_4.setObjectName("pushButton_4")
        self.checkBox_3 = QtWidgets.QCheckBox(self.centralwidget)
        self.checkBox_3.setGeometry(QtCore.QRect(30, 350, 171, 20))
        self.checkBox_3.setStyleSheet("QCheckBox {\n"
"    color: #000;\n"
"    background-color: #f2f2f2;\n"
"    border-radius: 5px;\n"
"    padding: 5px;\n"
"}")
        self.checkBox_3.setObjectName("checkBox_3")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Squirrel"))
        self.label.setText(_translate("MainWindow", "SQUIRREL"))
        self.label_2.setText(_translate("MainWindow", "made by kapitanov"))
        self.pushButton.setText(_translate("MainWindow", "Выбрать файл"))
        self.pushButton_3.setText(_translate("MainWindow", "Выбрать каталог"))
        self.pushButton_4.setText(_translate("MainWindow", "Выбрать файлы"))
        self.checkBox_3.setText(_translate("MainWindow", "Запаковать в zip архив"))

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

→ Ссылка