Не могу изменять и настраивать переменные экземпляра из моего метода инициализации, но все еще в том же классе. Питон ТкPython

Программы на Python
Anonymous
Не могу изменять и настраивать переменные экземпляра из моего метода инициализации, но все еще в том же классе. Питон Тк

Сообщение Anonymous »

Я пишу быструю программу для классного проекта. Я новичок в tkinter, и на большинство проблем мне удалось найти ответы. Однако теперь я застрял. Я хочу отключить кнопки на своем виджете, когда появляется новое окно, а затем снова активировать их, когда окна закрываются. Довольно простая концепция, и, судя по тому, что я прочитал, ее будет легко реализовать. Однако я все еще изучаю структуры классов и борюсь с идеей объектно-ориентированного программирования. Я настроил свои кнопки в методе init для класса в главном окне.
Затем я определил метод команды кнопки внутри того же класса. Все работает отлично, но когда я пытаюсь отключить кнопки из метода конфигурации, определенного в том же классе, этот метод не распознает созданные мной переменные кнопок. У меня такое ощущение, что это потому, что они являются всего лишь переменными экземпляра и не имеют памяти вне экземпляра. Поэтому мне нужно знать, как инициализировать кнопки, а затем получить к ним доступ. Кратко посмотрите на мой код и на то, как в настоящее время настраиваются переменные, чтобы принудительно выполнять над ними действие.
Я пытался переместить их в переменная класса, но это не настраивает кнопки. Я также пробовал менять или удалять префиксы (не ожидал, что это сработает, и это не сработало). Я попробовал все, что нашел в Интернете, но застрял. (Я закомментировал параметры отключения, пока не заработаю) полный код доступен на github https://github.com/mgentile77/DnD5e.git

Код: Выделить всё

class Horde_Maker:
#Main Window class all other windows come from here
def __init__(self,root):
#Initializes the main window and starts program
self.app = root
#This sections creates window size and location on pop up
width = 300
height = 200
screen_wid = root.winfo_screenwidth()
screen_hei = root.winfo_screenheight()
x = (screen_wid/2) - (width/2)
y = (screen_hei/2) - (height/2)
self.app.title("Horde Maker")
self.app.geometry("%dx%d+%d+%d" % (width, height, x, y))
self.app.protocol("WM_DELETE_WINDOW", self.disable_Xclose)
#Begins layout of window widgets
self.set_up()

def set_up(self):
#sets up window widgets for this class
self.frame_header = ttk.Frame()#Frame for image
self.frame_header.pack()

self.frame_start = ttk.Frame()#Frame for start welcome and instructions
self.frame_start.pack()
ttk.Label(self.frame_start, text = "Welcome To The").pack()
ttk.Label(self.frame_start, text = "HORDE MAKER").pack()
ttk.Label(self.frame_start, text = "Choose Your Path").pack()

self.frame_buttons = ttk.Frame()#Frame for buttons and pops buttons
self.frame_buttons.pack()
but_horde = ttk.Button(self.frame_buttons, text = "Horde Maker", command = self.hordebutton)
but_horde.grid(row = 0, column = 0)

but_char = ttk.Button(self.frame_buttons, text = "Character Builder", command = self.characterbutton)
but_char.grid(row = 0, column = 1)
ttk.Button(self.frame_buttons, text = 'Exit', command = lambda : exit()).grid(row = 1, column = 0, columnspan = 2)

#Begins Class methods used in functions of of buttons
def hordebutton(self):#opens Horde window
self.hord_button = Horde()
# self.disable_but()

def characterbutton(self):#opens Character Window
self.char_button = Character()
# self.disable_but()

#Creates parent class instructions for other windows
def clear_frame(self,frame):#Destroys child window on exit
for widgets in frame.winfo_children():
widgets.destroy()

def disable_Xclose(self):#prevents closing the window by using corner X
pass

# @staticmethod
# def disable_but():
#     but_horde.config(state = DISABLED)
#     but_char.config(state = DISABLED)

# @staticmethod
# def enable_but():
#     but_horde.config(state = NORMAL)
#     but_char.config(state = NORMAL)
Изменить:
Спасибо всем за помощь. Это помогло мне обнаружить причину моей ошибки. Именно так я организовал свои занятия и попытался создать новую иерархическую цепочку. Я попытался создать свой собственный родительский класс и открыть новые окна из их собственного дочернего класса. Это означает, что я передавал объекты своим объектам, которые вызывали другие объекты для выполнения работы, и возвращал результаты моему объекту, чтобы вернуть результат другому из моих объектов. Я должен был понять, что мои классы являются дочерними классами родительского класса tk, и новые инструкции инициализации необходимо передать родительским классам tk. Как только я реорганизовал свои классы в соответствии с этой иерархией, все заработало идеально, и я получил ту функциональность, которую хотел для своей программы. Мне еще предстоит многому научиться, но я уверен, что начинаю понимать. Пожалуйста, дайте мне знать, что вы думаете об этом объяснении.

Подробнее здесь: https://stackoverflow.com/questions/762 ... t-method-b

Вернуться в «Python»