2017-12-14 28 views
-1

안녕 얘들 아 나는 두 클래스 모두 프레임을 생성해야한다. 첫 번째 프레임에는 프레임을 닫아야하는 버튼이 있습니다. 두 번째 프레임에는 단순히 레이블이 들어 있습니다. 내 코드는 먼저 버튼이있는 프레임을 만들어야하고 버튼을 누르면 두 번째 창이 나타나야합니다. 버튼을 누르면 버튼과 라벨이 포함 된 "병합"창이 생성됩니다. 파이썬 tkinter 2 프레임 병합

import tkinter as tk 

class Window1(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self) 
     self.grid() 
     self.btn = tk.Button(self,text = "button",command = self.run) 
     self.btn.grid(row = 0,column = 0) 

    def run(self): 
     tk.Frame.quit(self) 

class Window2(tk.Frame): 
    def __init__(self): 
     tk.Frame.__init__(self)  
     self.grid() 
     self.label = tk.Label(self,text = "label ") 
     self.label.grid(row = 0,column = 0) 

w = Window1() 
w.mainloop() 

v = Window2() 
v.mainloop() 

button images

첫 번째 사진

는 버튼을 누르기 전에, 당신 후 다음 중 하나가 버튼을 누르면입니다. 문제는 tk.Frame.quit(self)이 올바르게 작동하지 않는 것 같습니다. 비슷한 방법으로 창을 닫으려고 시도했습니다.

tk.Frame.destroy(self) 

하지만 그 중 하나는 도움이되지 않습니다.

편집 : -을 만 족 원소 나는 창을 만들지 않습니다 tk.TK 대신 tk.Frame

+4

'root = tk.Tk()'를 생성하십시오. 'Frame'은 윈도우를 생성하지 않습니다 - 요소 만 그룹화합니다. 'Tk()'는 창을 생성합니다. 창을 닫으려면'root.destroy()'가 필요합니다. 위젯에 부모가 없으면'root'를 사용합니다.'Frame'도 위젯을 사용합니다. 'root'를 만들지 않으면 코드의 어딘가에 루트를 만들지 만 루트를 닫으려면'root'에 액세스 할 수 없습니다 – furas

+0

BTW : 프레임을 닫으려면'self.destroy()'를 사용합니다 (하지만 윈도우를 닫지는 않습니다). Python 3을 사용한다면'tk.Frame .__ init __ (self)' – furas

+0

@furas 대신에'super() .__ init __()'을 사용할 수 있고 Python2에서는'super (MyClassName, self) .__ init __()' – mikuszefski

답변

1

Frame에서 클래스를 상속하여 해결했다. Tk() 창이 생성됩니다.

창을 닫으려면 destroy() 개체를 만들려면 Tk()을 생성해야합니다. 그러나 수동으로 생성하지 않으려면 root = tk.Tk()을 tkinter가 자동으로 생성하지만이 root에 액세스 할 수는 없습니다.

위젯에 부모가없는 경우 root을 사용하고 Frame도 사용합니다.

import tkinter as tk 

class Window1(tk.Frame): 

    def __init__(self, master): 
     # send `root` to `Frame` as its parent 
     tk.Frame.__init__(self, master) 
     # `Frame` will keep `master as `self.master` 
     # so we don't have to do `self.master = master` manually 

     self.grid() 
     self.btn = tk.Button(self, text="Hello Button", command=self.run) 
     self.btn.grid(row=0, column=0) 

    def run(self): 
     # use `master` (`root`) to destroy it 
     self.master.destroy() 

class Window2(tk.Frame): 

    def __init__(self, master): 
     tk.Frame.__init__(self, master)  
     self.grid() 
     self.label = tk.Label(self, text="Hello Label") 
     self.label.grid(row=0, column=0) 

root = tk.Tk() # create main window as `root` 
Window1(root) # send `root` to `Window1` and later to `Frame` 
root.mainloop() 

root = tk.Tk() 
Window2(root) 
root.mainloop()