2016-11-25 25 views
0

私はPythonでTkinterを使ってプログラムを開発しています。私が現在持っている問題は、別のウィンドウを開くボタンがあることです。私の問題は、2つ以上のウィンドウを開くことができないということです。これを修正する方法に関するアイデア。Tkinterは2つ以上のウィンドウを開くことはありません

from tkinter import * 

class first(object): 
    def __init__(self, master): 
     self.master = master 
     self.admin_btn = Button(master, text = "First", command = self.second) 
     self.admin_btn.grid(row = 0, column = 0) 

    def second(self): 
     self.w = second(self.master) 
     self.master.wait_window(self.w.top) 

class second(object): 
    def __init__(self, master): 
     top = self.top = Toplevel(master) 
     self.second = Button(top, text = "Second", command = self.third) 
     self.second.grid(row= 0, column = 0) 

    def third(self): 
     self.w = third(self.master) 
     self.master.wait_window(self.w.top) 

class third(object): 
    def __init__(self, master): 
     top = self.top = Toplevel(master) 
     self.second = Button(top, text = "Third") 
     self.second.grid(row= 0, column = 0) 


if __name__ == "__main__": 
    root = Tk() 
    m = first(root) 
    root.mainloop() 
+0

console/termina/cmd.exe/powershellで実行すると、3番目のウィンドウを開こうとするとエラーメッセージが表示されます。 – furas

+0

あなたの投稿を壊さないでください。 – SiHa

答えて

0

私はすべてのあなたのクラスはトップレベルの代わりに、オブジェクト、この方法を継承することを示唆している、すべてのクラスが(あなたがエラーを持っていた理由は、secondクラスが1つを持っていないです)master属性を持ちます:

from tkinter import * 

class First(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.admin_btn = Button(self, text = "First", command = self.second) 
     self.admin_btn.grid(row=0, column=0) 

    def second(self): 
     self.w = Second(self) 
     self.wait_window(self.w) 

class Second(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.second = Button(self, text = "Second", command = self.third) 
     self.second.grid(row=0, column=0) 

    def third(self): 
     self.w = Third(self.master) 
     self.wait_window(self.w) 

class Third(Toplevel): 
    def __init__(self, master): 
     Toplevel.__init__(self, master) 
     self.second = Button(self, text = "Third") 
     self.second.grid(row=0, column=0) 


if __name__ == "__main__": 
    root = Tk() 
    m = First(root) 
    m.lift(root) 
    root.wait_window(m) 
    root.mainloop() 
0

このコードを使用してみてください:

このコードで
import tkinter as tk 

class Demo1: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.button1 = tk.Button(self.frame, text = 'First', width = 25, command = self.new_window) 
     self.button1.pack() 
     self.frame.pack() 
    def new_window(self): 
     self.newWindow = tk.Toplevel(self.master) 
     self.app = Demo2(self.newWindow) 

class Demo2: 
    def __init__(self, master): 
     self.master = master 
     self.frame = tk.Frame(self.master) 
     self.quitButton = tk.Button(self.frame, text = 'Second', width = 25, command = self.close_windows) 
     self.quitButton.pack() 
     self.frame.pack() 
    def close_windows(self): 
     self.master.destroy() 

def main(): 
    root = tk.Tk() 
    app = Demo1(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

私は2つのウィンドウを追加したが、あなたは三番目を追加することができます。

0

あなたは第二のウィンドウに

self.master = master 

を忘れてしまった、あなたは第三のウィンドウを開こうとすると、エラーメッセージが表示されます。

しかし、あなたはかなりself. masterToplevel(master)を割り当て、self.top

from tkinter import * 


class First(object): 

    def __init__(self, master): 
     self.master = master # = Tk() 
     self.btn = Button(self.master, text="First", command=self.second) 
     self.btn.grid(row=0, column=0) 

    def second(self): 
     self.w = Second(self.master) 
     self.master.wait_window(self.w.master) 


class Second(object): 

    def __init__(self, master): 
     self.master = Toplevel(master) 
     self.btn = Button(self.master, text="Second", command=self.third) 
     self.btn.grid(row=0, column=0) 

    def third(self): 
     self.w = Third(self.master) 
     self.master.wait_window(self.w.master) 


class Third(object): 

    def __init__(self, master): 
     self.master = Toplevel(master) 
     self.btn = Button(self.master, text="Third") 
     self.btn.grid(row=0, column=0) 


if __name__ == "__main__": 
    root = Tk() 
    first = First(root) 
    root.mainloop() 

の代わりにself.masterを使用して、今、すべてのクラスは非常に似ています必要があります - 彼らはところで


self.master = Tk()またはself.master = Toplevel(master)を持っている:CamelCaseを使用クラス名 - FirstSecondThird - これはclの認識に役立ちますコードで尻。

関連する問題