【发布时间】:2021-09-14 16:34:40
【问题描述】:
我正在尝试构建一个打开文件浏览器并在可滚动框架中列出所选文件的函数。我尝试使用我在网上找到的可滚动框架类,当我将它应用于一个非常简单的案例时,它可以工作,但在我的文件浏览功能中应用时不起作用。可滚动框架类的写法如下:
class ScrollableFrame(ttk.Frame):
def __init__(self, container, *args, **kwargs):
super().__init__(container, *args, **kwargs)
canvas = tk.Canvas(self)
scrollbar = ttk.Scrollbar(self, orient="vertical", command=canvas.yview)
self.scrollable_frame = ttk.Frame(canvas)
self.scrollable_frame.bind(
"<Configure>",
lambda e: canvas.configure(
scrollregion=canvas.bbox("all")))
canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
canvas.configure(yscrollcommand=scrollbar.set)
canvas.grid(row=0, column=0)
scrollbar.grid(row = 0, column=1)
然后被应用:
import os
from tkinter import filedialog,Label,Tk,Entry,Frame,ttk
import tkinter as tk
root = Tk()
browse_frame = Frame(root)
browse_frame.grid(row=0, column=0, columnspan=2)
all_files = []
def browse_files():
#function which opens a file browser and adds selected files to all_files list.
#opens file browser
filename_list = list(filedialog.askopenfilenames(initialdir = '/',
title = "Select Files",
filetypes = (("text files","*.txt"),
("csv files","*.csv"),
("all files","*.*"))))
#adds selected files to all_files list
for i in filename_list:
all_files.append(i)
if len(all_files) >=1:
#build scrollable frame for file names
files = ScrollableFrame(root)
files.grid(column=0, row=3, padx=10, pady=10)
file_label = Label(files, text="Selected Files:", font=("arial", 13))
file_label.grid(column=0, row=0, padx=80, pady=10)
u = 0
while u < len(all_files):
#adds each file name to scrollable frame
file_name = Label(files, text=str(os.path.basename(all_files[u])))
file_name.grid(column=0, row=u+1, padx=5, pady=5)
u+=1
return
browse = ttk.Button(browse_frame, text="browse files", command=browse_files)
browse.grid(column=1, row=0, rowspan=2, padx=50, pady=10)
root.mainloop()
如果文件列表继续超出窗口范围并且滚动条不起作用且很小,则会产生以下结果。
image of tkinter window with scrollable frame
非常感谢任何帮助。
【问题讨论】:
-
使用
canvas.grid(row=0, column=0, sticky="news")和scrollbar.grid(row=0, column=1, sticky="ns")。此外,您还需要将所有要滚动的小部件放在self.scrollable_frame中,所以不要使用Label(files, ...)使用Label(files.scrollable_frame, ...) -
为什么不使用列表框?那会容易得多
-
@TheLizzard,谢谢,这似乎已经解决了问题!
-
@BryanOakley tkinnter 中的列表框和框架有什么区别?
-
@Madmem 框架是其他小部件的空容器。列表框是专门用于显示字符串列表的可滚动小部件。