首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >tkinter treeview在使用The主题切换主题时不断扩展

tkinter treeview在使用The主题切换主题时不断扩展
EN

Stack Overflow用户
提问于 2021-07-21 16:21:52
回答 1查看 67关注 0票数 0

我想做一个程序,有一个树视图,也有能力在黑暗模式和灯光模式之间随时切换。对于不同的主题,我使用了the主题。

当主题切换时,我希望treeview不会扩展(就像其他小部件保持相同的大小一样)。

但是,每次切换主题时,树视图都会扩展一点。为什么会发生这种情况,以及如何修复这种意外的结果?

我尝试使用grid_forget()来忘记树视图,并在每次切换主题时重新对其进行网格划分,但它仍然会产生相同的结果。帧没有区别。我试着用谷歌搜索,但没有得到我的问题的结果。

它扩展的示例:

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-07 14:08:07

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

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

代码语言:javascript
复制
valuesList = []

接下来,每当在treeview中插入一行时,添加以下内容:

代码语言:javascript
复制
global valuesList
valuesList.append(myTreeview.item(len(myTreeview.get_children()),option='values'))

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

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

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

用于切换主题的函数:

代码语言:javascript
复制
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示例将如下所示:

代码语言:javascript
复制
[(value1, value2, value3), (value1, value2, value3)] # a list of tuples
# row 1 values ^              row 2 values ^

因此tupleOfValues将会是:

代码语言:javascript
复制
(value1, value2, value3)

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

我希望这对你有帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68466237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档