微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当查询两次时,style.map返回不同的值

如何解决当查询两次时,style.map返回不同的值

我正在研究style.map()函数。我一直在阅读Tkinter的Python GUI编程,他提到如果您调用style.map('Treeview')(或任何类型),它将返回当前状态映射。

现在,当我第一次运行它时,我得到这个:

s = ttk.Style()
s.map('Treeview')
{'foreground': [('disabled','SystemGrayText'),('!disabled','!selected','SystemWindowText'),('selected','SystemHighlightText')],'background': [('disabled','SystemButtonFace'),'SystemWindow'),'SystemHighlight')]}

这将返回具有预期状态和当前属性元组

现在,如果我要再次调用它:

s.map('Treeview')
{'foreground': ['disabled','SystemGrayText','!disabled !selected','SystemWindowText','selected','SystemHighlightText'],'background': ['disabled','SystemButtonFace','SystemWindow','SystemHighlight']}

现在,这只是状态/属性的单个列表。

我尝试浏览文档,但这样做有点迷失。我注意到的一件事是它调用一个 _splitdict 函数,该函数最初为每个属性返回键/值对。当我打印出键/值对时,它看起来像:

-foreground (<string object: 'disabled'>,<string object: '!disabled !selected'>,<string object: 'selected'>,'SystemHighlightText')
-background (<string object: 'disabled'>,'SystemHighlight')

第二次运行style.map()时,缺少尖括号:

-foreground ('disabled','SystemHighlightText')
-background ('disabled','SystemHighlight')

这是故意的,它应该如何工作?

解决方法

我不能告诉您是否是故意的,但是我可以证明第二个版本不起作用。我做了一个简单的自定义主题。在该主题中,我为ttk.Button创建了2种样式,每种样式都使用map返回的版本。第二个版本引发错误。

至于“它应该如何工作?”,下面还举例说明。基本上,这是一种为各种状态自定义颜色的方法。

import tkinter as tk
import tkinter.ttk as ttk
from dataclasses import dataclass,asdict
from collections import namedtuple

Theme_t = namedtuple('Theme_t','Base Primer Topcoat SubContrast Contrast Trim Hilight Accent Flat Gloss')
Theme = Theme_t('#bFbFbF','#AFAFAF','#C4C4C4','#666666','#888888','#777777','#444444','#313131','#2C2C2C','#CCCCCC')
#YOURTHEME = Theme_t('#','#','#')


@dataclass
class Button_dc:
    foreground:         str = Theme.Hilight
    background:         str = Theme.Topcoat 
    bordercolor:        str = Theme.Base 
    darkcolor:          str = Theme.Base
    lightcolor:         str = Theme.Base 
    highlightcolor:     str = Theme.Base
    relief:             str = 'flat'
    compound:           str = 'left'
    highlightthickness: int = 0
    shiftrelief:        int = 0
    width:              int = 0
    padding = [1,1,1] #l,t,r,b
    font:               str = "Consolas 12"
    anchor:             str = 'nswe'


class CustomTheme(ttk.Style):
    def __init__(self,basetheme='clam'):
        ttk.Style.__init__(self)
            
        self.theme_create('custom',basetheme,{
            'custom.TButton': { 
                #default 'normal' style
                'configure': asdict(Button_dc()),#style alterations for various button states
                'map': {
                    'background':  [('active',Theme.Primer),('pressed',Theme.Topcoat)],'foreground':  [('active',Theme.Hilight),Theme.Accent)],}
            },#this does not work
            #'cust.TButton': { 
            #    'configure': asdict(Button_dc()),#    'map': {
            #        'background':  ['active',Theme.Primer,'pressed',Theme.Topcoat],#        'foreground':  ['active',Theme.Hilight,Theme.Accent],#    }
            #}
        })
        
        self.theme_use('custom')
        
        
class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        CustomTheme()
        
        ttk.Button(self,text="Button 1",style='custom.TButton').grid()
        #ttk.Button(self,text="Button 2",style='cust.TButton').grid()


if "__main__" == __name__:
    app = App()
    app.title("Custom Theme Experiment And Example")
    app.geometry('800x600')
    app.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。