我对tkinter很新,我有一个问题:
当我运行以下代码时,是否必须在框架上使用.pack()
(在这种情况下为app
)?
哦,如果我想添加一个按钮,让我们说,__init__
类的MainApp
,tk.Frame.__init__(self, parent)
之后,按钮会被放置在app
框架上或者在它旁边?
以下是代码:
import tkinter as tk
class MainApp(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
self.parent = parent
root = tk.Tk()
app = MainApp(root)
app.pack()
root.mainloop()
提前致谢!
答案 0 :(得分:2)
如果您希望窗口小部件可见,则需要调用grid
,pack
或place
(或将其嵌入文本或画布窗口小部件中)。除了根窗口之外的所有小部件都是如此,包括框架。实际上是将窗口小部件绘制到其父窗口小部件上的方法之一。
由于MainApp
是Frame
的子类和根窗口的子类,如果您希望它及其子项可见,则您需要调用其中一种方法。
...按钮是放在app框架上还是旁边?
我没有看到任何框架"旁边" - 您只在根窗口内创建了一个框架。
从Frame
继承的全部原因是为其他小部件创建容器。一般来说,您在此类中创建的每个窗口小部件都应该放在该类的框架中。
此外,根据经验,小部件应该不调用pack
,place
或grid
。创建应用程序的函数(或者在您的情况下,全局范围中的代码)应该负责调用其中一个方法。
此外,您不应该依赖这些命令的默认属性。默认值很少。例如,如果您正在使用pack
,则应始终为fill
和expand
设置值。始终定义side
通常也是一种好习惯,但如果它是其父级中唯一的小部件,则可以接受默认值。
root = tk.Tk()
app = MainApp(root)
app.pack(fill="both", expand=True)
root.mainloop()
答案 1 :(得分:0)
我通常会在框架对象或父母应该添加的任何内容中添加按钮。它在代码中更清晰一些:
# Python 2.x example code
import Tkinter as tk
########################################################################
class App:
""""""
#----------------------------------------------------------------------
def __init__(self, parent):
"""Constructor"""
frame = tk.Frame(parent)
frame.pack()
print_btn = tk.Button(frame, text='Print',
command=lambda: self.onPrint('Print'))
print_btn.pack(side=tk.LEFT)
close_btn = tk.Button(frame, text='close', command=frame.quit)
close_btn.pack(side=tk.LEFT)
#----------------------------------------------------------------------
def onPrint(self, num):
print "You just printed something"
#----------------------------------------------------------------------
if __name__ == "__main__":
root = tk.Tk()
app = App(root)
root.mainloop()
正如您所看到的,我通过将框架设置为其父框架然后打包它们来向框架添加几个按钮。由于根是帧的父节点,因此帧本身被隐式打包到根。