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中可变大小的复选框列表?的主要内容,如果未能解决你的问题,请参考以下文章