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

Posted

技术标签:

【中文标题】Tkinter中可变大小的复选框列表?【英文标题】:Variable size list of Checkboxes in Tkinter? 【发布时间】:2011-08-17 04:04:10 【问题描述】:

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

我需要列出要提取的项目。我首先想到的是一个复选框。但是,据我所知,Tkinter 没有任何支持大量(100+)复选框的东西。该数字不是恒定的,并且可能会随着程序的每次运行而不同。在他们自己的框架中,我还没有找到使框架可滚动的方法。我试过Listbox,但没有好的方法可以选择这个比例的倍数。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的帮助。我会投赞成票,但显然我还不够酷,无法投赞成票。 @Bryan Oakley - Checkbutton 的主人应该在这里指定吗?当窗口不是 root 时(例如,如果您在 Toplevel() 上尝试此操作),我无法使其正常工作 @gnr:是的,你是对的。我已经更新了这个例子。感谢您提请我注意。 我想删除 Text 小部件的内容,然后重新填充它,.delete 似乎没有删除这些窗口。如何清空 Text 小部件?

以上是关于Tkinter中可变大小的复选框列表?的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX TabPane 和调整父级的大小

如何增加 Checkbutton 的大小 - Tkinter

python之tkinter使用-多选框实现开关操作

不可变列表的映射仅更新最后一个索引

TKinter 教程

如何使用 Tkinter 和函数找到选择了哪个检查按钮?