Tkinter画布和滚动条

2024-05-16 20:00:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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()函数以可滚动的方式显示它。

现在显示窗口,但滚动条未启用-就像滚动区域不正确或滚动条与画布之间的链接不正确一样。


Tags: theconfigcreaterootwindowfillsidepack
3条回答

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

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

实现这一点的一个简单方法是在调用root.update()之前调用c.config(scrollregion=c.bbox("all")),或者将该命令调度为使用after_idle运行。

代码中的另一个错误(我假设…)是在(0,0)处创建窗口,但不设置锚定。这意味着当我猜你希望左上角位于(0,0)时,内部框架将居中于(0,0)。

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

c.create_window(0,0,window=f, anchor='nw')
import tkinter as tk

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)

#Updated the window creation
c.create_window(0,0,window=f, anchor='nw')

#Added more content here to activate the scroll
for i in range(100):
    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).").pack()
    tk.Button(f,text="anytext").pack()

#Removed the frame packing
#f.pack()

#Updated the screen before calculating the scrollregion
root.update()
c.config(scrollregion=c.bbox("all"))

root.mainloop()

感谢布莱恩·奥克利的回答。

很简单,你把c.create存储在一个元组中!

from tkinter import *
root = Tk()
c = Canvas(root, width=500, height=400).pack()
scroll = c.create_rectangle(225,175,175,225,fill='black'),c.create_rectangle(225,175,275,225)
while True:
      x1 = 1
      c.move(scroll,x1,0)
canvas.mainloop()

相关问题 更多 >