繁体   English   中英

Tkinter:将滚动条与画布组合

[英]Tkinter: Combining a Scrollbar with a Canvas

我知道这不是第一次提出这样的问题,但是即使经过大约2个小时的浏览互联网,我仍然无法正常工作:

因此,我尝试创建一个Tkinter-Frame,其中包含多个Button(作为示例,我花了30个)。 但是因为我的程序没有足够的空间,所以我需要在它旁边添加一个滚动条,以便可以滚动按钮。

我遇到的问题是,条的内部“移动部分”与整个滚动条一样大,无法移动,我使用scollregion=(0,0,1000,1000)解决了这个问题,但即使然后移动栏杆就不会对画布产生任何影响。

这是我从程序中提取的相应代码:

import Tkinter as tk

root = tk.Tk()
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=50)
root.columnconfigure(1, weight=1)

root.minsize(300,400)
root.maxsize(300,400)

#Buttons
buttonFrame = tk.Canvas(root, bg='#bbb')
buttonFrame.grid(row=0, column=0, sticky=tk.N+tk.E+tk.S+tk.W)
buttonFrame.columnconfigure(0, weight=1)

scroll = tk.Scrollbar(root, command=buttonFrame.yview)
scroll.grid(row=0, column=1, sticky=tk.N+tk.E+tk.S+tk.W)
buttonFrame.configure(yscrollcommand=scroll.set)

for i in range(30):
    tk.Button(buttonFrame, text=str(i+1)).grid(row=i, column=0, sticky=tk.N+tk.E+tk.S+tk.W)

root.mainloop()

正如您(希望如此)所见,即使我在此处的某个地方挤压了scrollregion=(bla) ,也无法移动滑块,也不会改变画布上的任何内容。

2个问题:a。)我需要添加(或删除)什么,以便可以在“按钮”列表中滚动b。)从a中进行修复吗? 当使滚动条成为buttonFrame的子buttonFrame而不是root的子级时,它仍然可以工作吗?

要将小部件添加到Canvas,必须使用create_window方法,而不是grid() 然后,您必须在设置滚动区域之前更新画布。

for i in range(30):
    btn = tk.Button(buttonFrame, text=str(i+1))
    buttonFrame.create_window((100,i*50), window=btn)
root.update()
buttonFrame.config(scrollregion=buttonFrame.bbox("all"))

如果您尝试我怀疑不是您想要的东西,因为create_window方法需要绝对定位(您不能使用网格或打包)。 这就是为什么大多数人将“框架”放入“画布”中,然后向其中添加其小部件的原因。 许多人已经抽象出了这个人造框架,它实际上是另一个框架( 包括我)中的画布框架。

暂无
暂无

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

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