1

質問は非常に簡単です。テキストウィジェットに多くのチェックボックスを作成しましwindow_createた。コードは次のとおりです。

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()

そして、これがどのように見えるかです:

ここに画像の説明を入力してください

複数のチェックボックスを選択したいのですが、すべてのチェックボックスをクリックしなければならないので面倒ですが、ここでSHIFTを使用する方法はありますか?

4

1 に答える 1

2

'<Shift-Button-1>'イベントをすべてのチェックボタンにバインドし、'<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()
于 2013-03-26T10:03:10.787 に答える