首页 > 解决方案 > 无法生成 tkinter 滚动条

问题描述

self.root = tkinter.Tk()

self.frame = Frame(self.root, width = 1300, height = 1300, bg = "yellow")
self.frame.grid(row = 0 , column = 0, sticky = 'nw')
self.frame.grid_rowconfigure(0, weight=1)
self.frame.grid_columnconfigure(0, weight=1)
self.frame.grid_propagate(True)

self.canvas_main = Canvas(self.frame, 
                      height = 300, 
                      width = 300,
                      scrollregion=(500,500,0,500)
                      )

 self.canvas_main.grid(row = 0, column = 0, padx= 10, pady = 10, sticky = "news")

 self.scrollbar = Scrollbar(self.root, orient = VERTICAL, command = self.canvas_main.yview)
 self.scrollbar.grid(row = 0, column = 1, sticky = 'ns')
 self.canvas_main.configure(yscrollcommand=self.scrollbar.set)

在上面的代码块中,我输入了滚动条元素来启用垂直滚动条,但是它没有反映。谁能找出我在这个街区做错了什么?

标签: pythonuser-interfacetkinterscrollbar

解决方案


您已将可滚动区域 ( scrollregion) 设置为零像素高,因此 tkinter 认为在垂直方向上没有可滚动的内容。

通常,您会先进行绘制,然后将可滚动区域设置为包含您绘制的所有内容。为此,您需要获取边界框(包含所有画布对象的最小矩形),然后将其用作scrollregion.

例子:

canvas = tk.Canvas(...)
<draw a bunch of objects>
canvas.configure(scrollregion=canvas.bbox("all"))

另一种方法是提前定义虚拟绘图区域有多大。例如,您已将画布的宽度和高度设置为 300。如果您希望实际绘图区域是可见大小的两倍,那么您可以将scrollregion区域设置为两倍大。

此示例将可滚动区域设置为从 0,0(左上角)开始,并扩展到 600,600(右下角):

canvas = tk.Canvas(..., width=300, height=300)
canvas.configure(scrollregion=(0,0,600,600)

推荐阅读