Как создать LabelFrame с полосой прокрутки в Tkinter? - PullRequest
3 голосов
/ 19 августа 2011

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

У меня есть три объекта, произошедших от LabelFrame, в объекте, произошедшем от Frame. Один из потомков LabelFrame - это два столбца соответствующих объектов Label и Entry.

freq_frame example

Проблема в том, что существует разное количество пар Label и Entry, и их может быть больше, чем умещается на экране. Мне нужен способ сделать полосу прокрутки для этого LabelFrame, чтобы все помещалось на экране. Я пробовал разные способы создания объекта Scrollbar, но, похоже, ничего не работает. Как я могу привязать полосу прокрутки к этому кадру?

Кроме того, мне нужно иметь возможность обновлять или перезагружать этот LabelFrame при вызове метода load_message(), но он просто отображает новые пары поверх старых (поэтому, когда в новом наборе меньше пар, старый набор все еще виден внизу). Я пытался использовать grid_forget(), но либо ничего не меняется, либо весь кадр не отображается. Как я могу забыть этот дисплей, а затем снова его отобразить?

Вот код для этого класса:

class freq_frame(LabelFrame):
    def __init__(self, master = None, text = 'Substitutions'):
        LabelFrame.__init__(self, master, text = text)
        self.grid()
    def load_message(self):
        self.frequency = get_freq(message)
        self.create_widgets()
    def create_widgets(self):
        self.label_list = [Label(self, text = get_label(char, self.frequency[char]), justify = LEFT) for char in self.frequency.keys()]
        self.entry_list = [Entry(self, width = 1) for char in self.frequency.keys()]
        for n in range(len(self.label_list)):
            self.label_list[n].grid(column = 0, row = n)
        for n in range(len(self.entry_list)):
            self.entry_list[n].grid(column = 1, row = n)

Если кто-нибудь может помочь с любой из этих проблем, я был бы признателен.

Кроме того, этот вопрос может показаться немного тонким, но я не знаю, что добавить. Не стесняйтесь спрашивать дополнительную информацию (но будьте конкретны).

Спасибо!

1 Ответ

3 голосов
/ 19 августа 2011

Метки не поддерживают прокрутку. Таким образом, краткий ответ на ваш вопрос «вы не можете». Это кажется очевидным, но если документация для виджета не говорит о том, что он поддерживает прокрутку, он не поддерживает прокрутку.

Однако есть простое решение. Сначала добавьте холст в качестве дочернего элемента в рамку метки и упакуйте его так, чтобы он заполнил рамку метки. Прикрепите полосы прокрутки к холсту и добавьте их также в рамку метки. Затем вставьте рамку в холст, добавьте свои виджеты к этой внутренней рамке и отрегулируйте область прокрутки холста в соответствии с размером рамки после добавления всех внутренних меток и записей.

Звучит сложно, но действительно очень просто.

Что касается воссоздания виджетов при вызове load_message, вызов grid_forget только удаляет их из поля зрения, но фактически не уничтожает виджеты. Со временем вы потенциально можете получить сотни невидимых виджетов, что почти наверняка не то, что вы хотите.

Вместо этого вы хотите сначала уничтожить все существующие виджеты. Это довольно легко, если все они принадлежат одному и тому же родителю, поскольку вы можете попросить у родителя список всех его потомков. Просто переберите этот список, чтобы удалить каждого потомка, а затем добавьте новых. Еще более простое решение - уничтожить и воссоздать тот внутренний фрейм, который содержит метки и записи. При удалении виджета все дочерние виджеты автоматически уничтожаются. Итак, удалите этот внутренний фрейм, создайте новый и снова добавьте свои метки и записи.

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