2013-03-26 108 views
1

这个问题很简单,我创建了一个使用window_create。这里一个文本小很多复选框是代码:如何在tkinter中用SHIFT选择多个复选框?

import tkinter as tk 

root = tk.Tk() 
sb = tk.Scrollbar(orient="vertical") 
text = tk.Text(root, width=40, height=20, yscrollcommand=sb.set) 
sb.config(command=text.yview) 
sb.pack(side="right",fill="y") 
text.pack(side="top",fill="both",expand=True) 
for i in range(30): 
    cb = tk.Checkbutton(text="checkbutton %s" % i,padx=0,pady=0,bd=0) 
    text.window_create("end", window=cb) 
    text.insert("end", "\n") 

root.mainloop() 

,这里是什么样子:

enter image description here

我想选择多个复选框,如果我必须单击每个复选框,这很麻烦。那么有没有办法可以在这里使用SHIFT

+2

取而代之的绑定,您曾经考虑加入“全选”和“取消选择所有”按钮做同样的事情?大多数用户永远不会意识到他们可以通过点击来选择全部,而且您不能依赖他们阅读用户指南。 – 2013-03-26 10:50:43

+0

是的,我的计划中添加了“全选”和“反选”按钮。但有时使用“shift-select”会更好,例如您想选择几个复选框。 – laike9m 2013-03-26 12:37:26

+0

@BryanOakley你可以看看所选的答案吗?如果在'self.chkbuttons [sl]中更改cb: cb.toggle()'到'map(tk.Checkbutton.toggle,self.chkbuttons [self.start + 1:end])'它将不起作用,我不知道为什么.Thx! – laike9m 2013-03-27 01:41:14

回答

2

您应该将'<Shift-Button-1>'事件绑定到每个checkbutton以及'<Button-1>以指示应该选择的范围的开始。另外,还要考虑到包装你的代码的类更好的可读性:

class App: 
    def __init__(self, root): 
     self.start = 0 
     self.root = root 
     self.sb = tk.Scrollbar(orient="vertical") 
     text = tk.Text(root, width=40, height=20, yscrollcommand=self.sb.set) 
     self.sb.config(command=text.yview) 
     self.sb.pack(side="right",fill="y") 
     text.pack(side="top", fill="both", expand=True) 
     self.chkbuttons = [tk.Checkbutton(text="checkbutton %s" % i,padx=0,pady=0,bd=0) 
          for i in range(30)]       
     for cb in self.chkbuttons: 
      text.window_create("end", window=cb) 
      text.insert("end", "\n") 
      cb.bind("<Button-1>", self.selectstart) 
      cb.bind("<Shift-Button-1>", self.selectrange) 

    def selectstart(self, event): 
     self.start = self.chkbuttons.index(event.widget) 

    def selectrange(self, event): 
     start = self.start 
     end = self.chkbuttons.index(event.widget) 
     sl = slice(min(start, end)+1, max(start, end)) 
     for cb in self.chkbuttons[sl]: 
      cb.toggle() 
     self.start = end 

if __name__ == '__main__': 
    root = tk.Tk() 
    app = App(root) 
    root.mainloop() 
+0

您确定此代码有效吗?但它或多或少有所帮助,无论如何感谢 – laike9m 2013-03-26 13:15:15

+0

@ laike9m是的,大部分代码都是您自己,我只添加了'selectstart'和'selectrange'。 – 2013-03-26 13:25:06

+0

我通过简单地用for循环替换'map'来使你的代码工作。我认为'map'也应该可以工作,但它不会起作用。 – laike9m 2013-03-26 14:40:40

相关问题