Python 特金特帆布公司;滚动条

Python 特金特帆布公司;滚动条,python,canvas,tkinter,scrollbar,Python,Canvas,Tkinter,Scrollbar,我发现了几个与此相关的问题和答案,但没有一个解决方案能让我理解此代码不起作用的原因: 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.Fram

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

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


现在显示窗口,但未启用滚动条-这类似于滚动区域不正确或滚动条与画布之间的链接不正确。

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

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

实现这一点的一个简单方法是在调用
c.config(scrollregion=c.bbox(“all”)
之前调用
root.update()
,或者计划在空闲后使用
运行该命令

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

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

c.create_window(0,0,window=f, anchor='nw')

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

很简单,你可以将c存储在一个元组中

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()

这太棒了-非常感谢!我将对此进行测试,然后返回如何在画布区域内的tkinter中使用grid()选项?
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()