繁体   English   中英

Tkinter画布和滚动条

[英]Tkinter Canvas & 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.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 因为只有在将它们实际绘制在屏幕上之前才能计算它们的大小。

一种简单的方法来实现这一目标是调用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()

感谢Bryan Oakley的出色回答。

很简单,您将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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM