python - 我可以在一个 Tkinter (tk.Tk) 根窗口中使用两个不同的 TTK 主题吗?

标签 python tkinter

这个问题涉及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()

但是代码加载了:

  1. 我希望第一个 Button 的前景为蓝色,第二个 Button 的前景为红色,并使用两个单独的主题。

  2. 相反,两个按钮都有红色前景,并且都应用相同的主题。

是否可以在一个 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()

一切都描述得很好herethere .

关于python - 我可以在一个 Tkinter (tk.Tk) 根窗口中使用两个不同的 TTK 主题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44420412/

相关文章:

python - 使用旧值和新值列表替换 numpy 数组中的元素

Python Tkinter 窗口图标不会导入新图标

python - 在特定条件下播放winsound

python - 单击时 OptionMenu 不会显示第一个选项 (Tkinter)

python - 是否可以输入提示 lambda 函数?

python - 如何解析纯文本表格? (多行)

Python ctypes加载错误: undefined symbol

Tkinter 按钮信息

python - Tkinter打开文件窗口,文件扩展名区分大小写

python - scikit learn 中不能使用超过 10 个内核