这是我的代码:
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()
方法。
那么有人能告诉我为什么我不能进行子帧显示吗?
答案 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