Как использовать список из функции в другую функцию

#python-3.x #list #function #class

Вопрос:

Я создаю программу с графическим интерфейсом, в которой есть две кнопки. Когда я нажимаю первую кнопку, я хочу сгенерировать случайный код. Когда я нажимаю вторую кнопку, я хочу увидеть список кодов, сгенерированных с помощью первой кнопки. (Пока просто распечатайте список кодов в окне «Выполнить».) Мой сценарий следующий:

 class Ui_Main_Window(object):

    # For the first button:
    def Code_maker(self):
        import random
        Codes_list = []
        chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$%^amp;*`#/?[]{}-_~"
        for x in range(1):
            password = ""
            for y in range(0, 10):
                password_char = random.choice(chars)
                password  = password_char
            print(password)
            Codes_list.append(password)

    # For the second button:
    def show_list(self):
             print (Codes_list)

    # To connect the actions with the buttons:
    def setupUi(self, Main_Window):
        # After some code...
        self.Button_New_code.clicked.connect(self.Code_maker)
        # After some code...
        self.Button_Show_list.clicked.connect(self.show_list)
# The continuation of the program...
 

Моя проблема в том, что, когда я нажимаю первую кнопку, код успешно генерируется и выводится в окно «Выполнить». Но когда я нажимаю вторую кнопку, программа выходит из строя, и через несколько секунд она закрывается. Я получаю эту ошибку:

 > Unresolved reference 'Codes_list'.
 

(Я использую Pycharm, и ошибка отображается не в окне «Выполнить», а в окне «Проблемы».)

Я попытался восстановить его с помощью глобального списка, но программа работает хуже. Он вылетает, когда я нажимаю какую-либо из двух кнопок… Если я напишу код таким образом, он станет:

 class Ui_Main_Window(object):

    Codes_list = []

    # For the first button:
    def Code_maker(self):
        import random
        global Codes_list
        chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$%^amp;*`#/?[]{}-_~"
        for x in range(1):
            password = ""
            for y in range(0, 10):
                password_char = random.choice(chars)
                password  = password_char
            print(password)
            Codes_list.append(password)

    # For the second button:
    def show_list(self):
             print (Codes_list)

    # To connect the actions with the buttons:
    def setupUi(self, Main_Window):
        # After some code...
        self.Button_New_code.clicked.connect(self.Code_maker)
        # After some code...
        self.Button_Show_list.clicked.connect(self.show_list)
 

Я искал информацию о своей проблеме в Google, но я перепробовал так много вещей, что не помню, что я пробовал. Ничего не помогало.

Ответ №1:

Это должно сработать. Я добавил комментарии к строкам, которые я добавил или изменил для вашей справки. Не могли бы вы, пожалуйста, проверить?

 class Ui_Main_Window(object):

    def __init__(self):
        # added the constructor to attach the list with the object itself
        self.Codes_list = []  #this will contain the numbers

    # For the first button:
    def Code_maker(self):
        import random
        #Codes_list = []  # Removed
        chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!$%^amp;*`#/?[]{}-_~"
        for x in range(1):
            password = ""
            for y in range(0, 10):
                password_char = random.choice(chars)
                password  = password_char
            print(password)
            self.Codes_list.append(password)  # modified to update the object attribute

    # For the second button:
    def show_list(self):
             print (self.Codes_list)  # modified to access the object attribute

    # To connect the actions with the buttons:
    def setupUi(self, Main_Window):
        # After some code...
        self.Button_New_code.clicked.connect(self.Code_maker)
        # After some code...
        self.Button_Show_list.clicked.connect(self.show_list)
    # The continuation of the program...