Ttkthemes не отображает тему всего окна при применении к корневому каталогу

Ни одна из тем, которые я пробовал в ttkthemes, не будет оформлять все окно. Я применяю тему к корню/себе, и это будет только тема текста/кнопок.

Скриншоты:

Я ожидал, что окно заполнится полностью, может быть, я чего-то упускаю?

Код:

class Window(ThemedTk):
    def __init__(self):
        ThemedTk.__init__(self)

        self.tk.call('lappend', 'auto_path', 'correct_path_to_theme')
        self.tk.call('package', 'require', 'awdark')
        s = ttk.Style()
        s.theme_use("awdark")

        # frame all content will sit inside of
        mainframe = ttk.Frame(self, width=self.width, height=self.height)
        mainframe.pack(side = "top", fill = "both", expand=True)


        self.frames = {}

        for F in (
            HomePage,
        ):
            frame = F(mainframe, self)


            self.frames[F] = frame
            frame.grid(row=0, column=0, sticky = "nsew")

        self.show_frame(HomePage)

    def show_frame(self, fr):
        frame = self.frames[fr]
        frame.tkraise()


# Home Page of the app
class HomePage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)

        

        # header label
        header_label = ttk.Label(
            self, text = "Post Visual Inspection Board Capture Program", justify = "center"
        )
        header_label.pack()

        # will start the new capture process
        new_capture_buton = ttk.Button(
            self,
            text = "New Capture",
            command=lambda: controller.show_frame(InstructionsPage),
        )

        new_capture_buton.place(relx=0.5, rely=0.5, anchor=tk.CENTER)

Большая часть того, что видно на вашем скриншоте, — это экземпляр HomePage, который представляет собой обычный фрейм Tk, и поэтому на него не влияет стиль ttk.

jasonharper 25.06.2024 16:42

@jasonharper спасибо, я все переключил на ttk и теперь все работает

SudoAptWhy UPDATE 25.06.2024 16:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Верхние уровни (включая главное окно) не являются тематическими виджетами. Они ничего не знают о системе тем. У них также есть другие важные возможности, которые делают простое повторение кода «но с темами» нетривиальным.

Простое решение (то есть то, что я всегда делал) — упаковать тематический фрейм внутри верхнего уровня в качестве единственного прямого дочернего элемента и заставить его всегда покрывать весь родительский фрейм. Затем поместите туда другие тематические виджеты. Технически это не тематический верхний уровень, но он выглядит и работает так же, как и был (при условии, что вы используете правильный дескриптор для работы с ним), так что этого достаточно.

[EDIT]: Подумав об этом еще немного, вы можете разместить тематический фрейм (сначала) внутри верхнего уровня с абсолютной позицией 0,0 и относительной шириной/высотой 1.0/1.0. Размещенные виджеты не участвуют в расчетах геометрии своего родителя, поэтому в данном случае это будет означать, что тематический фрейм просто находится позади всего остального. Именно так, как хотелось. Преимущество этого в том, что вы можете полностью забыть о тематическом фоне; вы упаковываете или размещаете свои виджеты на верхнем уровне точно так же, как и раньше.

Я всегда забываю россыпь. Он используется нечасто, но иногда это именно то, что вам нужно.

Другие вопросы по теме