2016-07-06 15 views
0

私はPythonを使い始めました。オブジェクト作成の仕組みについて全く混乱しています。私はGTKとのユーザーインターフェイスを作成しようとしています。私は窓を定義しなかったにもかかわらず、 が定義されていない名「窓」:Python Gtk 3のウィンドウが定義されていません、クラスインスタンス化の混乱

from gi.repository import Gtk 


def button_clicked(self, button): 
    self.button_label = button.get_label() 
    if self.button_label == "Login": 
     window.quit() 
     window2.start() 

class LoginWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self, title="AMOK Cloud") 
     self.connect("delete-event", Gtk.main_quit) 
     self.set_position(position = Gtk.WindowPosition.CENTER) 

     # Button 
     self.loginbutton = Gtk.Button(label="Login") 
     self.loginbutton.connect("clicked", button_clicked(self, self.loginbutton)) 
     self.add(self.loginbutton) 

     self.show_all() 
     Gtk.main() 

    def quit(self): 
     self.close() 
     Gtk.main_quit() 

class MainWindow(Gtk.Window): 
    def __init__(self): 
     Gtk.Window.__init__(self, title="AMOK Cloud") 
     self.connect("delete-event", Gtk.main_quit) 
     self.set_position(position=Gtk.WindowPosition.CENTER) 

    def start(self): 
     self.show_all() 
     Gtk.main() 

window = LoginWindow() 
window2 = MainWindow() 

エラーがNameErrorとして起動します:ここでの問題私が午前の例があります。わかりません。もし誰かが私に世界を意味すると説明することができます。前もって感謝します。

EDIT: Gtk.main()を両方のクラスから取り除き、LoginWindow()クラスのbutton_clickedメソッドを追加しました。これは今のところ魅力的です。私は開いたウィンドウごとにGtk.main()が必要であると仮定しました。

答えて

2

メインループ(Gtk.main())がLoginWindow.__init__()の内側に開始されているためです。つまり、window = LoginWindow()行はログインウィンドウが閉じられるまで実行を終了しません。 __init__メソッドの外側にはGtk.main()を置き、ファイル内の最後の行に移動する必要があります。コメントでPM 2Ringが述べたように、Gtk.main()を2回呼び出す必要はありません。 MainWindow.start()で完全に取り除いてください。ファイル内の最後の行に追加されたファイルがそれを処理するためです。 PMによっても言及されているように、connect()はイベントが発生したときに関数を呼び出します。 button_clicked(...)を渡すと、その関数が呼び出され、返されたものをNoneと呼び出すように実際にはconnect()に指示しています。

self.connect("clicked", button_clicked) 

私も代わりにはbutton_clickedを作ることを示唆している:あなたは特別な引数をしたい場合は、単にこれを行うことができますので、lambdaを使用していますが、あなたも(それらはとにかくデフォルト引数です)何も変更されていません別の関数をクラスの静的メソッドにします。あなたはそれをクラスの中に置くことによって行いますが、def行のすぐ上に@staticmethodがあります。この方法では、引数がselfであることは意味がありますが、同じウィンドウを扱うために2つのパラメータは必要ありません。

+0

私はGTK3のPythonのものを持っていません(まだGTK2 +を使用しています)ので、私は答えを書かないでしょう。しかし、 'Gtk.main()'も 'MainWindow.start'から削除する必要があります。また、 'self.loginbutton.connect'へのコールバックは修正する必要があります:現在、' button_clicked'呼び出しによって返された値には 'None'が割り当てられています。そして、私は 'button_clicked'が本当に' LoginWindow'のメソッドであるべきだと思います。 –

+1

@ PM2Ring:実際、GTK3もありません;)あなたの提案をありがとうございます。私は編集しました。 – zondo

関連する問題