【发布时间】:2018-01-24 16:39:45
【问题描述】:
我有以下基于此问题的代码:Expandable and contracting frame in Tkinter
from tkinter import *
from tkinter import ttk
class Example:
def __init__(self, root):
list_1 = ['item_1', 'item_2']
list_2 = ['a', 'b', 'c']
for item in list_1 :
frame = Frame(root, width=500, height=22)
frame.pack(side=TOP, anchor=W)
frame.propagate(0)
Label(frame, text=item).pack(side=LEFT, anchor=W)
entry = Entry(frame, width=11)
entry.pack(side=RIGHT, pady=2, anchor=E)
var = IntVar()
var.set(0)
sub_frame = Frame(root, relief="sunken", width=400, height=22, borderwidth=1)
toggle_btn = ttk.Checkbutton(frame, width=2, text='+', command=lambda: self.toggle(var, toggle_btn, sub_frame),
variable=var, style='Toolbutton')
toggle_btn.pack(side=LEFT, anchor=E)
for item in list_2:
Label(sub_frame, text=item).pack(side=TOP)
def toggle(self, show, toggle_button, sub_frame):
if bool(show.get()):
sub_frame.pack(fill="x", expand=1)
sub_frame.propagate(1)
toggle_button.configure(text='-')
else:
sub_frame.forget()
toggle_button.configure(text='+')
def main():
root = Tk()
open = Example(root)
root.mainloop()
if __name__ == '__main__':
main()
我想在这里从 list_1 创建两个可扩展框架,并用 list_2 中的标签填充每个框架。这两个框架应该可以展开和折叠以显示和隐藏 list_2 中的项目。
第二帧正常运行,但第一帧不能正常运行,因为它被第二帧覆盖了。
所以代码最初给你的是这个:
如果您单击 item_1 旁边的“+”,则不会发生任何事情。
如果您点击 item_2 旁边的“+”,就会发生这种情况。
通过单击 item_1 旁边的“+”,我希望 sub_frame 显示在 item_1 下方(在 item_1 和 item_2 之间),就像单击 item_2 旁边的“+”显示它下方的 sub_frame 一样。
关于如何让两个框架都能正常工作的任何帮助?我已经阅读了有关将创建的帧存储在列表中的信息,但是我无法让它为我工作。
非常感谢
【问题讨论】:
-
我已经更新了代码,已经完成了。
-
谢谢,但您遇到的问题仍然不是minimal reproducible example。您可以进一步缩小范围。
-
谢谢,我已经更新了代码