繁体   English   中英

"TreeView 宽度意外更改"

[英]TreeView width unexpectedly changes

我有一个包含 Treeview 和 Frame-embedded-in-a-Canvas 的框架。 Treeview 在一个'#0'<\/code>列中显示来自 MongoDB 的文档,每次用户选择我从文档字段生成的任何文档时,Frame-embedded-in-a-Canvas 中的 Checkbuttons 列表。

我遇到的问题是 Treeview 宽度不是恒定的,但我无法理解它为什么会发生变化以及它何时发生。 每次生成新的 Checkbuttons 列表后,我的 Treeview 宽度都会增长 30 像素,而无需考虑 Treeview 和 Frame-embedded-in-a-Canvas 预计将分别位于父级网格列 0 和 1 中且权重为零的事实.

这是 GIF 的链接<\/a>,展示了它的外观。 在下面你可以找到我关于这些小部件的代码。

请告诉我在哪里寻找这个问题的原因。

def treeview_reload():
    dt_tv.delete(*dt_tv.get_children())
    dt_tv.insert('', 'end', '_b_', text='biomes')
    dt_tv.insert('', 'end', '_z_', text='zones')
    dt_tv.insert('', 'end', '_p_', text='points')
    dt_tv.insert('', 'end', '_m_', text='biomaterials')
    dt_tv.insert('', 'end', '_c_', text='characters')

def tv_sel_handler(event):
    try:
        sel_iid = event.widget.selection()[0]
    except IndexError:
        sel_iid = ''
    try:
        generate_model(MAP[sel_iid])
    except KeyError:
        pass

def generate_model(document, new_list=True, row=0, indent=0):
    if new_list:
        for c in list(dt_model.children.values()):
            c.destroy()
    i = row
    for field in document.keys():
        if type(document[field]) is list:
            cb = ttk.Label(dt_model, text=indent*2*' '+field)
            cb.grid(row=i, column=0, sticky='w', padx=30, pady=4)
            cb['font'] = ("Noto Mono", 13)
            pass
        elif type(document[field]) is dict:
            cb = ttk.Checkbutton(dt_model, text=indent*2*' '+field)
            cb.grid(row=i, column=0, sticky='w')
            ttk.Style().configure('Mono.TCheckbutton', font=("Noto Mono", 13))
            cb['style'] = 'Mono.TCheckbutton'
            i = generate_model(document[field], False, i+1, indent+1)
        else:
            cb = ttk.Checkbutton(dt_model, text=indent*2*' '+field)
            cb.grid(row=i, column=0, sticky='w')
            ttk.Style().configure('Mono.TCheckbutton', font=("Noto Mono", 13))
            cb['style'] = 'Mono.TCheckbutton'
        i += 1
    if i > 17:
        vsb = ttk.Scrollbar(pdb_data, orient=VERTICAL, command=dt_canv.yview)
        dt_canv['yscrollcommand'] = vsb.set
        vsb.grid(row=0, column=2, sticky='nsw')
        dt_model.bind('<Configure>',
                      lambda event, canvas=dt_canv:
                            canvas.configure(scrollregion=canvas.bbox("all")))
        dt_model.bind('<Enter>',
                      lambda event:
                            dt_canv.bind_all("<MouseWheel>",
                                             lambda event:
                                                    dt_canv.yview_scroll(int(-1*(event.delta/120)), "units")))
        dt_model.bind('<Leave>',
                      lambda event: dt_canv.unbind_all("<MouseWheel>"))
    return i


# ...
# ___ frame for the data
pdb_data = ttk.Frame(page_db, width=1250, height=450)
pdb_data.grid(row=6, column=0, columnspan=2, sticky='nsew', pady=24)
# ____ categorized documents list
dt_tv = ttk.Treeview(pdb_data, selectmode='browse', show=('tree',))
dt_tv.column('#0', width=250)
dt_tv.grid(row=0, column=0, sticky='nsw')
dt_tv.bind('<<TreeviewSelect>>', tv_sel_handler)
treeview_reload()
# ____ auxiliary canvas
dt_canv = Canvas(pdb_data, borderwidth=0, width=300)
dt_canv.grid(row=0, column=1, sticky='nsw', padx=10)
# _____ frame-embedded-in-a-canvas for checkbuttons list
dt_model = ttk.Frame(dt_canv, width=400, height=450)
dt_canv.create_window((0,0), window=dt_model, anchor='nw')

pdb_data.rowconfigure(0, weight=1)

root.mainloop()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM