你需要配置行/列为 weight
,这样当你调整窗口大小时它们才能够自动扩展。此外,你还需要将小部件设为其单元格边缘的 sticky
。不仅 frame
的行/列需要设置 weight
,而且 frame
中的所有行和列都需要设置 weight
,因此需要使用 for
循环。
from Tkinter import *
class MyFrame(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid(row=0, column=0, sticky=N+S+E+W)
Grid.rowconfigure(master, 0, weight=1)
Grid.columnconfigure(master, 0, weight=1)
self.create_widgets()
def create_widgets(self):
for rows in xrange(3):
Grid.rowconfigure(self, rows, weight=1)
for columns in xrange(1):
Grid.columnconfigure(self, columns, weight=1)
self.label = Label(self, text="This is a test")
self.label.grid(row=0, column=0, sticky=N+S+E+W)
self.mytext1 = Text(self, width=30, height=5)
self.mytext1.grid(row=1, column=0, sticky=N+S+E+W)
self.mytext2 = Text(self, width=30, height=5)
self.mytext2.grid(row=2, column=0, sticky=N+S+E+W)
root = Tk()
app = MyFrame(root)
root.mainloop()
您的基本
框架
长这样:
from Tkinter import *
class MyApplication(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.create_widgets()
def create_widgets(self):
label = Label(self, text='Hello World!')
label.grid()
button = Button(self, text='Press Me!', command=self.hello)
button.grid()
def hello(self):
print "Hello World!"
root = Tk()
app = MyApplication(root)
root.mainloop()
任何Tkinter小部件都可以像这样处理,允许使用模板(我有一个程序,需要多个具有相同行为的输入框(单击清除默认文本,单击关闭如果没有输入则返回它),而不是将绑定添加到每个输入框中,我能够创建一个表现相同的输入框类),并且易于实现toplevels(附加窗口)。以下是一个更复杂程序的示例:
class IntroScreen(Frame):
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.title('Intro Screen')
self.create_widgets()
self.focus_force()
def create_widgets(self):
label = Label(self, text='Hello World!')
label.grid()
button = Button(self, text='Open Window', command=self.newWindow)
button.grid()
def newWindow(self):
self.toplevel = InfoWindow()
class InfoWindow(Toplevel):
def __init__(self):
Toplevel.__init__(self)
self.grid()
self.create_widgets()
self.focus_force()
def create_widgets(self):
label = Label(self, text='This is a window!')
label.grid()
root = Tk()
app = IntroScreen(root)
root.mainloop()
正如您所看到的,这种功能的实现如果没有类会更加困难。如果您打算深入了解Tkinter强大的功能,请在stackoverflow上寻找更多答案(我推荐Bryan Oakley的众多且丰富的回答),并在网上进行一些研究!
PS:这里是一个很好的起点:在tkinter中在两个框架之间切换