2016-07-06 79 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。我不明白。如果有人能解釋這對我來說意味着這個世界。提前致謝。

編輯: 感謝大家現在工作得很好,把Gtk.main()帶出了這兩個類,並在LoginWindow()類中添加了button_clicked方法,現在它就像一個魅力一樣。我認爲我需要爲每個打開的窗口使用Gtk.main()。

回答

2

這是因爲您正在啓動LoginWindow.__init__()內部的主循環(Gtk.main())。這意味着直到登錄窗口關閉後,window = LoginWindow()行纔會執行完成。您應該採用__init__方法以外的Gtk.main(),並將其移至文件的最後一行。正如PM 2Ring在評論中提到的那樣,您不需要撥打Gtk.main()兩次。在MainWindow.start()中完全刪除它,因爲現在添加到文件最後一行的那個會處理該問題。 PM還提到,connect()在事件發生時調用函數。當你給它button_clicked(...)時,該函數被調用,並且你實際上告訴connect()調用返回的任何東西,None。如果你想特殊的參數,使用lambda,但你甚至不進行任何更改(這些都是默認參數是這樣),所以你可以簡單地這樣做:

self.connect("clicked", button_clicked) 

我也建議,而不是說讓button_clicked一個單獨的函數,使其成爲該類的靜態方法。你把它放在課堂上,但@staticmethod就在def的上方。這樣,它有意義地採取self參數,但不需要兩個參數來說明同一個窗口。

+0

我沒有GTK3的Python東西(我仍然使用GTK2 +),所以我不會寫答案。但'Gtk.main()'也需要從'MainWindow.start'中移除。此外,對'self.loginbutton.connect'的回調需要被修正:目前它被分配給'button_clicked'調用返回的值,即'None'。我猜'button_clicked'確實應該是'LoginWindow'的一種方法。 –

+1

@ PM2Ring:其實我也沒有GTK3;)謝謝你的建議;我編輯過。 – zondo