这个问题涉及Python和Tkinter。
我想同时使用两个不同的 ttk 主题,例如一个 Tkinter 窗口中的“clam”和“vista”。所以我写了这个:
import tkinter as tk
import tkinter.ttk as ttk
class GUI(tk.Tk):
def __init__(self):
super().__init__()
Button_v1()
Button_v2()
class Button_v1(ttk.Button):
def __init__(self, default_text="Test"):
super().__init__(text=default_text)
s = ttk.Style()
s.theme_use('clam')
s.configure(self.winfo_class(), foreground='blue')
self.pack()
class Button_v2(ttk.Button):
def __init__(self, default_text="Test2"):
super().__init__(text=default_text)
s2 = ttk.Style()
s2.theme_use('vista')
s2.configure(self.winfo_class(), foreground='red')
self.pack()
GUI().mainloop()
但是代码加载了:
我希望第一个 Button 的前景为蓝色,第二个 Button 的前景为红色,并使用两个单独的主题。
相反,两个按钮都有红色前景,并且都应用相同的主题。
是否可以在一个 Tkinter 程序中使用两个单独的 ttk 主题?
最佳答案
不,这是不可能的,因为 theme
在此背景下具有全局意义。您可以代表theme
作为小部件的一组样式( for widget layout elements, actually ),您可以更改样式和/或创建新的样式,但一次不能使用多个主题,因为小部件的布局严重依赖于它。
当您调用theme_use('theme_name')
时tkinter 重建所有小部件的布局和 redraws your entire application ,您可以轻松检查这一点,感谢 <<ThemeChanged>>
虚拟事件。
这是一个片段。您将看到由每个按钮和 root 本人引起的三个打印。
try:
import tkinter as tk
import tkinter.ttk as ttk
except ImportError:
import Tkinter as tk
import ttk
class GUI(tk.Tk):
def __init__(self):
super().__init__()
self.bind('<<ThemeChanged>>', lambda event: print('theme changed in root and across all widgets!'))
Button_v1()
Button_v2()
class Button_v1(ttk.Button):
def __init__(self, default_text="Test"):
super().__init__(text=default_text)
s = ttk.Style()
s.theme_use('clam')
s.configure(self.winfo_class(), foreground='blue')
self.pack()
class Button_v2(ttk.Button):
def __init__(self, default_text="Test2"):
super().__init__(text=default_text)
s2 = ttk.Style()
s2.theme_use('vista')
s2.configure(self.winfo_class(), foreground='red')
self.pack()
GUI().mainloop()
如果每个按钮需要不同的前景 - then create a new style
对于每个人并使用 style
参数:
这是另一个片段:
try:
import tkinter as tk
import tkinter.ttk as ttk
except ImportError:
import Tkinter as tk
import ttk
class GUI(tk.Tk):
def __init__(self):
super().__init__()
s = ttk.Style()
s.configure('blue.TButton', foreground='blue')
s.configure('red.TButton', foreground='red')
Button_v1()
Button_v2()
class Button_v1(ttk.Button):
def __init__(self, default_text="Test"):
super().__init__(text=default_text, style='blue.TButton')
self.pack()
class Button_v2(ttk.Button):
def __init__(self, default_text="Test2"):
super().__init__(text=default_text, style='red.TButton')
self.pack()
GUI().mainloop()
关于python - 我可以在一个 Tkinter (tk.Tk) 根窗口中使用两个不同的 TTK 主题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44420412/