关于tkinter中的帧

时间:2016-01-14 20:31:46

标签: python python-3.x tkinter

我对tkinter很新,我有一个问题: 当我运行以下代码时,是否必须在框架上使用.pack()(在这种情况下为app)? 哦,如果我想添加一个按钮,让我们说,__init__类的MainApptk.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() 

提前致谢!

2 个答案:

答案 0 :(得分:2)

如果您希望窗口小部件可见,则需要调用gridpackplace(或将其嵌入文本或画布窗口小部件中)。除了根窗口之外的所有小部件都是如此,包括框架。实际上是将窗口小部件绘制到其父窗口小部件上的方法之一。

由于MainAppFrame的子类和根窗口的子类,如果您希望它及其子项可见,则您需要调用其中一种方法。

  

...按钮是放在app框架上还是旁边?

我没有看到任何框架"旁边" - 您只在根窗口内创建了一个框架。

Frame继承的全部原因是为其他小部件创建容器。一般来说,您在此类中创建的每个窗口小部件都应该放在该类的框架中。

此外,根据经验,小部件应该调用packplacegrid。创建应用程序的函数(或者在您的情况下,全局范围中的代码)应该负责调用其中一个方法。

此外,您不应该依赖这些命令的默认属性。默认值很少。例如,如果您正在使用pack,则应始终为fillexpand设置值。始终定义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()

正如您所看到的,我通过将框架设置为其父框架然后打包它们来向框架添加几个按钮。由于根是帧的父节点,因此帧本身被隐式打包到根。