Python атрибут self.attribute не виден при вызове метода класса - PullRequest
0 голосов
/ 08 марта 2020

У меня есть проблема, связанная с TKinter GUI, которую я создаю, но проблема не обязательно задается c для этой библиотеки.

Фон

В настоящее время я нахожусь на продвинутом этапе python курса самообучения. Учебный модуль, на котором я работаю, охватывает TKinter для создания интерактивных GUI. Я создаю игру, в которой случайно сгенерированные пронумерованные кнопки должны быть последовательно нажаты в кратчайшие сроки.

Краткое описание: https://edube.org/learn/pcpp1-4-gui-programming/lab-the-clicker

Задача

  • В своем классе game_grid я создал переменную экземпляра; 'self.holder', словарь из 25 записей в форме {Key: TkinterButtonObject}

  • При вызове этой переменной экземпляра для использования в методе класса я получаю следующую ошибку:

AttributeError: 'game_grid' object has no attribute 'holder'

  • У меня есть оператор печати в классе init , который подтверждает, что этот атрибут был успешно создан. Я удостоверился, что все интервалы и вкладки в порядке, и перепробовал все места для этой переменной, включая использование в качестве переменной класса и глобальной переменной безрезультатно - так как это полусложный объект. Я не понимаю, какое это должно иметь значение, но любые идеи будут высоко оценены. Я также знаю, что это может быть сделано без занятий, но я пытаюсь принять DRY принципы и ортогональность во всех моих программах.

Заранее спасибо.

Полный код:

import tkinter as tk
from tkinter import*
import random
from tkinter import messagebox
import time

win   = tk.Tk()

class game_grid:

    def __init__(self, win):
        self.last_number = 0
        self.number_buttons = {}
        self.row_count = 0
        self.column_count = 0
        #Generate a list of 25 random numbers
        self.number_list = random.sample(range(0, 999), 25)
        #Puts the numbers in a dictionary (number : buttonobject)
        self.holder = {i: tk.Button(win, text = str(i), command = game_grid.select_button(self, i)) for i in self.number_list}
        #pack each object into window by iterating rows and columns
        for key in self.holder:
            self.holder[key].grid(column = self.column_count, row = self.row_count)
            if self.column_count < 4:
                self.column_count += 1
            elif self.column_count == 4:
                self.column_count = 0
                self.row_count += 1
        print(self.holder)


    def select_button(self, number):
        if number > self.last_number:
            self.holder[number].config(state=tk.DISABLED)
            self.last_number = number
        else:
            pass


class stopclock():

    def __init__(self):
        #Stopclock variable initialisation
        self.time_begin  = 0
        self.time_end    = 0
        self.time_elapsed= 0

    def start(self):
        if self.time_begin == 0:
            self.time_begin = time.time()
            return("Timer started\nStart time: ", self.time_begin)
        else:
            return("Timer already active")

    def stop(self):
        self.time_end = time.time()
        self.time_elapsed = time_end - time_begin
        return("Timer finished\nEnd time: ", time_begin,"\nTime Elapsed: ", time_elapsed)       

play1 = game_grid(win)

win.mainloop()

Ответы [ 2 ]

0 голосов
/ 08 марта 2020

Вы называете select_button изнутри диктовкой holder. select_button затем пытается использовать holder, но он еще не определен. Вы на самом деле не хотите вызывать select_button, но назначаете функцию кнопке, например:

self.holder = {i: tk.Button(window, text=str(i), command=lambda i=i: self.select_button(i)) for i in self.number_list}
0 голосов
/ 08 марта 2020

Возможно, вы имели в виду:

command = self.select_button(self, i)

Обновление:

Хотя из исследования: Как передать аргументы команде Button в Tkinter?

Должно быть:

command = lambda i=i: self.select_button(i)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...