Переменный размер списка флажков в Tkinter? - PullRequest
9 голосов
/ 02 мая 2011

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

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

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

1 Ответ

15 голосов
/ 03 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...