在这样的情况下,当它们彼此相邻放置时,必须单独使用.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()
中有我在文档中没有看到的秘密成分?
理想情况下,我希望实现以下目标
.pack(side='left', fill='x', expand=True)
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()
之间选择一个阵营。如果一个人可以付出代价就能实现另一个人可以做到的一切,那就太好了。
答案 0 :(得分:2)
使用pack
,某些小部件不可能比其他小部件扩展更多。他们要么扩大要么没有扩大。如果要保持相对比例,则必须将每个小部件强制为特定大小,并且只扩展一个小部件,或者您需要使用pack
以外的其他内容。
由于目前尚不清楚您要实现的目标,并且您声称自己拥有grid
的有效解决方案,因此我建议您坚持使用网格。看来您已经在根窗口中使用pack
了。一个简单的解决方案是创建一个框架,您可以使用pack
将其添加到根中,然后使用grid
将小部件放在该框架中。
答案 1 :(得分:1)
就我个人而言,我将在.grid()中执行所有操作,因为与.pack()相比,它维护起来更容易,并且一旦事情变得复杂起来,它也变得简单得多。我用了一段时间的背包,花了我很长时间才能完成工作,因为事情最终出现在我不想要的地方。 有关网格列大小的更多信息:http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/grid-config.html 和 Tkinter configure columnwidth
P.S。如果您要制作GUI,那么有一个名为Kivy的库非常适合此类工作,如果您有兴趣,可以直接检查(https://kivy.org/#home),否则请使用网格。