Борьба с определением подкласса фрейма tkinter (в python), который должен позволить пользователю выбирать, какую часть контента отображать - PullRequest
0 голосов
/ 19 мая 2018

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

Моя настоящая реализация этой идеи работает довольно хорошо, но только когда я помещаю только один из этих фреймов в окно.Как только я определяю более одного, они начинают странно себя вести ...

Один пример :

Я использовал класс и дал ему три метки Tkinter каквход.Одна из этих меток отображает текст «Метка 1», вторая - «Метка 2», а третья - «Метка 3».Затем я .pack () все это в мой лейбл, и он работает нормально.Вот как это выглядит: изображение виджета

Когда я нажимаю кнопку «+», оно разворачивается следующим образом: изображение виджета со всеми отображаемыми метками

И когда я нажимаю кнопку «х», она возвращается в исходное состояние.Когда я, однако, нажимаю переключатель рядом с надписью «Label 2», он возвращается в исходное состояние, но теперь отображает «Label 2» вместо «Label 1»: виджет теперь отображает метку 2

Пока что он делает именно то, что мне нужно: я могу переключаться между несколькими подвиджетами, используя один виджет, в котором они содержатся.

Однако проблемы начинаются, как толькоЯ пытаюсь поместить несколько таких вещей в одно окно.Я попытался поместить одно в окно, содержащее «Метка 1» - «Метка 3», одно, содержащее «Метка 4» - «Метка 6» и одно, содержащее «Метка 7» - «Метка 9».Проблема в том, что когда я нажимаю кнопку «+» на одной из них, все они начинают показывать весь свой контент (так внезапно у меня появляется «Метка 1» - «Метка 9», а не только «Метка 1»).- «Метка 3»).Пока они закрыты, они выглядят примерно так: странные отформатированные вещи И вот так это выглядит, когда я нажимаю кнопку "+" - все содержимое свернуто

Я думаю, что причина их распаковки заключается в том, что по какой-то причине кнопки (кнопки «+» и «x») вызывают указанную функцию сразу во ВСЕХ фреймов, а не тольков той, в которой он находится. Я попытался исправить это с помощью лямбды, указав функцию, которую должны вызывать кнопки, но она все еще не работает.

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

class MultiInput(Frame):
"""use .add(Widged)-Method to add widged!"""
subs = []
adders = []
index = 0
def __init__(self, parent):
    Frame.__init__(self, parent)
    self.indexVar = IntVar()
    self.indexVar.set(0)
    self.dropdown = Button(self, text="+", command=self.drop)
    self.dropdown.grid(row=0, column=0)
    self.dropup = Button(self, text="x", command=self.undrop)

def drop(self):
    num = -1
    self.dropdown.grid_forget()
    self.dropup.grid(row=0, column=0)
    for i in range(0, len(self.subs)):
        num += 1
        if i != self.index:
            self.subs[i].grid(column=1, row=num+1)
            self.adders[i].grid(column=0, row=num+1)

def undrop(self):
    for i in range(0, len(self.subs)):
        self.subs[i].grid_forget()
        self.adders[i].grid_forget()
    self.subs[self.index].grid(row=0, column=1)
    self.dropup.grid_forget()
    self.dropdown.grid(row=0, column=0)


def add(self, Widged):
    if len(self.subs) == 0:
        self.subs.append(Widged)
        self.adders.append(Radiobutton(self,
            variable = self.indexVar, 
            command = self.change,
            value = 0))
        self.change()
    else:
        self.subs.append(Widged)
        self.adders.append(Radiobutton(self,
            variable = self.indexVar, 
            command = self.change,
            value = len(self.subs) - 1))

def change(self):
    self.index = self.indexVar.get()
    self.undrop()

, и вот как я назвал это в моем первом примере, где он отлично работает:

root = Tk()

multi = MultiInput(root)
multi.add(Label(multi, text="Label 1"))
multi.add(Label(multi, text="Label 2"))
multi.add(Label(multi, text="Label 3"))
multi.pack()

Как толькоЯ добавляю это в конец кода (чтобы добавить только один MultiInput), он начинает делать вещи из моего второго примера:

multi2 = MultiInput(root)
multi2.add(Label(multi2, text="Label 4"))
multi2.add(Label(multi2, text="Label 5"))
multi2.add(Label(multi2, text="Label 6"))
multi2.pack()

multi3 = MultiInput(root)
multi3.add(Label(multi3, text="Label 7"))
multi3.add(Label(multi3, text="Label 8"))
multi3.add(Label(multi3, text="Label 9"))
multi3.pack()

Итак, вот мой вопрос: Как я могу получить кнопки длявызвать функцию, которую они должны вызвать, чтобы они использовали ее только на объекте, на котором они должны ее использовать?Или у меня совершенно неправильное представление об использовании классов в Python?

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