Python: 如何用tkinter 做出畫布(Canvas)與滾動條(Scrollbar)? canvas = tk.Canvas(root, width=400, height=300) ; scrollbar = tk.Scrollbar(root, command = canvas.yview) ; canvas.configure( yscrollcommand = scrollbar.set)

加入好友
加入社群
Python: 如何用tkinter 做出畫布(Canvas)與滾動條(Scrollbar)? canvas = tk.Canvas(root, width=400, height=300) ; scrollbar = tk.Scrollbar(root, command = canvas.yview) ; canvas.configure( yscrollcommand = scrollbar.set) - 儲蓄保險王
import tkinter as tk

root = tk.Tk()
root.title('Scrollbar example')

# 创建Canvas
canvas = tk.Canvas(root, width=400, height=300)
canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

# 创建Scrollbar
scrollbar = tk.Scrollbar(root, command=canvas.yview)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

# 配置Canvas与Scrollbar的联动
canvas.configure(yscrollcommand=scrollbar.set)
canvas.bind("<Configure>", 
            lambda e: canvas.configure
            (scrollregion=canvas.bbox("all")))

# 创建一个内部的Frame用于放置内容
frame = tk.Frame(canvas)
canvas.create_window((0, 0), window=frame, anchor="nw")

# 添加大量内容到Frame中
for i in range(100):
    tk.Label(frame, text=f"Label {i}").pack()

root.mainloop()

code:

Python: 如何用tkinter 做出畫布(Canvas)與滾動條(Scrollbar)? canvas = tk.Canvas(root, width=400, height=300) ; scrollbar = tk.Scrollbar(root, command = canvas.yview) ; canvas.configure( yscrollcommand = scrollbar.set) - 儲蓄保險王

輸出結果:

Python: 如何用tkinter 做出畫布(Canvas)與滾動條(Scrollbar)? canvas = tk.Canvas(root, width=400, height=300) ; scrollbar = tk.Scrollbar(root, command = canvas.yview) ; canvas.configure( yscrollcommand = scrollbar.set) - 儲蓄保險王

scrollbar = tk.Scrollbar(root, command=canvas.yview)

在 tkinter 中,command 参数用于指定滚动条 (Scrollbar) 的命令,当滚动条的位置发生变化时,会调用该命令。

在示例代码中,command=canvas.yview 表示将 canvas 的垂直滚动命令 (yview) 与滚动条的命令相关联。

当滚动条的位置发生变化时,它会调用 canvas 的 yview 方法,并传递当前滚动条的位置信息,以便 canvas 根据滚动条的位置来调整内容的显示。

这样就实现了滚动条与 canvas 的联动,使滚动条能够控制 canvas 内容的垂直滚动。


canvas.configure(yscrollcommand=scrollbar.set)

在 tkinter 中,yscrollcommand 是用于指定与垂直滚动条 (Scrollbar) 关联的部件的滚动命令。

在示例代码中,canvas 的垂直滚动条是 scrollbar,通过设置 yscrollcommand=scrollbar.set,将滚动条的 set 方法与 canvas 的垂直滚动命令相关联。

当 canvas 的滚动位置发生变化时,它会调用 scrollbar 的 set 方法,并将当前的滚动位置传递给 scrollbar,以确保滚动条的位置与 canvas 的滚动位置保持一致。

这样就实现了滚动条与 canvas 的联动,使得滚动条可以控制 canvas 内容的滚动。


scrollbar = tk.Scrollbar(root, command=canvas.yview) 这一行代码是创建了一个垂直滚动条,并将其与 canvas 组件关联起来。通过指定 command 参数为 canvas.yview,当滚动条的位置发生变化时,会调用 canvas.yview 方法来更新 canvas 的显示

canvas.configure(yscrollcommand=scrollbar.set) 这一行代码是将 scrollbar 组件与 canvas 的垂直滚动联动进行配置。通过指定 yscrollcommand 参数为 scrollbar.set,当 canvas 的垂直滚动发生变化时,会调用 scrollbar.set 方法来更新滚动条的位置

简而言之,command=canvas.yview 是将滚动条与 canvas 关联起来,而 canvas.configure(yscrollcommand=scrollbar.set) 是将 scrollbarcanvas 的滚动联动进行配置,以实现滚动条和 canvas 的同步滚动效果。

这两行代码的作用是确保当用户滚动滚动条时,canvas 的视图也会随之变化,保持内容的可见性


canvas.bind()方法用于将事件绑定到Canvas部件上,以便在事件发生时触发相应的回调函数。

语法如下:canvas.bind(event, callback)

event是一个字符串,表示要绑定的事件,例如鼠标点击事件”<Button-1>”、键盘按键事件”<Key>”等。
callback是一个函数,表示事件触发时要执行的回调函数。
在绑定事件后,当该事件在Canvas上发生时,绑定的回调函数将被调用。回调函数可以接收一个参数,表示事件的相关信息,如鼠标坐标、键盘按键等。
在示例代码中的canvas.bind(“<Configure>”, lambda e: canvas.configure(scrollregion=canvas.bbox(“all”))),绑定了”<Configure>”事件,该事件在Canvas部件大小变化时触发。当Canvas大小变化时,绑定的回调函数被调用,并通过lambda函数接收事件信息,然后使用canvas.configure(scrollregion=canvas.bbox(“all”))来设置Canvas的滚动范围,确保滚动条能够正确工作。
在这个例子中,lambda函数接收一个事件参数e,但在回调函数内部并没有使用到。lambda函数主要是为了创建一个匿名函数作为回调函数,以便将canvas.configure(scrollregion=canvas.bbox(“all”))作为回调函数传递给canvas.bind()方法。

canvas.bind(“<Configure>”, lambda e: canvas.configure(scrollregion=canvas.bbox(“all”)))
这一行代码是将 事件与一个回调函数进行绑定。当 canvas 的大小发生变化时,就会触发 事件,然后执行绑定的回调函数。

在这个特定的绑定中,回调函数是一个使用 lambda 表达式定义的匿名函数,它接受一个事件对象 e 作为参数。在这个回调函数中,canvas.configure(scrollregion=canvas.bbox(“all”)) 这一行代码被执行,用于配置 canvas 的滚动区域。

scrollregion 是一个 canvas 的属性,它定义了可滚动区域的范围。通过设置 scrollregion 为 canvas.bbox(“all”),表示将滚动区域设置为包含所有内容的边界框,这样就可以确保滚动条在需要时能够显示和滚动整个内容区域。

scrollregion 是 Canvas 组件的一个属性,它定义了可滚动区域的范围。通过设置 scrollregion 为 canvas.bbox(“all”),我们可以将滚动区域的范围设置为包含 Canvas 内所有内容的边界框。

canvas.bbox(“all”) 返回一个边界框,该边界框包围了 Canvas 内的所有元素。通过将 scrollregion 设置为这个边界框,我们确保滚动条能够在需要时显示和滚动整个内容区域。

这样做的好处是,当 Canvas 内容超出可视区域时,滚动条可以根据需要自动调整大小并进行滚动,以便用户可以查看完整的内容。

因此,设置 scrollregion 为 canvas.bbox(“all”) 是确保滚动条适应 Canvas 内容并正常工作的重要步骤。

综合来说,这行代码的作用是在 canvas 大小变化时,动态更新滚动区域,以确保滚动条的范围与内容的范围保持一致,从而实现正确的滚动效果

e 是事件对象的参数,它表示触发事件的具体事件信息,例如事件发生的位置、大小变化等。尽管在这个特定的回调函数中没有使用到 e 参数,但是 bind 方法要求回调函数接受一个事件对象作为参数。

因此,在这种情况下,lambda e: canvas.configure(scrollregion=canvas.bbox(“all”)) 中的 e 参数仍然需要写出,即使它在函数体内没有被使用到。这样做是为了满足 bind 方法的要求,确保回调函数能够正确地接受事件对象的参数。

frame = tk.Frame(canvas) 是 Tkinter 中创建一个 Frame 组件的语句,该组件将被放置在 Canvas 上。

Frame 组件是 Tkinter 中的容器,用于组织和布局其他组件,例如按钮、标签、文本框等。通过创建 Frame 组件,可以在其中添加其他组件,并根据需要进行布局和排列。

在这里,frame = tk.Frame(canvas) 创建了一个新的 Frame 组件,并将其赋值给变量 frame。这个 Frame 组件将被放置在之前创建的 Canvas 组件上。

通过将 Frame 组件放置在 Canvas 上,可以在 Canvas 中创建一个可滚动的窗口,并在窗口中添加和管理其他组件。

在 Tkinter 中,组件(如按钮、标签、文本框等)是无法直接放置在 Canvas 上显示的。Canvas 组件主要用于绘制图形和显示绘制的内容,而无法直接放置其他 Tkinter 组件。

要在 Canvas 上显示其他组件,需要借助一个中间容器,通常是一个 Frame 组件。Frame 组件可以作为一个容器,用于组织和管理其他组件,并且可以被放置在 Canvas 上显示。

所以,在使用 Canvas 组件时,常见的做法是创建一个 Frame 组件,将需要显示的其他组件放置在这个 Frame 中,然后将该 Frame 放置在 Canvas 上。

具体来说,在给定的代码片段中,frame = tk.Frame(canvas) 创建了一个 Frame 组件,并将其赋值给变量 frame。然后,通过 canvas.create_window((0, 0), window=frame, anchor="nw") 将该 Frame 组件添加到 Canvas 上,并指定了其在 Canvas 中的位置。

通过这样的操作,可以将 Frame 中的组件显示在 Canvas 上,实现在 Canvas 中放置其他组件的效果。

因此,必须先创建一个 Frame 组件,将需要显示的内容放置在该 Frame 中,然后再将 Frame 放置在 Canvas 上,才能在 Canvas 中显示其他组件。

canvas.create_window((0, 0), window=frame, anchor="nw") 是 Tkinter 中 Canvas 组件的方法之一,用于在 Canvas 上创建一个窗口并将其与指定的 frame 组件关联起来。

这个方法的作用是在 Canvas 上创建一个窗口,并将窗口的内容设置为指定的 frame 组件。窗口的位置由 (0, 0) 指定,即窗口的左上角与 Canvas 的左上角对齐。window=frame 表示将 frame 组件作为窗口的内容。

anchor="nw" 表示窗口的锚定点为左上角,即窗口的位置 (0, 0) 是相对于锚定点的位置。

通过使用 create_window 方法,我们可以在 Canvas 上创建和管理其他组件,如 frame、label、button 等。这样可以将不同的组件放置在 Canvas 上,并灵活地控制它们的位置和布局。

总之,canvas.create_window((0, 0), window=frame, anchor="nw") 是将指定的 frame 组件创建为窗口,并将其放置在 Canvas 上的指定位置的操作。

推薦hahow線上學習python: https://igrape.net/30afN

加入好友
加入社群
Python: 如何用tkinter 做出畫布(Canvas)與滾動條(Scrollbar)? canvas = tk.Canvas(root, width=400, height=300) ; scrollbar = tk.Scrollbar(root, command = canvas.yview) ; canvas.configure( yscrollcommand = scrollbar.set) - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *