#python #oop #tkinter
#python #ооп #tkinter
Вопрос:
Я пытаюсь узнать о tkinter с точки зрения ООП, чтобы я мог создавать несколько окон.
Я создал два файла (main.py и Humanclass.py ).
Почему оба окна не создаются? Я думал, что создал класс, а в основной программе создал 2 экземпляра этого класса с разными данными?
Main.py:
import humanclass
from tkinter import *
window = Tk()
human1 = humanclass.Human(window, "Jim", "78", "British")
human2 = humanclass.Human(window, "Bob", "18", "Welsh")
window.mainloop()
humanclass.py:
from tkinter import *
class Human():
def __init__(self, window, name, age, nation):
self.window=window
self.window.geometry("500x200 100 200")
self.window.title(name)
self.label1 = Label(self.window, text=age).grid(row=0, column=0, sticky=W)
self.label2 = Label(self.window, text=nation).grid(row=1, column=0, sticky=W)
self.button = Button(self.window, text="Close", width=5, command=self.clicked).grid(row=3, column=0, sticky=W)
def clicked(self):
self.window.destroy()
Любая помощь, чтобы показать мне ошибки в моем ограниченном понимании, будет с благодарностью принята.
Ответ №1:
Это потому, что window — это только одно активное окно, то есть корневое окно. Если вы хотите создать несколько окон, вам нужно будет создать их из этого корневого окна. Простое присвоение объектов этому окну перезаписало бы все, что было там ранее. Вот почему отображается только ваш нижний экземпляр. Хотя технически вам могло бы сойти с рук внедрение потоков и запуск двух корневых окон с двумя основными циклами, настоятельно рекомендуется этого не делать.
Что вам нужно сделать, так это создать экземпляры верхнего уровня из корневого окна. Думайте о них как о всплывающих окнах, которые являются независимыми. Вы можете сделать их независимыми от корневого окна или привязать их к нему. Таким образом, если вы закроете корневое окно, все его верхние уровни закроются. Я предлагаю вам больше изучить Toplevels, и вы найдете то, что ищете. Вы, вероятно, хотите что-то вроде этого:
Main.py
import humanclass
from Tkinter import *
window = Tk()
# Hides the root window since you will no longer see it
window.withdraw()
human1 = humanclass.Human(window, "Jim", "78", "British")
human2 = humanclass.Human(window, "Bob", "18", "Welsh")
window.mainloop()
humanclass.py
from Tkinter import *
class Human():
def __init__(self, window, name, age, nation):
# Creates a toplevel instance instead of using the root window
self.window=Toplevel(window)
self.window.geometry("500x200 100 200")
self.window.title(name)
self.label1 = Label(self.window, text=age).grid(row=0, column=0, sticky=W)
self.label2 = Label(self.window, text=nation).grid(row=1, column=0, sticky=W)
self.button = Button(self.window, text="Close", width=5, command=self.clicked).grid(row=3, column=0, sticky=W)
def clicked(self):
self.window.destroy()