У меня есть проблема, связанная с 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()