python-Tkinter的画布和滚动条

我发现了与此相关的几个问题和答案,但是没有一个解决方案使我明白为什么此代码不起作用:

root=tk.Tk()

vscrollbar = tk.Scrollbar(root)

c= tk.Canvas(root,background = "#D2D2D2",yscrollcommand=vscrollbar.set)

vscrollbar.config(command=c.yview)
vscrollbar.pack(side=tk.LEFT, fill=tk.Y) 

f=tk.Frame(c) #Create the frame which will hold the widgets

c.pack(side="left", fill="both", expand=True)
c.create_window(0,0,window=f)

testcontentA = tk.Label(f,wraplength=350 ,text=r"Det er en kendsgerning, at man bliver distraheret af læsbart indhold på en side, når man betragter dens websider, som stadig er på udviklingsstadiet. Der har været et utal af websider, som stadig er på udviklingsstadiet. Der har været et utal af variationer, som er opstået enten på grund af fejl og andre gange med vilje (som blandt andet et resultat af humor).")
testcontentB = tk.Button(f,text="anytext")
testcontentA.pack()
testcontentB.pack()

f.pack()

c.config(scrollregion=c.bbox("all"))

root.mainloop()

我有一个tkinter窗口,它具有动态生成的内容-这意味着如果要在屏幕上显示两个小部件,则需要能够向下滚动.我希望能够用小部件填充框架’f’,然后使用canvas.create_window()函数以可滚动的方式显示它.

现在,显示了该窗口,但未启用滚动条-就像滚动区域不正确,或者滚动条和画布之间的链接不正确.

解决方法:

如果要将框架嵌入画布中,则必须使用create_window而不是pack.第一步是删除f.pack().

其次,您需要在tkinter有机会显示小部件之后设置bbox,因为只有在将它们实际绘制在屏幕上之前才能计算它们的大小.

一种简单的实现方法是在调用c.config(scrollregion = c.bbox(“ all”))之前先调用root.update(),或者安排该命令与after_idle一起运行.

代码中的另一个错误(我假设…)是您在(0,0)处创建了窗口,但未设置锚点.这意味着当我猜测您希望左上角位于(0,0)时,内部框架将以(0,0)为中心.

将您的create_window调用更改为如下所示:

c.create_window(0,0,window=f, anchor='nw')
上一篇:javascript-如何获取用户向下滚动页面的像素数?


下一篇:Android Webview – 缩放到设备宽度后,底部空白空间