在python中定义tkinter frame的子类,让用户选择显示内容的哪一部分

2024-10-02 10:25:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Python(使用Tkinter)创建一个类,我可以传递多个小部件来存储它们;在这些小部件中,类在一个框架中应该始终只显示一个,当我按下按钮时,应该打开一个下拉菜单,从中我可以选择框架应该继续显示的小部件之一。你知道吗

我对这个想法的实际实现是非常好的,但只有当我把这些帧中的一个放到一个窗口中时。一旦我定义了不止一个,他们就开始表现得很奇怪。。。你知道吗

一个例子:

我使用这个类并给它三个Tkinter标签作为输入。其中一个标签显示文本“Label 1”,第二个标签显示文本“Label 2”,第三个标签显示文本“Label 3”。 我把整件东西都装进我的标签里,效果很好。这就是它的样子: image of the widget

当我点击“+”按钮时,它会像这样展开: image of the widget with all Labels displayed

当我点击“x”按钮时,它会回到初始状态。但是,当我单击“标签2”旁边的单选按钮时,它会返回到初始状态,但现在显示的是“标签2”而不是“标签1”: widget now displaying label 2

到目前为止,它做的正是我想让它做的:我可以使用一个小部件在多个子部件之间切换,而这些小部件保持在一个小部件中。你知道吗

然而,当我尝试将这些东西中的多个放到一个窗口中时,问题就开始了。我试着把一个放进包含“标签1”-“标签3”,一个包含“标签4”-“标签6”和一个包含“标签7”-“标签9”的窗口。问题是,当我按下其中一个的“+”按钮时,所有的标签都开始显示它们的全部内容(所以突然,我打开了“标签1”-“标签9”,而不仅仅是“标签1”-“标签3”)。只要它们是闭合的,就有点像这样:weird formatted stuff 这就是我点击“+”按钮时的样子:all contents wrapped out

我认为所有这些帧同时展开的原因是,出于某种原因,按钮(“+”和“x”按钮)一次调用所有帧中的指定函数,而不仅仅是它所在的帧中的函数。我试图用lambda来解决这个问题,同时指定按钮应该调用的函数,但它仍然不起作用。你知道吗

我不是一个以英语为母语的人,如果我的解释有点厌倦了,我很抱歉,而且,我从边做边学和互联网上学到了所有的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中使用类的想法是完全错误的吗?你知道吗


Tags: textselfadd部件column标签按钮multi

热门问题