在tkinter中创建框架

问题描述 投票:1回答:2

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

代码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)有什么意义呢?

python python-3.x tkinter
2个回答
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)并使其填充打扰垂直和水平方向,因此蓝色占据了最后一种情况下的所有窗口。


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()
© www.soinside.com 2019 - 2024. All rights reserved.