Skip to main content
 首页 » 编程设计

python之在框架中使用 Button(self) 创建按钮与使用 Button(parent) 创建按钮有什么区别

2025年05月04日10birdshome

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

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

请您参考如下方法:

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

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

代码 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

代码 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

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