Tkinter中可变大小的复选框列表?
我正在做一个编程任务,使用的是 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有足够的基本构件,可以实现你想象中的几乎所有功能。