我刚刚开始进入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()。
答案 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
参数,但您不需要两个参数来考虑同一个窗口。