使用 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]
。切换到灯光模式也是如此。
希望对您有所帮助!
我想做一个有树状视图的程序,还可以随时在深色模式和浅色模式之间切换。我正在为不同的主题使用 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]
。切换到灯光模式也是如此。
希望对您有所帮助!