Я пытаюсь написать функции, которые могут ссылаться на объекты tkinter из классов, отличных от того, в котором он написан. Мой код class Base
взят из учебника tkinter из "Sentdex" на Youtube, и приведенные ниже страницы - простая итерацияего техники.
Я хотел бы иметь возможность перенастроить ButtonOne
на PageOne
с DISABLED
на NORMAL
после нажатия кнопки на другой странице, но не могу найти какой-либо метод работы в Интернете.
import tkinter as tk
from tkinter import *
class Base(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
container = tk.Frame(self)
container.pack(side="top", fill="both", expand=True)
container.grid_rowconfigure(0, weight=1)
container.grid_columnconfigure(0, weight=1)
self.frames = {}
for F in (PageOne, PageTwo, PageThree):
frame = F(container, self)
self.frames[F] = frame
frame.grid(row=0, column=0, sticky="nsew")
self.show_frame(PageOne)
def show_frame(self, cont):
frame = self.frames[cont]
frame.tkraise()
class PageOne(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.config(height=500, width=1500, bg="Red")
self.Button1 = tk.Button(self, text="Button 1", state=DISABLED)
self.Button1.pack()
class PageTwo(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
self.config(height=500, width=1500, bg="Blue")
self.Button2 = tk.Button(self, text="Button 2", state=NORMAL)
self.Button2.pack()
class PageThree(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
menu = tk.Menu(self)
controller.config(menu=menu)
self.config(height=500, width=1500, bg="Green")
menu = tk.Menu(self)
controller.config(menu=menu)
subMenu = tk.Menu(self)
menu.add_cascade(label="Pages", menu=subMenu)
subMenu.add_command(label="Page One", command=lambda: controller.show_frame(PageOne))
subMenu.add_command(label="Page Two", command=lambda: controller.show_frame(PageTwo))
subMenu.add_command(label="Page Three", command=lambda: controller.show_frame(PageThree))
self.Button3 = tk.Button(self, text="Button 3", state=NORMAL)
self.Button3.pack()
program = Base()
program.mainloop()
Когда я пытаюсь что-то вроде
self.Button3 = tk.Button(self, text="Button 3", state=NORMAL, command=self.enableOne)
self.Button3.pack()
def enableOne(self):
Base.PageOne.Button1.config(state=NORMAL)
Я получаю сообщение об ошибке:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\tkinter\__init__.py", line 1699, in __call__
return self.func(*args)
File "C:/Users/R21660/PycharmProjects/Step1/ExampleforStack.py", line 53, in enableOne
Base.PageOne.Button1.config(state=NORMAL)
AttributeError: type object 'Base' has no attribute 'PageOne'
Спасибо.
ОБНОВЛЕНИЕ: self.Button3 = tk.Button(self, text="Button 3", state=NORMAL, command=lambda: PageOne.Button1.config(state=NORMAL))
тоже не работает, потому что "PageOne" не имеет атрибута "Button1."
Однако command=lambda: PageOne.enableOne)
ничего не делает, но не выдает сообщение об ошибке.