Как можно получить доступ к внутреннему классу извне всех классов?

У меня есть класс (MainApplication), который охватывает все остальные классы, и оператор if, находящийся за пределами внешнего класса. Я изо всех сил пытаюсь понять, как получить доступ к «Пуску» из этого оператора if, чтобы программа запустилась.

import tkinter as tk

class MainApplication(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        class charName (object):
            def __init__ (self, master):
                Top = self.Top = tk.Toplevel(master)
                self.l= tk.Label(Top, text = "Test")
                self.l.pack()
                self.e = tk.Entry(Top)
                self.e.pack()
                self.b = tk.Button(Top, text = "Next", command=self.Cleanup,)
                self.b.pack()
                Top.mainloop
            
            def Cleanup (self):
                self.value = self.e.get()
                self.command = print("Works!")
                self.Top.destroy




        class Start (object):
            def __init__(self, master):
                self.master=master
                self.b = tk.Button(root, 
                            text = "Get Started!", 
                            command=self.popup,)
                
                self.b.pack()
                
                    
            def popup (self):
                self.w = charName(self.master)
                self.b["state"] = "disabled" 
                self.master(self.w.Top)
                self.b["state"] = "normal"
                
                
if __name__ == "__main__":
    root=tk.Tk()
    m=Start(root)
    root.mainloop()

Я попытался избавиться от MainApplication, и оно отлично работает. Кроме этого, я не уверен, что еще я могу сделать. Я читал в другом посте, что код MainApplication будет работать для организации объектов (я не совсем уверен, что делаю), но я пытался заставить эту часть кода открывать экран, который позволил бы вам ввести имя персонажа. , затем (в другом коде) выберите расу, класс и другие необходимые параметры для создания персонажа DnD, а также код для организации расположения кнопок.

Также извините, что этот пост такой длинный. Я новичок в Python (и в этом) и не совсем уверен, что знаю, что делаю, что нужно, а что нет. Спасибо за ваше терпение.

import tkinter as tk


class charName (object):
    def __init__ (self, master):
        Top = self.Top = tk.Toplevel(master)
        self.l= tk.Label(Top, text = "Test")
        self.l.pack()
        self.e = tk.Entry(Top)
        self.e.pack()
        self.b = tk.Button(Top, text = "Next", command=self.Cleanup,)
        self.b.pack()
        Top.mainloop
    
    def Cleanup (self):
        self.value = self.e.get()
        self.command = print("Works!")
        self.Top.destroy




class Start (object):
    def __init__(self, master):
        self.master=master
        self.b = tk.Button(root, 
                    text = "Get Started!", 
                    command=self.popup,)
        
        self.b.pack()
        
            
    def popup (self):
        self.w = charName(self.master)
        self.b["state"] = "disabled" 
        self.master(self.w.Top)
        self.b["state"] = "normal"
                
                
if __name__ == "__main__":
    root=tk.Tk()
    m=Start(root)
    root.mainloop()

Зачем ты прячешь там классы?

no comment 01.08.2024 03:52

Честно говоря, я не совсем понимаю, что делаю, мне кажется, я спрятал там классы, чтобы потом можно было использовать MainApplication для организации окон.

Goose 01.08.2024 04:36

Вам это не нужно Top.mainloop. У вас уже есть root.aminloop().

toyota Supra 01.08.2024 11:46

Без круглых скобок он все равно ничего не делает. То же самое и с self.Top.destroy.

CrazyChucky 01.08.2024 14:17

Python позволяет определять классы и функции внутри других классов, функций и методов. Но в 90% случаев этого делать не следует. Если вы не знаете, что делаете, и не знаете, что у вас есть веская причина избегать этого, определите все свои классы (и свободные функции, если таковые имеются) на верхнем уровне вашего кода.

CrazyChucky 01.08.2024 14:19

Спасибо за совет, я немного изменю свой код :D

Goose 01.08.2024 17:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
99
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы хотите вызвать конструктор внутреннего класса, вам нужно сначала создать экземпляр внешнего класса:

class Outer():
    def __init__(self):
        # Do some things
    class Inner():
        def __init__(self, num):
            print(num)
            
outer = Outer()
outer.Inner(1) # prints 1

Нет необходимости создавать экземпляр Outer для вашего случая, Outer.Inner(1) тоже подойдет. Обратите внимание, что код OP определяет эти классы внутри __init__(), и на самом деле они не являются внутренним классом. Это просто классы, определенные локально внутри __init__(), и к ним нельзя получить доступ вне функции.

acw1668 01.08.2024 04:20

Хороший вопрос, я не уловил, что внутренние классы были внутри __innit__()

Dima 01.08.2024 04:41
Ответ принят как подходящий

Спасибо за помощь, ребята! CrazyChucky помог мне в этом. Удалил класс MainApplication и сделал каждый класс отдельным от другого, но спасибо за помощь!

Другие вопросы по теме