在 python 中创建一个全窗口 tkinter 的滚动条

1 python tkinter

我有一个tkinker窗口,其中有几个使用 place 的按钮和布局。我尝试为整个窗口创建滚动条,但无法将按钮放置在框架中。有人可以帮我吗,我怎样才能在框架上添加这个按钮?

#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")
Run Code Online (Sandbox Code Playgroud)

Sri*_*san 5

创建可滚动框架:

如果你想让一个框架(比如target_frame)可滚动,你必须遵循以下 5 个步骤:

  1. 创建一个框架(例如outer_frame)作为画布和滚动条的父级。
  2. 使用 方法将其作为项目添加target_frame到画布中.create_window()
  3. 在适当的位置使用command = canvas.yview和将画布和滚动条相互连接。yscrollcommand = scrollbar.set
  4. 指定画布的哪个区域应可滚动。如果您希望整个画布可滚动,请使用canvas.configure(scrollregion = canvas.bbox("all")
  5. 将所有必需的小部件添加到target_frame,而不是添加到outer_frame或画布。

在此输入图像描述


解决方案:

总的来说,您的代码存在以下 3 个问题:

  1. 您尚未给出win.mainloop(),否则您的 tkinter 应用程序将无法打开。
  2. 的父项btn1should be second_frame, not win
  3. second_frame尚未用width和初始化height。每当使用该方法将框架添加到画布时.create_window(),它必须具有预定义的widthheight。否则,该框架将不会显示。

另外,请记住,要使垂直滚动条正常工作, 的height应该second_frame大于heightmy_canvas

在您的代码中,target_frame和分别outer_frame对应于second_framemain_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()
Run Code Online (Sandbox Code Playgroud)