如何在Tkinter中使用grid()创建一个简单的向导?

时间:2015-10-09 16:35:47

标签: python python-2.7 tkinter wizard

原谅我。我是Tkinter的新手,只对python有一个简单/谦虚的理解。我的总体目标是制作一个类似向导的程序,用户在程序进行时输入不断增加的细节(根据某些输入显示某些帧)。我正在努力让核心向导的想法正常运行并遇到一些问题。这是我的代码(我已经评论了其他来源暗示在正确的轨道但但对我来说失败的事情):

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()

我有几个问题:

  • 为什么第一个(和所有)帧缩小到内部小部件的大小,即使我已将宽度和高度设置为一定量?我已经在网上看了一下,显然grid_propagate(False)关闭了重新调整尺寸,但它是高度不推荐和直接不成功(是的它使窗口成为我想要的尺寸,但“网格”本身仍然在上面-剩下)。我不应该能够说明框架的尺寸,并且网格与这些尺寸对齐(即网格组织被保留,而不是区域)?此问题是否与向导进程相关联?我也不愿意,但我仍然可以在一个窗口中编写程序。
  • 为什么网格看起来是2x2?不应该是3x3因为第0条是有效的吗?我已将一个按钮(p1_next)放在位置(2x2)。是因为0列中没有任何内容,grid()将其删除并将所有内容移到左侧?
  • 这是我想要完成的最佳方法吗?我担心我只知道OOP的绝对基础知识,并且如果可能的话,我宁愿避免(也许这个程序,虽然对我来说很重要,但最终会因现代软件开发标准而变得微不足道)。

根据我学习东西的经验,我明白这个问题不是一个快速解决的问题,而且我需要一个很大的范式转变才能理解这一点。无论哪种方式,任何帮助将不胜感激

如果这是重复,我很抱歉。谢谢!

1 个答案:

答案 0 :(得分:2)

  

为什么第一个(和所有)帧缩小到小部件的大小   在里面,即使我已经设置了宽度和高度   量? ......我不应该能够说明框架的尺寸,   并且网格与这些维度对齐

这就是tkinter的工作原理:容器缩小以适应其内容。 99%的时间这是正确的解决方案。正如您所观察到的,您可以关闭几何体传播,但这会产生副作用,并且需要您执行通常由tkinter更好地处理的工作。如果您确实坚持使用特定大小的帧,那么关闭传播通常就是这样做的。

如果您的具体情况,强制主窗口为特定大小更有意义,而不是强制帧为特定大小。然后帧将增长(或收缩)以适合主窗口。您可以使用根窗口的geometry方法执行此操作。

  

为什么网格看起来是2x2?不应该是3x3,因为   第0条入境有效吗?我已经放置了一个按钮(p1_next)   (2×2)。是因为0列中没有任何内容,grid()将其删除   把一切都转移到左边?

如果列中没有任何内容,则该列的默认宽度为零(除非它是统一组的一部分,或者具有minsize等)。对于行也是如此 - 默认情况下,空行的高度为零。

  

这是我想要完成的最佳方法吗?

这很难回答。可能没有“最好”的方式。

您可能希望查看this answer相关问题,该问题显示了通过堆叠它们然后将当前帧升级到堆栈顶部来在一组帧之间切换的方法。