我试图从OOP的角度来学习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()
任何帮助向我展示我有限理解中的错误都会感激不尽。
答案 0 :(得分:2)
这是因为窗口只是一个活动窗口,即根窗口。如果要创建多个窗口,则需要从该根窗口生成它们。简单地将事物分配给该窗口将覆盖之前的任何内容。这就是为什么只显示您的底层实例。虽然从技术上讲,你可以通过实现线程并运行两个带有两个主循环的根窗口来逃避,但强烈建议不要这样做。
您应该做的是从根窗口创建Toplevel实例。可以将它们视为独立的弹出窗口。您可以使它们独立于根窗口或将它们锚定到它。这样,如果你关闭根窗口,它的所有Toplevels都会关闭。我建议你更多地了解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()