python - 如何使用 tkinter 在条目列表上实现滚动条?
问题描述
我目前正在尝试在 Python 3 中使用 tkinter 制作可滚动的条目列表。在查找一些文档时,我发现了这一点:在 Tkinter 中向一组小部件添加滚动条。它真的很棒,并且与标签一起工作得很好,但它似乎不适用于条目。你会在这里找到我的代码,它创建了一个 2x25 的条目列表,我希望能够通过它滚动:
import tkinter as tk
class MainPage(tk.Frame):
def __init__(self, racine):
super().__init__(master=racine)
self.grid()
self.entriesCanvas = tk.Canvas(self, borderwidth=0, background="white")
self.entriesFrame = tk.Frame(self.entriesCanvas, background="white")
self.scrollbar = tk.Scrollbar(self, command=self.entriesCanvas.yview)
self.entriesCanvas.configure(yscrollcommand=self.scrollbar.set)
self.entriesCanvas.grid(column=0, row=2, columnspan=2)
self.scrollbar.grid(column=3, row=2, sticky='ns')
# self.entriesFrame.grid()
self.entriesCanvas.create_window((0, 0), window=self.entriesFrame,
anchor='nw', tags='self.entriesFrame')
# self.entriesFrame.grid()
self.entriesCanvas.bind('<Configure>', self.onFrameConfigure)
self.entries = []
for i in range(50):
self.entries.append(tk.Entry(self.entriesFrame, font=('arial', 30)))
self.entries[i].grid(column=i % 2, row=i//2)
def onFrameConfigure(self, event):
self.entriesCanvas.configure(scrollregion=self.entriesCanvas.bbox("all"))
if __name__ == "__main__":
root = tk.Tk()
mainPage = MainPage(root)
root.mainloop()
请注意,我注释掉了两行。如果您“激活”第一行,将会有一个滚动条,并且可以滚动浏览条目,但它被奇怪地放大了。另一方面,如果您“激活”第二行,GUI 将像我希望的那样,但无法滚动,并且它似乎显示所有条目(即使有 1000 个条目,因此一个是屏幕大小 20 倍的窗口)。
你知道我的错误在哪里吗?
解决方案
好的,所以我找到了一种让我的程序做我想做的事情的方法。我只是改变了方法
def onFrameConfigure(self, event):
self.entriesCanvas.configure(scrollregion=self.entriesCanvas.bbox("all"))
经过
def onFrameConfigure(self, event):
self.entriesCanvas.configure(scrollregion=self.entriesCanvas.bbox("all"), width=self.entriesFrame.winfo_width())
(我基本上只添加了一个参数来要求画布是框架的宽度。)我不知道它是否完美(因为我仍然使用 .grid() 而不是 .pack()),但它可以工作。
感谢您给我源Tkinter:如何在画布窗口中获取框架以扩展到画布的大小?,它确实帮助我找到了我的错误所在。
我真的为我的英语道歉,我知道我犯了很多错误。
推荐阅读
- ios - SwiftUI View 在嵌入 UIView 时不更新其状态(使用 UIHostingController)
- c# - 执行 DbGeometry 包含操作时出现 SqlNullValueException
- javascript - 如何通过使用 PHP 和 Javascript 获取单选按钮值来计算总数?
- database - Laravel 工厂 - 创建或制作动态
- azure-devops - 在 Azure Devops 上完成拉取请求后,如何自动“git tag -a”?
- javascript - 阅读 prev 道具:渲染过多
- html - 在进入codeigniter的第二行之前,有什么办法可以让第一行成为强制性的?
- ios - NFC CORE iOS:在同一个会话中读取NDEF、修改数据和WriteNDEF
- python-3.x - 如何在谷歌云存储中获取 GS_SECRET_ACCESS_KEY 和 GS_ACCESS_KEY_ID
- macos - AppleScript - 有没有办法在 Array 内换行?