Python PyGObject和Glade,动态更改按钮图标

Python PyGObject和Glade,动态更改按钮图标,python,glade,pygobject,Python,Glade,Pygobject,如何动态更改用glade创建的按钮的图标 上次编辑 我正在尝试这个: self.button_waiting=self.builder.get_object('button_waiting') image=Gtk.Image() image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.BUTTON) image.show() self.button_waiting.remove(image)

如何动态更改用glade创建的按钮的图标

上次编辑

我正在尝试这个:

    self.button_waiting=self.builder.get_object('button_waiting')
    image=Gtk.Image()
    image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.BUTTON)
    image.show()
    self.button_waiting.remove(image)
    self.button_waiting.add(image)
    self.button_waiting=self.builder.get_object('button_waiting')
    self.button_waiting.set_label("Cancel")
    image=Gtk.Image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.ICON_SIZE_BUTTON)
    image.show()
    self.button_waiting.image.clear()
    self.button_waiting.add(image)
我得到这个错误:

Gtk-CRITICAL **: gtk_container_remove: assertion `gtk_widget_get_parent (widget) 
==    GTK_WIDGET (container) || GTK_IS_ASSISTANT (container)' failed

(fresh_install:16299): Gtk-WARNING **: Attempting to add a widget with type 
GtkImage to a GtkButton, but as a GtkBin subclass a GtkButton can only contain 
one widget at a time; it already contains a widget of type GtkLabel
我抄袭的答案似乎是错误的,但他所做的对我来说是行不通的

我读到有可能把图片贴在标签上,我怎样才能得到在glade制作的按钮标签的名称

以下是答案:

原始问题 我正在尝试这个:

    self.button_waiting=self.builder.get_object('button_waiting')
    image=Gtk.Image()
    image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.IconSize.BUTTON)
    image.show()
    self.button_waiting.remove(image)
    self.button_waiting.add(image)
    self.button_waiting=self.builder.get_object('button_waiting')
    self.button_waiting.set_label("Cancel")
    image=Gtk.Image.set_from_stock(Gtk.STOCK_DIALOG_ERROR, Gtk.ICON_SIZE_BUTTON)
    image.show()
    self.button_waiting.image.clear()
    self.button_waiting.add(image)
我得到以下错误:

AttributeError: 'gi.repository.Gtk' object has no attribute 'ICON_SIZE_BUTTON'

但是我在参考手册上找到了GTK图标大小按钮,我假设您使用的是PyGObject(GTK+3.x),因为您是
GTK
而不是
GTK
。如果是这种情况,那么您应该使用
Gtk.IconSize.BUTTON
而不是
Gtk.ICON\u SIZE\u按钮


这是因为将把常量放入命名空间,而不是我们在C源代码中看到的长常量。根据上下文,通常很容易理解它。

我假设您使用的是PyGObject(GTK+3.x),因为您是
GTK
而不是
GTK
。如果是这种情况,那么您应该使用
Gtk.IconSize.BUTTON
而不是
Gtk.ICON\u SIZE\u按钮


这是因为将把常量放入命名空间,而不是我们在C源代码中看到的长常量。根据上下文,通常很容易理解它。

我假设您使用的是PyGObject(GTK+3.x),因为您是
GTK
而不是
GTK
。如果是这种情况,那么您应该使用
Gtk.IconSize.BUTTON
而不是
Gtk.ICON\u SIZE\u按钮


这是因为将把常量放入命名空间,而不是我们在C源代码中看到的长常量。根据上下文,通常很容易理解它。

我假设您使用的是PyGObject(GTK+3.x),因为您是
GTK
而不是
GTK
。如果是这种情况,那么您应该使用
Gtk.IconSize.BUTTON
而不是
Gtk.ICON\u SIZE\u按钮


这是因为将把常量放入命名空间,而不是我们在C源代码中看到的长常量。通常,根据上下文很容易理解。

是的!你说得对,我想现在我可以做更好的研究,更好地理解参考手册。我仍然得到一个错误,TypeError:unbound方法set_from_stock()必须用Image instance作为第一个参数调用(改为使用str instance),我正在尝试找出它是什么。顺便说一句,我要感谢您的Glade教程:)这个错误听起来好像您没有在Gtk.Image实例上从_stock()调用set_。它应该是这样的:image=Gtk.image();image.set_from_stock(Gtk.stock_NEW,Gtk.IconSize.BUTTON);这就是我想的,我做到了:image=Gtk.image;image.set_from_stock(Gtk.stock_对话框_错误,Gtk.IconSize.BUTTON)是的!你说得对,我想现在我可以做更好的研究,更好地理解参考手册。我仍然得到一个错误,TypeError:unbound方法set_from_stock()必须用Image instance作为第一个参数调用(改为使用str instance),我正在尝试找出它是什么。顺便说一句,我要感谢您的Glade教程:)这个错误听起来好像您没有在Gtk.Image实例上从_stock()调用set_。它应该是这样的:image=Gtk.image();image.set_from_stock(Gtk.stock_NEW,Gtk.IconSize.BUTTON);这就是我想的,我做到了:image=Gtk.image;image.set_from_stock(Gtk.stock_对话框_错误,Gtk.IconSize.BUTTON)是的!你说得对,我想现在我可以做更好的研究,更好地理解参考手册。我仍然得到一个错误,TypeError:unbound方法set_from_stock()必须用Image instance作为第一个参数调用(改为使用str instance),我正在尝试找出它是什么。顺便说一句,我要感谢您的Glade教程:)这个错误听起来好像您没有在Gtk.Image实例上从_stock()调用set_。它应该是这样的:image=Gtk.image();image.set_from_stock(Gtk.stock_NEW,Gtk.IconSize.BUTTON);这就是我想的,我做到了:image=Gtk.image;image.set_from_stock(Gtk.stock_对话框_错误,Gtk.IconSize.BUTTON)是的!你说得对,我想现在我可以做更好的研究,更好地理解参考手册。我仍然得到一个错误,TypeError:unbound方法set_from_stock()必须用Image instance作为第一个参数调用(改为使用str instance),我正在尝试找出它是什么。顺便说一句,我要感谢您的Glade教程:)这个错误听起来好像您没有在Gtk.Image实例上从_stock()调用set_。它应该是这样的:image=Gtk.image();image.set_from_stock(Gtk.stock_NEW,Gtk.IconSize.BUTTON);这就是我想的,我做到了:image=Gtk.image;image.set_from_stock(Gtk.stock_对话框错误,Gtk.IconSize.BUTTON)