Tkinter中可变大小的复选框列表?

10 投票
1 回答
8985 浏览
提问于 2025-04-16 16:50

我正在做一个编程任务,使用的是 Python,并且用 Tkinter 来做图形界面。我的要求是不能换语言或图形界面工具,也不能使用任何额外的包(比如 Tix)。

我需要做一个可以选择的项目列表。最开始我想到的是用复选框。不过,按照我所知,Tkinter 并不支持大量(100个以上)的复选框。而且这个数量不是固定的,每次运行程序时可能都会不同。我在自己的框架中没有找到让框架可以滚动的方法。我试过用 Listbox,但在这种规模下没有好的方法可以选择多个项目。

你们有没有知道的解决办法?

1 个回答

19

Tkinter支持很多复选框,数量几乎没有限制,主要受到系统内存和使用方便性的影响。

制作一个可以滚动的容器有至少三种方法。画布和文本小部件都支持滚动,所以通常的做法是用其中一个来做容器。如果你需要更复杂的东西,也可以用place命令来做一些巧妙的设计。

如果你想滚动一个包含的不仅仅是垂直列表的框架,使用画布是个不错的选择。如果你只是想创建一个简单的垂直列表,使用文本小部件会很方便。

下面是一个简单的例子:

import Tkinter as tk

class Example(tk.Frame):
    def __init__(self, root, *args, **kwargs):
        tk.Frame.__init__(self, root, *args, **kwargs)
        self.root = root

        self.vsb = tk.Scrollbar(self, orient="vertical")
        self.text = tk.Text(self, width=40, height=20, 
                            yscrollcommand=self.vsb.set)
        self.vsb.config(command=self.text.yview)
        self.vsb.pack(side="right", fill="y")
        self.text.pack(side="left", fill="both", expand=True)

        for i in range(1000):
            cb = tk.Checkbutton(self, text="checkbutton #%s" % i)
            self.text.window_create("end", window=cb)
            self.text.insert("end", "\n") # to force one checkbox per line

if __name__ == "__main__":
    root = tk.Tk()
    Example(root).pack(side="top", fill="both", expand=True)
    root.mainloop()

当你对Tkinter了解得更多时,你会发现它的内置小部件数量没有其他一些工具包那么多。不过你也会意识到,Tkinter有足够的基本构件,可以实现你想象中的几乎所有功能。

撰写回答