2014-01-08 4 views
1

여러 개의 창을 필요로하는 프로그램에서 작업 중이며 처음 로그인 창이 나타나면 다른 창을 자식으로 만들기 위해 T 최고 수준 위젯을 사용했지만이 코드는 두 개의 창을 계속 표시합니다 하나의.Python Tkinter Toplevel

from Tkinter import Frame, Toplevel 
from ttk import Label, Entry, Button 


class loginWindow(Toplevel): 
    def __init__(self): 
     Toplevel.__init__(self) 
     self.title("Title") 
     self.frame = Frame(self) 
     self.frame.pack() 
     self.__make_layout() 
     self.mainloop() 

    def __make_layout(self): 
     self.frame.user_name_label = Label(text="User name:") 
     self.frame.user_name_text = Entry() 
     self.frame.user_name_label.grid(row=0, column=0) 
     self.frame.user_name_text.grid(row=0, column=1) 
     self.frame.password_label = Label(text="Password:") 
     self.frame.password_text = Entry() 
     self.frame.password_label.grid(row=1, column=0) 
     self.frame.password_text.grid(row=1, column=1) 
     self.frame.login_button = Button(text="Login")# , command=self.__create_window) 
     self.frame.login_button.grid(row=2, column=0, columnspan=2) 


if __name__ == '__main__': 
    win1 = loginWindow() 

답변

2

_make_layout에서 생성 된 모든 위젯은 부모없이 생성됩니다. 이것은 그들이 기본 루트의 자식이라는 것을 의미합니다. Frame과 같은 방식으로 각자에게 부모를 전달해야합니다. 이와 같이 :

self.frame.user_name_label = Label(self.frame, text="User name:") 
self.frame.user_name_text = Entry(self.frame) 
# etc. 

정확한 코드를 실행하면 어떤 플랫폼에서든 두 번째 창이 나타나지 않습니다. 가장 가까운 것은 OS X에 있는데, 기본 루트 윈도우에 대한 항목이 윈도우 메뉴에 나타나지만 윈도우 자체는 여전히 나타나지 않으며 위젯은 모두 Toplevel에 있습니다 (비록 Frame에 없지만 그들). 그러나 Tkinter가 여기에 두 번째 창을 표시하고 위젯의 일부 또는 전체를 창에 표시하는 것은 합법적 일 것입니다.

2

abarnert는 여러 개의 창에 문제가 없으므로 플랫폼에 따라 달라질 수 있습니다. 나는 XQuartz와 OS X를 사용하고 다음 코드는 나에게 두 개의 창을 제공합니다

from Tkinter import Toplevel, Tk 
Tk().mainloop() 

내가 첫 번째 창 Tk() 이후 윈도우를 선언해야한다고 생각 :

from Tkinter import Toplevel, Tk 
Toplevel().mainloop() 

그러나,이 코드는 나에게 하나 개의 창을 제공을 Toplevel()이어야합니다.

+0

어떻게 Aqua 대신 X11 용으로 Tkinter를 컴파일 할 수 있습니까? 그게 여러 버전 전에 저를 위해 일하는 것을 멈췄습니다 ... – abarnert

+0

저는 아나콘다 2.7을 사용하고 있습니다. –

+0

Crazy ... 어쨌든 Cygwin Python과 X11을 Windows에서 복제 할 수있었습니다. 그래서 나는 Tkinter가 사용하지 않는 메인 윈도우를 숨기기 위해 Aqua, Windows, 그리고 적어도 하나의 현대 GNOME X11 시스템에서 작동한다고 생각합니다. 그러나 모든 X11 시스템에서 작동하지 않습니다. 아마도 XQuartz 나 Cygwin이 일부 윈도우 관리를 기본 윈도우 관리자에 위임합니까? – abarnert

관련 문제