在 python 中创建一个完整的 window tkinter 滚动条
Create a scrollbar to a full window tkinter in python
我有一个 tkinker
window 有几个按钮和使用位置的布局。我试图为整个 window 创建一个滚动条,但我无法将按钮放在框架中。有人可以帮我吗,我怎样才能在框架上添加这个按钮?
#btn1 = tk.Button(win,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
#btn1.place(x=600, y=0)
import json
from tkinter import *
import tkinter as tk
from tkinter import filedialog as fd
win = Tk()
win.geometry("500x500")
# main
main_frame = Frame(win)
main_frame.pack(fill=BOTH, expand=1)
# canvas
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind(
'<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all"))
)
second_frame = Frame(my_canvas)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
对于初学者,我建议删除多余的导入语句。为了可读性,我会使用 import tkinter as tk,知道你的代码从哪个模块调用函数和方法总是很好的。您似乎设置了 window 大小并将按钮放在该大小之外。我调整了你的 x 和 y 位置。下面的示例会将按钮放在您的屏幕上。
import json
import tkinter as tk
from tkinter import filedialog as fd
win = tk.Tk()
win.geometry("500x500")
# main
main_frame = tk.Frame(win)
main_frame.pack(fill=tk.BOTH, expand=1)
# canvas
my_canvas = tk.Canvas(main_frame)
my_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=tk.VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
btn1 = tk.Button(main_frame,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
btn1.place(x=300, y=300)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
second_frame = tk.Frame(my_canvas)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
创建可滚动框架:
如果你想让一个框架(比如target_frame
)可以滚动,你必须按照以下5个步骤:
- 创建一个框架(比如
outer_frame
)作为 canvas 和滚动条的父级。
- 使用
.create_window()
方法将 target_frame
作为项目添加到 canvas。
- 在适当的地方使用
command = canvas.yview
和 yscrollcommand = scrollbar.set
将 canvas 和滚动条相互连接起来。
- 指定 canvas 的哪个区域应该是可滚动的。如果您希望整个 canvas 可滚动,请使用
canvas.configure(scrollregion = canvas.bbox("all")
.
- 将所有必需的小部件添加到
target_frame
,而不是 outer_frame
或 canvas。
解决方案:
大体上,您的代码存在以下 3 个问题:
- 您没有提供
win.mainloop()
,否则您的 tkinter 应用程序将无法打开。
btn1
的父级应该是 second_frame
,而不是 win
。
second_frame
尚未用 width
和 height
初始化。每当使用 .create_window()
方法将帧添加到 canvas 时,它必须具有预定义的 width
和 height
。否则不显示边框
此外,请记住,要使垂直滚动条正常工作,second_frame
的 height
应大于 my_canvas
的 height
。
在你的代码中,target_frame
和outer_frame
分别对应second_frame
和main_frame
。我对您的代码进行了上述 3 处更改以使其正常工作。
工作代码:
import json
from tkinter import *
import tkinter as tk
from tkinter import filedialog as fd
win = Tk()
win.geometry("500x500")
# main
main_frame = Frame(win)
main_frame.pack(fill=BOTH, expand=1)
# canvas
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind(
'<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all"))
)
second_frame = Frame(my_canvas, width = 1000, height = 100)
btn1 = tk.Button(second_frame,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
btn1.place(x=600, y=0)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
win.mainloop()
我有一个 tkinker
window 有几个按钮和使用位置的布局。我试图为整个 window 创建一个滚动条,但我无法将按钮放在框架中。有人可以帮我吗,我怎样才能在框架上添加这个按钮?
#btn1 = tk.Button(win,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
#btn1.place(x=600, y=0)
import json
from tkinter import *
import tkinter as tk
from tkinter import filedialog as fd
win = Tk()
win.geometry("500x500")
# main
main_frame = Frame(win)
main_frame.pack(fill=BOTH, expand=1)
# canvas
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind(
'<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all"))
)
second_frame = Frame(my_canvas)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
对于初学者,我建议删除多余的导入语句。为了可读性,我会使用 import tkinter as tk,知道你的代码从哪个模块调用函数和方法总是很好的。您似乎设置了 window 大小并将按钮放在该大小之外。我调整了你的 x 和 y 位置。下面的示例会将按钮放在您的屏幕上。
import json
import tkinter as tk
from tkinter import filedialog as fd
win = tk.Tk()
win.geometry("500x500")
# main
main_frame = tk.Frame(win)
main_frame.pack(fill=tk.BOTH, expand=1)
# canvas
my_canvas = tk.Canvas(main_frame)
my_canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=tk.VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
btn1 = tk.Button(main_frame,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
btn1.place(x=300, y=300)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind('<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all")))
second_frame = tk.Frame(my_canvas)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
创建可滚动框架:
如果你想让一个框架(比如target_frame
)可以滚动,你必须按照以下5个步骤:
- 创建一个框架(比如
outer_frame
)作为 canvas 和滚动条的父级。 - 使用
.create_window()
方法将target_frame
作为项目添加到 canvas。 - 在适当的地方使用
command = canvas.yview
和yscrollcommand = scrollbar.set
将 canvas 和滚动条相互连接起来。 - 指定 canvas 的哪个区域应该是可滚动的。如果您希望整个 canvas 可滚动,请使用
canvas.configure(scrollregion = canvas.bbox("all")
. - 将所有必需的小部件添加到
target_frame
,而不是outer_frame
或 canvas。
解决方案:
大体上,您的代码存在以下 3 个问题:
- 您没有提供
win.mainloop()
,否则您的 tkinter 应用程序将无法打开。 btn1
的父级应该是second_frame
,而不是win
。second_frame
尚未用width
和height
初始化。每当使用.create_window()
方法将帧添加到 canvas 时,它必须具有预定义的width
和height
。否则不显示边框
此外,请记住,要使垂直滚动条正常工作,second_frame
的 height
应大于 my_canvas
的 height
。
在你的代码中,target_frame
和outer_frame
分别对应second_frame
和main_frame
。我对您的代码进行了上述 3 处更改以使其正常工作。
工作代码:
import json
from tkinter import *
import tkinter as tk
from tkinter import filedialog as fd
win = Tk()
win.geometry("500x500")
# main
main_frame = Frame(win)
main_frame.pack(fill=BOTH, expand=1)
# canvas
my_canvas = Canvas(main_frame)
my_canvas.pack(side=LEFT, fill=BOTH, expand=1)
# scrollbar
my_scrollbar = tk.Scrollbar(main_frame, orient=VERTICAL, command=my_canvas.yview)
my_scrollbar.pack(side=RIGHT, fill=Y)
# configure the canvas
my_canvas.configure(yscrollcommand=my_scrollbar.set)
my_canvas.bind(
'<Configure>', lambda e: my_canvas.configure(scrollregion=my_canvas.bbox("all"))
)
second_frame = Frame(my_canvas, width = 1000, height = 100)
btn1 = tk.Button(second_frame,
text="Browse...",
compound="left",
fg="blue", width=22,
font=("bold", 10),
height=1,
)
btn1.place(x=600, y=0)
my_canvas.create_window((0, 0), window=second_frame, anchor="nw")
win.mainloop()