Список флажков переменного размера в Tkinter?

#python #checkbox #tkinter

#python #флажок #tkinter

Вопрос:

Я работаю над задачей программирования. Я работаю в Python и использую Tkinter для нашего графического интерфейса. Я не могу изменить язык или инструмент GUI, а также не могу использовать какие-либо дополнительные пакеты (например Tix ).

Мне нужно составить список элементов для извлечения. Первое, о чем я подумал, был флажок. Однако, насколько я знаю, в Tkinter нет ничего, что поддерживало бы большое количество (более 100) флажков. Это число не является постоянным и, вероятно, будет отличаться при каждом запуске программы. В их собственном фрейме я не нашел способа сделать фрейм прокручиваемым. Я пытался Listbox , но нет хорошего способа выбрать кратные значения в этом масштабе.

Кто-нибудь из вас знает способ сделать это?

Ответ №1:

Tkinter поддерживает относительно неограниченное количество флажков, ограниченное в основном практическими факторами, такими как системная память и ограничения удобства использования.

Существует по крайней мере три метода создания контейнера с возможностью прокрутки для виджетов. Как холсты, так и текстовые виджеты поддерживают прокрутку, поэтому общепринятой практикой является использование одного из них для контейнера. Вы также можете выполнять хитрые трюки с помощью команды place, если вам нужно что-то сложное.

Использование canvas полезно, если вы хотите прокрутить рамку, содержащую нечто большее, чем просто вертикальный список объектов. Использование текстового виджета довольно удобно, если все, что вам нужно сделать, это создать единый вертикальный список.

Вот простой пример:

 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 достаточно фундаментальных строительных блоков, чтобы делать практически все, что вы можете себе представить.

Комментарии:

1. Спасибо за помощь. Я бы поддержал это, но, видимо, я пока недостаточно крут для повышающих голосов.

2. @Брайан Оукли — должен ли здесь быть указан мастер Checkbutton? У меня возникли проблемы с запуском этого, когда окно не было root (например, если вы попробуете это на Toplevel ())

3. @gnr: да, вы правы. Я обновил пример. Спасибо, что довели это до моего сведения.

4. Я хотел бы удалить содержимое текстового виджета, а затем повторно заполнить его, .delete, похоже, не удаляет эти окна. Как очистить текстовый виджет?