Python Gtk 3窗口没有定义,类实例混乱

时间:2016-07-06 11:00:48

标签: python gtk3

我刚刚开始进入python,我对于对象创建的工作原理完全感到困惑。我正在尝试使用GTK创建用户界面。这是我遇到的问题的一个例子:

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出现错误:未定义名称'window' 即使我确实定义了窗口。我不明白。如果有人能够解释它对我来说意味着世界。提前谢谢。

编辑: 谢谢大家这个现在工作正常,从两个类中取出Gtk.main()并在LoginWindow()类中添加了button_clicked方法,现在它就像一个魅力。我假设我打开的每个窗口都需要Gtk.main()。

1 个答案:

答案 0 :(得分:2)

这是因为你正在Gtk.main()内部开始主循环(LoginWindow.__init__())。这意味着window = LoginWindow()行在登录窗口关闭之前不会完成执行。您应该在Gtk.main()方法之外取__init__,并将其移至文件的最后一行。正如PM 2Ring在评论中所提到的,您不需要两次致电Gtk.main()。完全在MainWindow.start()中取出它,因为现在添加到文件最后一行的那个会解决这个问题。 PM也提到,connect()在事件发生时调用函数。当你给它button_clicked(...)时,会调用该函数,你实际上是在告诉connect()调用返回的内容None。如果你想要特殊的参数,请使用lambda,但你甚至不能改变任何东西(无论如何都是默认参数),所以你可以这样做:

self.connect("clicked", button_clicked)

我还建议不要将button_clicked作为单独的函数,而是将其作为类的静态方法。你可以把它放在课堂上,但@staticmethod就在def线之上。这样,它可以采用self参数,但您不需要两个参数来考虑同一个窗口。