Доступ к объекту класса из другого класса - PullRequest
0 голосов
/ 11 июня 2018

Я пытаюсь написать функции, которые могут ссылаться на объекты 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) ничего не делает, но не выдает сообщение об ошибке.

1 Ответ

0 голосов
/ 11 июня 2018

Экземпляр PageOne не известен Базовому классу, но известен Базовым экземплярам (внутри списка кадров).

Вместо:

def enableOne(self):
    Base.PageOne.Button1.config(state=NORMAL)

Я бы попробовал:

def enableOne(self):
    self.controller.frames[PageOne].Button1.config(state=NORMAL)

при условии, что вы добавляете self.controller = controller в init из Page3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...