У меня есть класс (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()
Честно говоря, я не совсем понимаю, что делаю, мне кажется, я спрятал там классы, чтобы потом можно было использовать MainApplication для организации окон.
Вам это не нужно Top.mainloop
. У вас уже есть root.aminloop()
.
Без круглых скобок он все равно ничего не делает. То же самое и с self.Top.destroy
.
Python позволяет определять классы и функции внутри других классов, функций и методов. Но в 90% случаев этого делать не следует. Если вы не знаете, что делаете, и не знаете, что у вас есть веская причина избегать этого, определите все свои классы (и свободные функции, если таковые имеются) на верхнем уровне вашего кода.
Спасибо за совет, я немного изменю свой код :D
Если вы хотите вызвать конструктор внутреннего класса, вам нужно сначала создать экземпляр внешнего класса:
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__()
, и к ним нельзя получить доступ вне функции.
Хороший вопрос, я не уловил, что внутренние классы были внутри __innit__()
Спасибо за помощь, ребята! CrazyChucky помог мне в этом. Удалил класс MainApplication и сделал каждый класс отдельным от другого, но спасибо за помощь!
Зачем ты прячешь там классы?