使用 ttkthemes 切换主题时,tkinter 树视图不断扩展

The tkinter treeview keeps expanding when switching themes using ttkthemes

我想做一个有树状视图的程序,还可以随时在深色模式和浅色模式之间切换。我正在为不同的主题使用 ttkthemes。

我希望树视图在切换主题时不会扩展(就像其他小部件保持相同大小一样)。

但是,每次切换主题时,树视图都会扩展一点。为什么会发生这种情况,我该如何解决这个意外结果?

我试过使用 grid_forget() 忘记树视图并在每次切换主题时重新重新网格化它,但它仍然产生相同的结果。框架没有区别。尝试使用谷歌搜索但没有收到解决我的问题的结果。

扩展示例:

import tkinter as tk
from tkinter import ttk
from ttkthemes import ThemedTk

root = ThemedTk(theme="arc")

myTreeview = ttk.Treeview()
myTreeview.grid(row=0,column=0)

def switchToDark():
    root.configure(theme="equilux")

    #The method i tried
    #myTreeview.grid_forget()
    #myTreeview.grid(row=0,column=0)

darkButton = ttk.Button(text="Dark Mode",command=switchToDark)
darkButton.grid(row=1,column=0)

def switchToLight():
    root.configure(theme="arc")

    #myTreeview.grid_forget()
    #myTreeview.grid(row=0,column=0)

lightButton = ttk.Button(text="Light Mode",command=switchToLight)
lightButton.grid(row=0,column=1)

root.mainloop()

我自己的解决方案确实有效,如果有人找到不同的解决方案,请分享! (注意:此解决方案目前仅适用于使用数字作为其 IID 的行)

首先,将valuesList初始化为一个全局变量:

valuesList = []

接下来,每当向树视图中插入一行时,添加:

global valuesList
valuesList.append(myTreeview.item(len(myTreeview.get_children()),option='values'))

基本上,myTreeview.item(len(myTreeview.get_children()),option='values') 获取每行值的元组(不包括文本和 IID)。

get_children() 方法 returns 父项或根项的 IID 列表。

len(myTreeview.get_children())+1,因为这就是我为每一行设置 IID 的方式(例如,如果 len(myTreeview.get_children()) == 2,这意味着树视图当前有两行。添加行的 IID 将为 3 .

主题切换功能:

def switchToDark():
    root.configure("equilux") # change the theme

    myTreeview.destroy() # destroy and reinitialise the treeview
    myTreeview = ttk.Treeview()
    myTreeview.grid(row=0,column=0)
    # add necessary columns and headings here

    idNumber = len(databaseTree.get_children())
        
        for tupleOfValues in valuesList: # iterate through the list of tuples
            idNumber += 1
            databaseTree.insert(parent='',index='end',iid=idNumber,text=idNumber,values=(tupleOfValues[0],tupleOfValues[1],tupleOfValues[2],tupleOfValues[3],tupleOfValues[4]))
            # the above is reinserting the original values one by one

此时的 valuesList 示例如下所示:

[(value1, value2, value3), (value1, value2, value3)] # a list of tuples
# row 1 values ^              row 2 values ^

因此 tupleOfValues 将是:

(value1, value2, value3)

根据您的树视图值的数量,您可能需要更多或更少的 tupleOfValues[i]。因为我有 5 个值,所以我上升到 tupleOfValues[4]。切换到灯光模式也是如此。

希望对您有所帮助!