2010-08-18 80 views
4

环境:顺利更新标签文本

  • 使用Glade3内置接口。
  • 后端是使用GTK + Builder库以Python编写的。

-

虽然我知道我需要使用更新,我无法获得在Python代码中的标签对象标签的文本(label.set_text(“字符串”))的方法。

这里是我的代码如下所示:

#!/usr/bin/python 
# Filename: HelloPython.py 
# Author: Andrew Hefley Carpenter 
# Date: 18 August 2010 

import sys 
import gtk 

class HelloPython: 

    def on_window_destroy(self, widget, data=None): 
     gtk.main_quit() 

    def __init__(self): 

     builder = gtk.Builder() 
     builder.add_from_file("HelloPython.xml") 

     self.window = builder.get_object("window") 
     builder.connect_signals(self) 

    def on_button1_clicked(self, widget): 

     print "Hello World!" 
     widget.set_label("Hello World!") 
     #I'd like to update 

if __name__ == "__main__": 
    editor = HelloPython() 
    editor.window.show() 
    gtk.main() 

最终目标:我想更新“对象X”用它的回调“对象Y”(在这种情况下按钮1)后set_text方法,通过为处理“on_button1_clicked”

回答

3

on_button1_clicked的widget参数是gtk.Button,而不是gtk.Label。 gtk.Button有一个方便的API方法叫做set_label()。

这只适用于Gtk.Button的孩子是gtk.Label的情况。这是在Glade-3中创建新按钮时的默认设置,但如果您更改了按钮的内容,则此功能无效,您需要参考gtk.Label小部件本身。

EDIT(代码来更新标签):

class HelloPython: 
    def on_window_destroy(self, widget, data=None): 
     gtk.main_quit() 

    def __init__(self): 
     builder = gtk.Builder() 
     builder.add_from_file("HelloPython.xml") 
     self.window = builder.get_object("window") 
     self.label = builder.get_object("label1") # get reference to the label 
     builder.connect_signals(self) 

    def on_button1_clicked(self, widget): 
     #widget.set_label("Hello World!") this would set the button's text 
     self.label.set_text("Hello World!") # this sets the label's text 
+0

理解的。容器层次如下: -Window有一个孩子,垂直框'2容器' - 垂直框有两个孩子,button1和label1。 - 我想在label1同步时更新label1,点击button1。我怎样才能做到这一点/有什么概念上的障碍阻止我去理解这一点? 感谢您的快速响应。 – Drew 2010-08-18 01:00:57

+0

啊,gtk不知道或关心这个“兄弟”关系。您需要使用gtk.Builder.get_object()获取对该标签的引用,并在该对象上调用set_text。 – anthony 2010-08-18 01:59:40

+0

另外,你会希望尽快摆脱使用glade的默认widget名称(button1,label1)的习惯,否则你的生活会很糟糕。 – anthony 2010-08-18 02:04:03