2017-03-04 190 views
0

在这里打开二级窗口是我的代码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() 

当我运行它,我得到这个画面: Working Screen without ttk

但只要我改变:

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

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

A Secondary Window is opened and the font doesn't change.

我希望有一些简单的我可以忽略,但是这种ttk构件样式的方法是我看到它在线完成的唯一方法。

我不想要这个窗口,正如我之前所说的,当我将'b'样式应用到按钮时,它似乎奇迹般地出现。

感谢您的阅读。

回答

0

辅助窗口是由行7引起的。当您调用ttk.Style时,它需要一个根窗口来处理,如果还没有创建它,它会创建一个。要解决这个问题,需要在创建根窗口(调用Tk())后将第7行和第8行移动到某一点。

if __name__ == '__main__': 
    app = LoginScreen() 
    app.title("Login") 
    b = ttk.Style() 
    b.configure('TButton', font=font) 
    app.mainloop() 
+0

很好用!非常感谢! –

+0

@MaxO随时。顺便说一下,堆栈溢出表示感谢的方式是通过upvoting并接受答案。 http://stackoverflow.com/help/someone-answers – Novel