Tkinter的。 root的子帧不显示

时间:2014-09-19 16:28:56

标签: python tkinter

这是我的代码:

import tkinter as tk
import sys

class MapCreator:
    def __init__(self, root):
        #initialize the root window
        self.root = root
        self.root.geometry('800x600+0+0')
        self.root.resizable(width = False, height = False)
        self.menubar = None
        self.mapFrame = tk.Frame(self.root,bd = 2,bg = 'white')
        self.mapFrame.grid(column = 3, row = 3)
        #self.mapFrame.pack()
        self.__create_menubar()
    def __create_menubar(self):
        #Create the menubar
        self.menubar = tk.Menu()
        #config , which used to change the options
        self.root.configure(menu = self.menubar)

        #create a File menu and add it to the menubar
        #add a new menu
        file_menu = tk.Menu(self.menubar, tearoff=False)
        #File cascade
        self.menubar.add_cascade(label="File", menu=file_menu)
        #New
        file_menu.add_command(label="New", command=self.__create_new_map)
        #Open
        file_menu.add_command(label="Open", command=self.__open_new_map)
        #Svae
        file_menu.add_command(label="Save", command=self.__save_cur_map)
        #Save as
        file_menu.add_command(label="Save as", command=self.__saveas_cur_map)

    def __create_new_map(self):
        #if not saved , tell the editor
        pass

    def __open_new_map(self):
        #if not saved , tell the editor
        pass

    def __save_cur_map(self):
        #first time save or not
        pass

    def __saveas_cur_map(self):
        pass


    pass
if __name__ == "__main__":
    root = tk.Tk()
    app = MapCreator(root)
    root.mainloop()

我想要一个子框架来展示其他东西。但是我找不到我的子框架。

顺便说一下,我不熟悉grid()方法。

那么有人能告诉我为什么我不能进行子帧显示吗?

2 个答案:

答案 0 :(得分:0)

您的框架 正在显示。但是,因为它没有任何东西,它的自然尺寸只有一个像素宽,一个像素高,使它几乎看不见。

在画面中放置一些东西,或者给它一个明确的宽度和高度。

您的另一个选择是配置网格,以便框架"坚持"它所在的单元格的两侧,单元格扩展以填充窗口中的任何额外空间。

例如:

self.mapFrame.grid(column = 3, row = 3, sticky="nsew")
root.grid_rowconfigure(3, weight=1)
root.grid_columnconfigure(3, weight=1)

答案 1 :(得分:0)

tkinter中,大多数小部件和框架在未指定时采用默认大小。您可以明确指定大小(给它一个高度和宽度),也可以将框架或小部件拉伸到尺寸。

以下是tkinters网格和大小的简要介绍。这是我喜欢的,而不是指定高度和重量。

想象一下,您正在将父框架(或任何类型的容器)拆分为网格。子项的grid属性允许您将子项定位到Parent的网格的特定部分。例如,您希望您的孩子在父母的(0,0)。然后你说。 child.grid(row=0, column = 0)

注意:您没有指定网格的宽度和高度。它将自身重新调整为子窗口小部件的默认大小。按钮具有特定大小。如果孩子是另一个框架并且该框架是空的。它不可见,因为尺寸为1px宽和1px高度。

rowspan,columnspan允许您调整子窗口小部件占用的行数或列数。这与在Excel表中合并单元格的概念类似。因此,当您说child.grid(row=0, column = 0, rowspan=2, columnspan=2)时,您指定窗口小部件放在(0,0)中并占用2行2列。

既然你拥有它,你如何让它伸展?这是使用stickys和weight来完成的。对于子窗口小部件,您可以指定粘性。通过这个,您可以定义要拉伸的方向。 child.grid(row=0, column = 0, sticky='ew')指定窗口小部件可以水平拉伸。 child.grid(row=0, column = 0, sticky 'nsew')指定完全伸展。指定粘性不会拉伸窗口小部件,它只是指示可以伸展的方向。您可以指定父网格的列和行的权重,以指定不同的拉伸级别。 parent.grid_columnconfigure(0, weight=1)将权重1添加到第0列。因此第0列被拉伸。如果要拉伸多列,则权重指定这些不同列之间的增加比率。 parent.grid_rowconfigure(0, weight=1)对行执行相同的操作。

鉴于所有背景。如果将grid_rowconfigure和grid_columnconfigure添加到根并将sticky添加到mapFrame。你明白了:

def __init__(self, root):
    #initialize the root window
    self.root = root
    self.root.geometry('800x600+0+0')
    self.root.resizable(width = False, height = False)
    self.menubar = None
    self.mapFrame = tk.Frame(self.root,bd = 2,bg = 'white')
    self.mapFrame.grid(row = 0, sticky='nsew')
    self.root.grid_columnconfigure(0, weight=1)
    self.root.grid_rowconfigure(0, weight=1)
    #self.mapFrame.pack()
    self.__create_menubar()

这应该有效:)

您可以在child.grid()声明中指定许多其他属性。我通常使用的另一个是padx pady,它在x,y方向填充,ipadx ipady是内部填充。有关详细信息,请参阅http://effbot.org/tkinterbook/grid.htm