python - 如何在 Tkinter 中滚动浏览一组标签小部件?
问题描述
我正在 Tkinter 中创建一个测验,目前正在研究一个框架来显示来自 SQLite 数据库的记录,我想以“表格”格式显示该记录。我已经创建了一组标签,它们将充当我的“表格”,但无法成功实现滚动条。
我知道滚动条不能直接与框架一起使用,我需要创建一个画布并将所有小部件附加到它。我试图通过论坛上给出的一些解决方案,但无法将它们与我自己的代码正确集成。目前,我创建的滚动条不起作用。
class Progress(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.___init__(self, parent)
frametwo = Frame(self) #creates a secondary frame for the canvas?
frametwo.grid(row = 2, column = 0)
#attempts to create a functional scroll bar
text_area = tk.Canvas(frametwo)
vscroll = tk.Scrollbar(text_area, orient="vertical", command = text_area.yview)
text_area['yscrollcommand'] = vscroll.set
text_area.grid(row=2, column=0, sticky=tk.N+tk.S+tk.E+tk.W)
vscroll.grid(row=2, column=6, sticky="nsew")
text_area.configure(scrollregion = text_area.bbox("all"))
#creates the label widgets
self._widgets = []; columns = 6
for row in range(0,11):
current_row = []
for column in range(columns):
label = tk.Label(text_area, text="%s/%s" % (row, column),
borderwidth=0, width=10, height =2 )
label.config(bg = "White", font=("Calibri bold", 20))
label.grid(row =(row+2), column=column, sticky="nsew", padx=1, pady=1)
current_row.append(label)
self._widgets.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
抱歉,如果代码不清楚/效率低下,我是使用 tkinter 的初学者!上面的代码以我想要的方式输出我的标签并在它们旁边放置一个滚动条,但它没有功能并且不会移动以显示剩余的小部件。我确定我犯了一个基本错误或省略了一些代码。我将如何纠正这个问题?
解决方案
您需要在您的内部制作另一个框架canvas
,然后使用它canvas.create_window
来创建框架。标签小部件应该进入该框架内。
class Progress(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self, parent)
frametwo = tk.Frame(self) #creates a secondary frame for the canvas?
frametwo.grid(row = 2, column = 0)
#attempts to create a functional scroll bar
canvas = tk.Canvas(frametwo)
canvas_frame = tk.Frame(canvas)
vscroll = tk.Scrollbar(frametwo, orient="vertical", command = canvas.yview)
canvas['yscrollcommand'] = vscroll.set
canvas.grid(row=2, column=0, sticky=tk.N+tk.S+tk.E+tk.W)
vscroll.grid(row=2, column=6, sticky="nsew")
#creates the label widgets
self._widgets = []; columns = 6
for row in range(0,11):
current_row = []
for column in range(columns):
label = tk.Label(canvas_frame, text="%s/%s" % (row, column),
borderwidth=0, width=10, height =2 )
label.config(bg = "White", font=("Calibri bold", 20))
label.grid(row =(row+2), column=column, sticky="nsew", padx=1, pady=1)
current_row.append(label)
self._widgets.append(current_row)
for column in range(columns):
self.grid_columnconfigure(column, weight=1)
canvas.create_window((0, 0), window=canvas_frame, anchor='nw')
canvas_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion = canvas.bbox("all"),width=450,height=300))
推荐阅读
- javascript - 是否可以在 Python 模型中使用来自 javascript 的 API 密钥,然后在 Javascript 中使用该模型?
- haskell - Haskell中`->`,`=`和``的优先级是什么?
- c# - 访问令牌仅在 oAuth 1 天后过期
- ruby - 我正在学习 rspec 并且我已经编写了一个规范,但它部分失败了
- c++ - Visual Studio C++ 控制台应用程序构建并运行,但不创建 EXE 文件
- c# - 将哈希算法与 ReadOnlySpan 一起使用
- javascript - 如何从 li 获取 id?
- android - 通过 https 发送的 Firebase 身份验证类型电子邮件/密码凭据?
- json - jq 读取内联字符串,而不是从标准输入
- c++ - 设置 Qt::FramelessWindowHint 时隐藏阴影