Python:GTK小部件实例如何工作?

时间:2013-08-09 04:25:00

标签: python gtk

这让我感到疯狂:

  • 为什么方法the_method(self, button)引用两个独立的self.button实例,具体取决于对象的调用?
  • 如何显式引用对象实例?

感谢您的帮助


import os, stat, time
import gtk

class Lister(object):

    OPEN_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND_MULTIPLE, gtk.ICON_SIZE_BUTTON)
    CLOSED_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND, gtk.ICON_SIZE_BUTTON)

    def __init__(self, dname = None):
        filename = "foo"
        self.hbox = gtk.HBox()
        self.button = gtk.Button()
        self.button.set_image(self.OPEN_IMAGE)
        self.button.connect('clicked', self.open_file)
        self.hbox.pack_start(self.button, False)

    def open_file(self, button):
        Buttons().the_method("foo")
        # return


class Buttons(object):

    OPEN_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND_MULTIPLE, gtk.ICON_SIZE_BUTTON)
    CLOSED_IMAGE = gtk.image_new_from_stock(gtk.STOCK_DND, gtk.ICON_SIZE_BUTTON)


    def __init__(self):

        self.button = gtk.Button() # THIS is the button to modify
        self.hbox = gtk.HBox()
        self.hbox.pack_start(self.button, False)
        self.button.set_image(self.OPEN_IMAGE)

        self.button.connect('clicked', self.the_method)

    def the_method(self, button):
        print vars(self)
        self.button.set_image(self.CLOSED_IMAGE)


class GUI(object):

    def delete_event(self, widget, event, data=None):
        gtk.main_quit()
        return False

    def __init__(self):
        self.window = gtk.Window()
        self.window.set_size_request(300, 600)
        self.window.connect("delete_event", self.delete_event)

        vbox = gtk.VBox()
        vbox.pack_start(Buttons().hbox, False, False, 1)
        vbox.pack_start(Lister().hbox)

        self.window.add(vbox)
        self.window.show_all()
        return

def main():
    gtk.main()

if __name__ == "__main__":
    GUI()
    main()

2 个答案:

答案 0 :(得分:1)

  

为什么方法the_method(self,button)引用两个独立的方法   self.button的实例取决于什么对象调用它?

它不依赖于调用者:您每次都明确创建一个新的按钮实例(例如Buttons().hbox创建一个新实例并从中获取hbox)。

  

如何显式引用对象实例?

您已经引用了一个实例,每次只是一个新实例。这两个调用将按预期在同一个实例上调用该方法:

my_buttons = Buttons(); 
my_buttons.the_method();
my_buttons.the_method();

在每种面向对象的语言中都是一样的,所以任何OO教程都可能有用,但http://docs.python.org/tutorial/classes.html可能有助于理解类在python中的工作方式。

答案 1 :(得分:-1)

self.button仅引用同一个对象,该对象是在侦听器类的实例中声明的按钮变量。

使用像“self”这样的关键字对象前缀在OOP中非常典型。如果你来自C#/ java后台,你必须知道“this”或“Me”关键字,如果你曾经学过Visual Basic。 区分python的一个方面是它在方法定义中使用self关键字,如:

def the_method(self, button):

添加self作为第一个参数告诉python将其视为一个实例方法,这样如果你的Buttons类存在一个对象foo,你可以直接调用这个实例方法:

foo.the_method(xyz)

调用时无需在此处传递“self”参数。只是在那里使它成为一个实例方法。 另一方面,如果省略self参数,它就会变成你所谓的静态方法,它不会链接到特定的实例:

def the_method(button):

在这种情况下,如果不创建foo实例,可以直接调用:

Buttons.the_method(xyz)