Tkinter - расширение фрейма после (интерактивного) добавления к нему элементов - PullRequest
0 голосов
/ 17 октября 2019

У меня есть следующий код:

from tkinter import *


DEF_CHANNELS = {'iris': (255, 0, 0), 'sclera': (0, 255, 0), 'pupil': (0, 0, 255)}


class GUI(Tk):
    def __init__(self, init_source, init_target, *args, **kw):
        super().__init__(*args, **kw)

        self.frame = Frame(self, height=400, width=500)
        self.frame.pack(fill=BOTH, expand=YES)

        self.channel_frame = Frame(self.frame, height=200, width=500, pady=16)
        self.channel_frame.grid(column=0, row=0, columnspan=2)

        self.channel_label = Label(self.channel_frame, text="Channel")
        self.channel_label.grid(column=0, row=0)
        self.colour_label = Label(self.channel_frame, text="Colour")
        self.colour_label.grid(column=1, row=0)
        self.channel_frames = []
        for channel, colour in DEF_CHANNELS.items():
            self.add_channel_frame(channel, colour)
        self.channel_button = Button(self.channel_frame, text="+", command=self.add_channel_frame)
        self.channel_button.grid(column=0, row=len(self.channel_frames) + 1)

    def add_channel_frame(self, def_channel="", def_colour=""):
        pair_frame = ChannelColourFrame(self.channel_frame, def_channel=def_channel, def_colour=def_colour, height=100, width=500, pady=2)
        pair_frame.grid(column=0, row=len(self.channel_frames) + 1, columnspan=2)
        self.channel_frames.append(pair_frame)


class ChannelColourFrame(Frame):
    def __init__(self, *args, def_channel="", def_colour="", **kw):
        super().__init__(*args, **kw)
        self.channel_txt = Entry(self, width=30)
        self.channel_txt.insert(END, def_channel)
        self.channel_txt.grid(column=0, row=0)
        self.colour_txt = Entry(self, width=30)
        self.colour_txt.insert(END, def_colour)
        self.colour_txt.grid(column=1, row=0)
        self.color_picker_button = Button(self, text="\u2712")
        self.color_picker_button.grid(column=2, row=0)
        self.remove_button = Button(self, text="-", command=self.remove)
        self.remove_button.grid(column=3, row=0)

    def remove(self):
        self.master.master.master.channel_frames.remove(self)
        self.destroy()

gui = GUI('', '')
gui.mainloop()

Идея состоит в том, чтобы иметь Frame, который начинается с 3 пар текста по умолчанию Entry, которые пользователь может произвольно удалить / добавить. По большей части это работает хорошо, но с одной большой проблемой. Рамка (self.channel_frame) никогда не расширяется за ее первоначальную высоту, что вызывает проблемы, когда на ней появляется больше, чем исходные 3 Entry пары.

Как сделать, чтобы все Frame соответствовало Entry пар при каждом удалении / добавлении?

В качестве дополнительного вопроса \u2712 отображается в виде прямоугольника на моей кнопке, но это должен быть черный символ пера (✒). Почему символ не отображается, несмотря на то, что он является частью юникода?

1 Ответ

1 голос
/ 17 октября 2019

Вы не создаете никаких новых строк, поэтому они не будут расти. В начале вы создаете три канальных кадра, и они помещаются в строки 0, 1 и 2. Затем вы добавляете кнопку «+» в строку 4.

Когда вы нажимаете кнопку «+»,это добавляет новую строку в len(self.channel_frames) + 1. Так как len(self.channel_frames) равен 3, он добавляет новый кадр в строке 4, которая находится сверху кнопки «+». Таким образом, вы не добавляете новую строку.

Если вы перемещаете кнопку «+» из рамки или перемещаете ее вниз каждый раз, когда добавляете новую строку, ваш код работает нормально.

Например:

def add_channel_frame(self, def_channel="", def_colour=""):
    pair_frame = ChannelColourFrame(self.channel_frame, def_channel=def_channel, def_colour=def_colour, height=100, width=500, pady=2)
    pair_frame.grid(column=0, row=len(self.channel_frames) + 1, columnspan=2)
    self.channel_frames.append(pair_frame)
    self.channel_button.grid(column=0, row=len(self.channel_frames)+1)

В качестве дополнительного вопроса \ u2712 отображается в виде прямоугольника на моей кнопке, но это должен быть черный символ пера (✒). Почему символ не отображается, несмотря на то, что он является частью юникода?

Возможно, потому что используемый вами шрифт не имеет этого символа. Попробуйте использовать другой шрифт.

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