ttk Открытие вторичного окна при применении стиля

Вот мой код

from Tkinter import *
import ttk, tkMessageBox
import os

font = ("Avenir", 24)

b = ttk.Style()
b.configure('TButton', font=font)

class LoginScreen(Tk):
    def __init__(self, *args, **kwargs):
        Tk.__init__(self, *args, **kwargs)

        container = Frame(self)
        container.pack(side=TOP, fill=BOTH, expand=True)

        self.frames = {}
        for F in (Login, Register):
            frame = F(container, self)
            self.frames[F] = frame

            frame.grid(row=0, column=0, sticky='nsew')

        self.show_frame(Login)

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

class Login(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label = Label(self, text="screen 1")
        button = Button(self, text="move", font=font, command=lambda: controller.show_frame(Register))

        button.pack()
        label.pack()

class Register(Frame):
    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        label = Label(self, text="screen 2")
        label.pack()

if __name__ == '__main__':
    app = LoginScreen()
    app.title("Login")
    app.mainloop()

Когда я запускаю это, я получаю этот экран: Рабочий экран без ttk

Но как только я меняю:

button = Button(self, text="move", font=font, command=lambda: controller.show_frame(Register))

to

button = ttk.Button(self, text="move", style='TButton', command=lambda: controller.show_frame(Register))

Вторичное окно открыто, и шрифт не меняется.

Я надеюсь, что есть что-то простое, что я упускаю из виду, но этот метод стилизации виджетов ttk - единственный способ, которым я видел это в Интернете.

Мне не нужно окно, и, как я уже говорил, оно появляется волшебным образом, когда я применяю стиль «b» к кнопке.

Спасибо за чтение.


person Max O    schedule 04.03.2017    source источник


Ответы (1)


Вторичное окно вызвано вашей строкой 7. Когда вы вызываете ttk.Style, для работы ему требуется корневое окно, и если оно еще не создано, оно создает его. Чтобы исправить это, вам нужно переместить строки 7 и 8 в точку после создания корневого окна (вызов Tk()).

if __name__ == '__main__':
    app = LoginScreen()
    app.title("Login")
    b = ttk.Style()
    b.configure('TButton', font=font)
    app.mainloop()
person Novel    schedule 04.03.2017
comment
Работает отлично! Большое спасибо! - person Max O; 04.03.2017
comment
@MaxO В любое время. Кстати, способ выразить благодарность при переполнении стека — проголосовать и принять ответ. stackoverflow.com/help/someone-answers - person Novel; 04.03.2017