如何解决当查询两次时,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 举报,一经查实,本站将立刻删除。