我正在使用Tkinter的'grid()'方法为我的python程序设计GUI。
有没有办法让小部件随主窗口缩放?
这是一个简短的例子:
from Tkinter import *
master = Tk()
Label(master, text="This is a test").grid(row=0, column=0)
mytext1 = Text(master, width=30, height=5)
mytext1.grid(row=1, column=0)
mytext2 = Text(master, width=30, height=5)
mytext2.grid(row=3, column=0)
master.mainloop()
我想要做的是在更改主窗口的大小时让小部件调整其大小。 (对于如此小的GUI,它没有问题,但是当有很多小部件时,这是可取的。)
非常感谢任何帮助!
答案 0 :(得分:3)
您可能希望将行/列配置为weight
,以便在调整窗口大小时可以展开。此外,您希望小部件按sticky
到其单元格的两侧。 frame
行/列不仅需要weight
,frame
中的所有行和列也是如此,因此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)
#Give the grid, column of the frame weight...
Grid.rowconfigure(master, 0, weight=1)
Grid.columnconfigure(master, 0, weight=1)
self.create_widgets()
def create_widgets(self):
#Give the grid, column of each widget weight...
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()
您的基本frame
如下所示:
from Tkinter import *
#Sets up a frame
class MyApplication(Frame):
#When a class is initialized, this is called as per any class
def __init__(self, master):
#Similar to saying MyFrame = Frame(master)
Frame.__init__(self, master)
#Puts the frame on a grid. If you had two frames on one window, you would do the row, column keywords (or not...)
self.grid()
#Function to put the widgets on the frame. Can have any name!
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()
#Like the frame, or any widget, this inherited from the parent widget
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()
正如您所看到的,这增加了没有类的功能。在stackoverflow上寻找更多答案(我推荐Bryan Oakley的众多和信息丰富的答案)并在线进行一些研究,如果你打算进一步深入了解Tkinter的强大功能!
PS:这是一个很好的起点:Switch between two frames in tkinter
答案 1 :(得分:1)
以下与不使用类相同。随着程序规模的增加,使用类更清晰,更有意义。请注意,我将标签的权重设置为0,这可以防止它扩展。您不必这样做,因为它是默认选项。这只是为了让您了解自己可以做些什么。
有关网格布局管理器的更多详细信息:http://www.tkdocs.com/tutorial/grid.html
from Tkinter import *
master = Tk()
Label(master, text="This is a test").grid(row=0, column=0)
mytext1 = Text(master, width=30,height=5)
mytext1.grid(row=1, column=0, sticky="nsew")
mytext2 = Text(master, width=30,height=5)
mytext2.grid(row=2, column=0, sticky="nsew")
master.columnconfigure(0, weight=1)
master.rowconfigure(0, weight=0) # not needed, this is the default behavior
master.rowconfigure(1, weight=1)
master.rowconfigure(2, weight=1)
master.mainloop()