2017-03-29 11 views
1

コードで分かるように、MainWindowでは青色と緑色のボックスが表示され、もう一方のOntopが表示され、SecondMainWindowには赤色と黄色のボックスが表示されます。彼らは彼らのために必要があるように、コードを実行することによって、あなたは残るMainWindowすべてのフレームにlogin窓からそれを見ることができる唯一のMainWindowと上にあるSecondMainWindow しかし、あなたがSecondMainWindowのFAMEにMainWindowから行くとき、問題が解決しませんあなたはどちらの窓に混じっているのですか?さまざまな色に背景をMainWindowSecondMainWindowに設定して、どのフレームを表示するかをさらに深く理解しています。唯一selfはあなたが私はこの問題を解決する方法を、それはレイアウトに変更使用して、単に自己を見ることができるように enter image description hereフレームを取り除くにはどうしたらいいですか、別のフレームを表示したいときにフレームに何が置かれますか?

を使用しているだけself.masterenter image description here

を使用している?と

import tkinter as tk 
class start(tk.Tk): 
    def __init__(self): 
    tk.Tk.__init__(self) 
    self.frame = login() 
    self.frame.grid() 

    def change(self, frame): 
    self.frame.grid_forget() 
    self.frame = frame() 
    self.frame.grid() 


class login(tk.Frame): 
    def __init__(self, master=None, **kwargs): 
    tk.Frame.__init__(self, master, **kwargs) 
    self.master.geometry('300x300') 
    self.master.configure(bg='orange') 

    button1 = tk.Button(self.master, text='New Frame', command = self.ChangeFrame).grid(row=0,column=0) 

    def ChangeFrame(self): 
    self.master.change(MainWindow) 


class MainWindow (tk.Frame): 
    def __init__(self, master=None, **kwargs): 
    tk.Frame.__init__(self, master, **kwargs) 
    self.master.geometry('300x300') 
    self.master.configure(bg='white') 

    self.master.grid_rowconfigure(0, weight=2) 
    self.master.grid_rowconfigure(1, weight=3) 

    self.master.grid_columnconfigure(0, weight=1) 

    Frame1 = tk.Frame(self.master, background='blue', bd=1, relief='sunken') 
    Frame1.grid(row=0,column=0,padx=10,pady=10,sticky='nsew') 

    Frame2 = tk.Frame(self.master, background='green', bd=1, relief='sunken') 
    Frame2.grid(row=1,column=0,padx=10,pady=10,sticky='nsew') 

    button1 = tk.Button(Frame1, text='New Frame', command = self.ChangeFrame).grid(row=0,column=0) 

    def ChangeFrame(self): 
    self.master.change(SecondMainWindow) 

class SecondMainWindow (tk.Frame): 
    def __init__(self, master=None, **kwargs): 
    tk.Frame.__init__(self, master, **kwargs) 
    self.master.geometry('300x300') 
    self.master.configure(bg='grey') 

    self.master.grid_rowconfigure(0, weight=1) 
    self.master.grid_rowconfigure(1, weight=1) 

    self.master.grid_columnconfigure(0, weight=1) 
    self.master.grid_columnconfigure(1, weight=1) 

    Frame3 = tk.Frame(self.master, background='yellow', bd=1, relief='sunken') 
    Frame3.grid(row=1,column=1,padx=10,pady=10,sticky='nsew') 

    Frame4 = tk.Frame(self.master, background='red', bd=1, relief='sunken') 
    Frame4.grid(row=0,column=1,padx=10,pady=10,sticky='nsew') 

    button1 = tk.Button(Frame4, text='New Frame', command = self.ChangeFrame).grid(row=0,column=0) 

    def ChangeFrame(self): 
    self.master.change(MainWindow)  

app = start() 
app.mainloop() 

+0

bigFrame> smallFrameが必要な場合は、小さなフレームにマスターとしてbigFrameを提供する必要があります: 'smallFrame(bigFrame)'。あなたの場合: 'self.frame = login_window(self)' – Novel

+0

アプリケーションが起動したときにログインウィンドウを開いているという点で、それはどのように機能しますか? –

+0

私はそのことを具体的には意味しませんでした、私は一般的に意味します。それらのすべては、単にマスターとして「自己」を使用する必要があり、それが完了したら、あなたはそれを望む方法であなたのレイアウトを修正する必要があります。 – Novel

答えて

1

すべてのウィンドウのウィジェットをself.masterに配置しますが、コピー元のコードは各ウィンドウが独立したオブジェクトになるように設計されています。 1つのウィンドウ内のすべてのウィジェットは、そのウィンドウの子でなければなりません。要するに

、これに代えて:

class SecondMainWindow (tk.Frame): 
    def __init__(self, master=None, **kwargs): 
     ... 
     Frame3 = tk.Frame(self, ...) 
     Frame4 = tk.Frame(self, ...) 
     ... 

あなたはすべてのウィンドウがルートウィンドウに直接ウィジェットを配置したい場合は、あなたのための理由がありません:

class SecondMainWindow (tk.Frame): 
    def __init__(self, master=None, **kwargs): 
     ... 
     Frame3 = tk.Frame(self.master, ...) 
     Frame4 = tk.Frame(self.master, ...) 
     ... 

あなたがこれを行うべきですtk.Frameを継承するクラスを作成します。

+0

私はちょうど自分自身を使用してself.masterを使用していないときに何が起こるかの画像を表示する質問をさらに更新しました。どのようにレイアウトを修正する上での任意の考えですか?前もって感謝します –

関連する問題