在下面的代码中,我在其中创建了一个窗口和一个框架。
代码 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)并使其填充垂直和水平方向,因此在最后一种情况下蓝色占据了所有窗口。
