首页 > 解决方案 > 如何使用 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 倍的窗口)。

你知道我的错误在哪里吗?

标签: pythontkinterscrollbartkinter-entry

解决方案


好的,所以我找到了一种让我的程序做我想做的事情的方法。我只是改变了方法

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:如何在画布窗口中获取框架以扩展到画布的大小?,它确实帮助我找到了我的错误所在。

我真的为我的英语道歉,我知道我犯了很多错误。


推荐阅读