【发布时间】:2020-03-04 17:17:24
【问题描述】:
下面显示了 Tk 窗口的右下角,该窗口由一个框架组成,该框架由一个画布和水平和垂直滚动条组成。这是使用 Grid 方法实现的。
我无法使用 Pack 方法复制相同的外观。下面是我得到的和给出这样外观的示例代码。
如何使用 pack 方法通过 grid 方法复制外观?
import tkinter as tk
import tkinter.ttk as ttk
root = tk.Tk()
frame = ttk.Frame( root )
frame.pack()
ysb = ttk.Scrollbar( frame, orient='vertical' )
xsb = ttk.Scrollbar( frame, orient='horizontal' )
canvas = tk.Canvas( frame, width=1000, height=700, background='green')
canvas.create_rectangle( 100, 100, 900, 600, fill='yellow' )
canvas.configure( scrollregion=canvas.bbox(tk.ALL),
xscrollcommand=xsb.set,
yscrollcommand=ysb.set )
xsb.config( command=canvas.xview )
ysb.config( command=canvas.yview )
ysb.pack( side='right', fill='y', expand=1)
xsb.pack( side='bottom', fill='x', expand=1 )
canvas.pack( side='left', fill='both', expand=1 )
#ysb.grid( row=0, column=1, sticky='ns' )
#xsb.grid( row=1, column=0, sticky='ew' )
#canvas.grid( row=0, column=0, sticky='nsew' )
【问题讨论】:
-
如果你可以用
grid做你想做的事,为什么你需要使用pack的解决方案? -
@BryanOakley 实际代码具有由 Pack 方法定位的小部件。在我的示例中使用网格方法来显示所需的结果,而
pack没有得到。 @acw1668 解决方案帮助我更好地理解了 pack 方法。 -
您的实际代码是否使用
pack并不重要。您可以创建一个框架并使用pack将其放置,并使用grid将滚动条和画布放置在框架中。 -
抱歉没有解释清楚。实际代码有一个已经打包好的画布。我无法将
grid方法与现有的pack方法结合使用。 -
@SunBear 实际上,您的代码已将画布和两个滚动条放在一个框架内 (
frame),因此您可以在该框架内使用grid()来布局画布和两个滚动条(如果有)是同一帧中没有其他小部件。然后,您可以在框架上使用pack()以及其他属于root子级的小部件。您不能在 same 容器中混用pack()和grid()。frame是一个容器,root是另一个容器。所以在frame中使用grid()与在root中使用pack()不会冲突。