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

时间:2011-05-02 18:05:22

标签: python checkbox tkinter

我正在编写一个编程任务。我在Python工作,并使用Tkinter作为GUI。我无法更改语言或GUI工具,也无法使用任何其他包(例如Tix)。

我需要列出要拉的项目。我想到的第一件事就是一个复选框。但是,据我所知,Tkinter没有任何支持大量(100+)复选框的东西。数字不是恒定的,并且可能与程序的每次运行都不同。在他们自己的框架中,我还没有找到一种方法来使框架可滚动。我试过了Listbox,但是没有好办法在这个尺度上选择倍数。

你们中有谁知道这样做的方法吗?

1 个答案:

答案 0 :(得分:15)

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有足够的基本构建块可以做任何你能想象到的事情。