Python 如何在Tkinter中使用grid()创建简单向导?
原谅我。我是Tkinter的新手,对python只有简单/适度的了解。我的总体目标是制作一个类似向导的程序,在这个程序中,用户输入的细节随着程序的进行而不断增加(某些帧的出现取决于某些输入)。我只是想让核心向导的想法发挥作用,但遇到了一些问题。这是我的代码(我已经注释掉了其他来源暗示的事情,它们在正确的轨道上,但对我来说失败了):Python 如何在Tkinter中使用grid()创建简单向导?,python,python-2.7,tkinter,wizard,Python,Python 2.7,Tkinter,Wizard,原谅我。我是Tkinter的新手,对python只有简单/适度的了解。我的总体目标是制作一个类似向导的程序,在这个程序中,用户输入的细节随着程序的进行而不断增加(某些帧的出现取决于某些输入)。我只是想让核心向导的想法发挥作用,但遇到了一些问题。这是我的代码(我已经注释掉了其他来源暗示的事情,它们在正确的轨道上,但对我来说失败了): 从Tkinter导入* root=Tk() #root.minsize(300300)? #根几何(“300x300”)? def next(): 移动(+1) de
从Tkinter导入*
root=Tk()
#root.minsize(300300)?
#根几何(“300x300”)?
def next():
移动(+1)
def prev():
移动(-1)
def exit_程序():
root.destroy()
page1=框架(根,宽度=300,高度=300)
第1页网格()
#第1页网格(行=0,列=0,sticky=“nsew”)?
#第1页网格配置(0,权重=1)?
#第1页网格配置(0,权重=1)?
p1_label=label(第1页,text='这是向导的第1页。')。网格(列=1,行=0)
p1\u退出=按钮(第1页,text=“退出”,命令=退出程序)。网格(列=1,行=2)
p1_next=按钮(第1页,text=“next”,command=next)。网格(列=2,行=2)
page2=帧(根)
p2_label=label(第2页,text='这是向导的第2页。')。网格(列=1,行=0)
p2_prev=按钮(第2页,text=“prev”,command=prev).grid(列=1,行=2)
p2_next=按钮(第2页,text=“next”,command=next).网格(列=2,行=2)
第3页=帧(根)
p3_label=label(第3页,text='这是向导的第3页。')。网格(列=1,行=0)
p3_prev=按钮(第3页,text=“prev”,command=prev).grid(列=1,行=2)
p3_退出=按钮(第3页,text=“退出”,命令=退出程序)。网格(列=2,行=2)
pages=[page1,page2,page3]
当前=第1页
def移动(dirn):
全球电流
idx=页面索引(当前)+dirn
如果不是0
为什么第一个(和所有)帧会缩小到小部件的大小
在里面,尽管我已经将宽度和高度设置为一定的高度
数量难道我不能说出框架的尺寸吗,
网格将自身与这些尺寸对齐
这就是tkinter的设计原理:容器收缩以适应其内容物。99%的情况下,这是正确的解决方案。正如您所观察到的,您可以关闭几何体传播,但这会产生副作用,并且需要您执行tkinter通常能更好地处理的工作。如果您确实坚持将帧设置为特定大小,则通常会关闭传播
如果是特定情况,则强制主窗口为特定大小比强制框架为特定大小更有意义。然后,框架将增长(或收缩)以适应主窗口。可以使用根窗口的geometry
方法执行此操作
为什么网格看起来是2x2?不应该是3x3吗,因为
第0个条目有效吗?我已将一个按钮(p1_next)放置到位
(2x2)。是否因为0列中没有任何内容,grid()将删除它并
把所有的东西都移到左边
如果列中没有任何内容,则该列的默认宽度为零(除非它是统一组的一部分,或具有最小值等)。行也是如此——默认情况下,空行的高度为零
这是我想要实现的最好的方法吗
这很难回答。可能没有“最好”的方法
您可能想看一个相关的问题,它显示了一种在一组帧之间切换的方法,方法是将它们堆叠起来,然后将当前帧提升到堆栈的顶部
from Tkinter import *
root = Tk()
#root.minsize(300,300) ?
#root.geometry("300x300") ?
def next():
move(+1)
def prev():
move(-1)
def exit_program():
root.destroy()
page1 = Frame(root, width=300, height=300)
page1.grid()
#page1.grid(row=0,column=0, sticky="nsew") ?
#page1.grid_rowconfigure(0, weight=1) ?
#page1.grid_columnconfigure(0, weight=1) ?
p1_label = Label(page1, text='This is page 1 of the wizard.').grid(column=1, row=0)
p1_quit = Button(page1, text="Quit", command=exit_program).grid(column=1, row=2)
p1_next = Button(page1, text="Next", command=next).grid(column=2, row=2)
page2 = Frame(root)
p2_label = Label(page2, text='This is page 2 of the wizard.').grid(column=1, row=0)
p2_prev = Button(page2, text="Prev", command=prev).grid(column=1, row=2)
p2_next = Button(page2, text="Next", command=next).grid(column=2, row=2)
page3 = Frame(root)
p3_label = Label(page3, text='This is page 3 of the wizard.').grid(column=1, row=0)
p3_prev = Button(page3, text="Prev", command=prev).grid(column=1, row=2)
p3_quit = Button(page3, text="Quit", command=exit_program).grid(column=2, row=2)
pages = [page1, page2, page3]
current = page1
def move(dirn):
global current
idx = pages.index(current) + dirn
if not 0 <= idx < len(pages):
return
current.grid_forget()
current = pages[idx]
current.grid()
root.mainloop()