使用Tcl / TK 8.6的tkinter:使用pack()

时间:2018-12-27 00:18:51

标签: python tkinter geometry

在这样的情况下,当它们彼此相邻放置时,必须单独使用.pack().grid()来实现指定的小部件尺寸。

我曾经根据这篇博文获得的知识将.pack().grid()混合使用:

In what cases Tkinter's grid() cannot be mixed with pack()?

即,帧彼此紧挨着排列,但是在每个帧的内部,我都有网格。一切正常,直到我开始在解释器上遇到麻烦时,才在官方Python 3.7.2中将Tcl / TK后端升级到8.6.8。

_tkinter.TclError: cannot use geometry manager grid inside . which already has slaves managed by pack

然后我将所有内容都切换到.pack(),但是现在我很难恢复某些小部件比其他小部件的列设计。

我应该用一切.grid()来实现这一目标,还是.pack()中有我在文档中没有看到的秘密成分?

理想情况下,我希望实现以下目标

  1. 在一排小部件中,小部件彼此相邻并尽可能地填充空间,类似于.pack(side='left', fill='x', expand=True)
  2. 在同一行中,我仍然可以指定一个窗口小部件,使其宽度大于其余窗口小部件,以便将所有内容设置为expand=True时,相对大小仍在控制范围内。

示例

在macOS上,以下代码为我提供了更宽的输入范围和更窄的滑块,而我想反过来说,只需.pack()

import tkinter as tk
import tkinter.ttk as ttk


root = tk.Tk()
mainframe = tk.Frame(root, bg='blue')
mainframe.pack()
row1 = tk.Frame(mainframe, bg='red')
entry = ttk.Entry(row1, text='Search...')
slider = ttk.Scale(row1)
btn1 = ttk.Button(row1, text='Reset')
btn2 = ttk.Button(row1, text='Help')

entry.pack(side='left', fill='x', expand=True)
slider.pack(side='left', fill='x', expand=True)
btn1.pack(side='left', fill='x', expand=True)
btn2.pack(side='left', fill='x', expand=True)
row1.pack()

root.mainloop()

我必须强调,我知道如何使用.grid().grid_columnconfigure(col, weight)来使用.pack()和它的“行”。只是升级到TK 8.6后,我的工作代码(当然比上面的示例更复杂)就中断了,这意味着随着我的项目变得越来越大,混合管理人员将越来越难以维护。因此,我决定在.grid()slice()之间选择一个阵营。如果一个人可以付出代价就能实现另一个人可以做到的一切,那就太好了。

2 个答案:

答案 0 :(得分:2)

使用pack,某些小部件不可能比其他小部件扩展更多。他们要么扩大要么没有扩大。如果要保持相对比例,则必须将每个小部件强制为特定大小,并且只扩展一个小部件,或者您需要使用pack以外的其他内容。

由于目前尚不清楚您要实现的目标,并且您声称自己拥有grid的有效解决方案,因此我建议您坚持使用网格。看来您已经在根窗口中使用pack了。一个简单的解决方案是创建一个框架,您可以使用pack将其添加到根中,然后使用grid将小部件放在该框架中。

答案 1 :(得分:1)

就我个人而言,我将在.grid()中执行所有操作,因为与.pack()相比,它维护起来更容易,并且一旦事情变得复杂起来,它也变得简单得多。我用了一段时间的背包,花了我很长时间才能完成工作,因为事情最终出现在我不想要的地方。 有关网格列大小的更多信息:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-config.htmlTkinter configure columnwidth

P.S。如果您要制作GUI,那么有一个名为Kivy的库非常适合此类工作,如果您有兴趣,可以直接检查(https://kivy.org/#home),否则请使用网格。