ttk создание и использование пользовательской темы

Я пытаюсь включить настраиваемый выбор темы в свою программу. Я имел в виду это руководство: http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/ttk-themes.html, но я потерялся.

Вот пример кода, который я использовал, чтобы попытаться понять это. Я создал новую тему «Тень» правильно, но со следующей частью я борюсь. Давайте не будем усложнять и скажем, что в теме «Тень» я хотел бы изменить фон рамки на черный, фон кнопки на темно-синий, а передний план кнопки на белый.

Как бы я это сделал?

from tkinter import *
from tkinter import ttk

class Main:
    def __init__(self, master):
        self.master = master
        self.main_button = ttk.Button(self.master, text = 'New', command = self.new_window)
        self.main_button.grid()

    def new_window(self):
        pop_up = Top(self.master)

class Top:
    def __init__(self, master):
        pop_up = self.pop_up = Toplevel(master)
        self.pop_up_frame = ttk.Frame(pop_up, height = 100, width = 100)
        self.pop_up_frame.grid(sticky = E+W+S+N)
        self.s = ttk.Style()
        self.s.theme_create('shadow', parent = 'default')

        print(self.s.theme_names())

        self.c1_button = ttk.Button(pop_up, text = 'Default', command = self.get_default)
        self.c2_button = ttk.Button(pop_up, text = 'Shadow', command = self.get_shadow)

        self.c1_button.grid()
        self.c2_button.grid()    

    def get_default(self):
        self.s.theme_use('default')

    def get_shadow(self):
        self.s.theme_use('shadow')


root = Tk()

app = Main(root)

root.mainloop()

Как всегда, спасибо!


person Gregory6106    schedule 16.02.2016    source источник


Ответы (2)


Я делал это слишком сложным.

Вот решение для тех, кто пытается понять это:

from tkinter import *
from tkinter import ttk

class Main:
    def __init__(self, master):
        self.master = master
        self.main_button = ttk.Button(self.master, text = 'New', command = self.new_window)
        self.main_button.grid()

    def new_window(self):
        pop_up = Top(self.master)

class Top:
    def __init__(self, master):
        pop_up = self.pop_up = Toplevel(master)
        self.pop_up_frame = ttk.Frame(pop_up, height = 100, width = 100)
        self.pop_up_frame.grid(sticky = E+W+S+N)
        self.s = ttk.Style()
        self.s.theme_create('shadow', parent = 'default')

        print(self.s.theme_names())

        self.c1_button = ttk.Button(pop_up, text = 'Default', command = self.get_default)
        self.c2_button = ttk.Button(pop_up, text = 'Vista', command = self.get_shadow)

        self.c1_button.grid()
        self.c2_button.grid()

    def get_default(self):
        self.s.theme_use('default')

    def get_shadow(self):
        self.s.theme_use('vista')
        self.s.configure('TButton', foreground = 'white', background = 'blue')
        self.s.configure('TFrame', background = 'black')



root = Tk()

app = Main(root)

root.mainloop()
person Gregory6106    schedule 16.02.2016

Чтобы упростить ответ Gregory6106, вы можете изменить текущую тему темы, используя .configure().

from tkinter import *
from tkinter import ttk

class MainPage(ttk.Frame):
    def __init__(self, master):
        ttk.Frame.__init__(self, master)
        self.main_label = ttk.Label(self, text="Pointless Text")
        self.main_button = ttk.Button(self, text="Pointless Button")
        self.main_label.pack(padx=5, pady=5)
        self.main_button.pack(padx=5, pady=5)

        # Configure custom theme
        self.s = ttk.Style()
        self.s.configure('TLabel', foreground='red', background='grey')
        self.s.configure('TButton', foreground='white', background='blue')
        self.s.configure('TFrame', background='black')


root = Tk()
app_frame = MainPage(root)
app_frame.pack()
root.mainloop()

Пример тематической страницы в tkinter.ttk

Примечание. Это решение работает путем настройки уже существующей темы, а не создания новой. В результате это может не сработать, если вы планируете вернуться к исходной теме во время выполнения.

person Stevoisiak    schedule 18.04.2018