为什么我的tkinter窗口对象(OOP tkinter)不显示?

时间:2014-06-16 15:54:18

标签: python oop tkinter

我试图从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()

任何帮助向我展示我有限理解中的错误都会感激不尽。

1 个答案:

答案 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()