Я пытаюсь создать класс на 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?