我正在使用Tkinter和ttk在Python中创建GUI。我想为用户可以配置两个独立的UI主题。这些选项之一是使用以下代码调用的vista主题:

from tkinter import Tk
from tkinter.ttk import Style

root = Tk()
root.style = Style()
root.style.theme_use('vista')


另一个选项是black主题,它使用以下命令调用:

from tkinter import Tk
from ttkthemes import ThemedStyle

root = Tk()
root.style = ThemedStyle()
root.style.theme_use('black')


我遇到了一些问题,因为我希望用户能够在程序运行时切换主题。分别应用这些主题(即应用主题,关闭程序并在启动时应用其他主题)效果很好。从root.style = ThemedStyle()主题切换到root.style = Style()主题时,在代码的稍后位置依次调用vistablack时,我开始遇到问题:

    if self.ui_theme == 'Dark':
        self.root.style = ThemedStyle()
        theme = 'black'
        self.root.tk_setPalette(background='#2f3136')
    else:
        self.root.style = Style()
        theme = 'vista'
        self.root.tk_setPalette(background='#f0f0f0')
    self.root.style.theme_use(theme)


最重要的是,从black转到vista然后再次回到black会导致以下错误:

error reading package index file C:/Python34/Lib/site-packages/ttkthemes/themes/pkgIndex.tcl: Theme plastik already exists


我假设在同一实例中两次调用self.root.style = ThemedStyle()时会发生这种情况。

有没有一种解决此问题的方法,而不必在应用新主题时强制用户重新启动应用程序?提前致谢。

最佳答案

在开始时仅创建一次Style()ThemeStyle()并分配给变量。

然后将变量分配给root.style

from tkinter import Tk
from tkinter.ttk import Style, Button
from ttkthemes import ThemedStyle

def style_1():
    print('winxpblue')
    root.style = s
    root.style.theme_use('winxpblue')

def style_2():
    print('black')
    root.style = t
    root.style.theme_use('black')

root = Tk()

s = Style()
t = ThemedStyle()

#print(s.theme_names())
#print(t.theme_names())

Button(root, text="winxpblue", command=style_1).pack()
Button(root, text="black", command=style_2).pack()

root.mainloop()




编辑:在Linux上测试后,我看到我不需要Style()。我在ThemedStyle()中有所有主题。也许在Windows / MacOS上,它的工作方式相同。

import tkinter as tk
from tkinter import ttk
import ttkthemes

root = tk.Tk()

root.style = ttkthemes.ThemedStyle()

for i, name in enumerate(sorted(root.style.theme_names())):
    b = ttk.Button(root, text=name, command=lambda name=name:root.style.theme_use(name))
    b.pack(fill='x')

root.mainloop()


python - Style()和ThemedStyle()之间的冲突-LMLPHP

python - Style()和ThemedStyle()之间的冲突-LMLPHP

python - Style()和ThemedStyle()之间的冲突-LMLPHP

python - Style()和ThemedStyle()之间的冲突-LMLPHP

python - Style()和ThemedStyle()之间的冲突-LMLPHP

关于python - Style()和ThemedStyle()之间的冲突,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47499069/

10-09 08:03