在tkinter中创建框架

时间:2016-01-15 18:19:21

标签: python python-3.x tkinter

在下面的代码中,我创建了一个窗口和一个框架。

代码1:

import tkinter as tk


class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent)
        self.parent = parent

        button = tk.Button(parent, text="a button")
        button.pack()


root = tk.Tk()
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()

代码2:

import tkinter as tk


class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent)
        self.parent = parent

        button = tk.Button(self, text="a button")
        button.pack()


root = tk.Tk()
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()

然后我以两种方式创建一个按钮(Button(self)Button(parent))。问题是:在这两种情况下,按钮是否都放在我创建的框架中(就像:tk.Frame.__init__(self, parent)),它们旁边都是,或者旁边有一个按钮,里面有一个按钮? 如果两者都在其中创建,那么如果内部没有任何内容,那么tk.Frame.__init__(self, parent)的重点是什么?

2 个答案:

答案 0 :(得分:6)

窗口小部件(当然)在其父窗口中打包,否则指定窗口小部件的父窗口没有多大意义(除非有其他特殊原因)。因此,在第一种情况下,按钮打包在根(框架的父级)中,在第二种情况下,按钮打包在框架内。

为了更好地了解正在发生的事情,最好的解决方案是设置框架和根的背景颜色。请参阅以下示例:

代码1:

import tkinter as tk


class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent, bg="blue")
        self.parent = parent

        button = tk.Button(parent, text="a button")
        button.pack()


root = tk.Tk()
root.geometry("200x200+300+300")
root.config(background="yellow")
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()

结果1

enter image description here

代码2:

import tkinter as tk


class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent, bg="blue")
        self.parent = parent

        button = tk.Button(self, text="a button")
        button.pack()


root = tk.Tk()
root.geometry("200x200+300+300")
root.config(background="yellow")
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()

结果2

enter image description here

另请注意,在您使用某些小部件填充框架之前,框架没有大小。另请注意,您正在扩展框架(或MainApp)并使其填补困扰的垂直和水平方向,因此蓝色占据了最后一种情况下的所有窗口。

答案 1 :(得分:4)

  

在下面的代码中,我创建了一个窗口和一个框架。

这是一个不正确的陈述。您正在创建一个继承自tk.Frame的窗口。在课堂上,self表示该框架。在课外,该框架为app

  

然后我以两种方式创建一个按钮(Button(self)和Button(parent))。问题是:在两种情况下,按钮是否都放在我创建的框架中(如:tk.Frame。 init (self,parent)),它们旁边或者一个在它旁边,里面有一个?

执行Button(self)时,按钮是框架的子项,因此将显示在框架内。

执行Button(parent)时,按钮是父项的子项(在本例中为根窗口),因此将显示在框架外部。

您可以通过赋予框架独特的颜色来轻松看到这一点。

import tkinter as tk

class MainApp(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent, background="pink")
        self.parent = parent

        button = tk.Button(parent, text="a button")
        button.pack()


root = tk.Tk()
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()