【问题标题】:Passing a variable to a dialog将变量传递给对话框
【发布时间】:2012-06-27 11:19:02
【问题描述】:

我需要将消息传递给错误对话框,以将其显示给用户。

第一次尝试

PreferencesDialog.py

dlgError = ErrorDialog ('Have you been messing with the configuration files?')
dlgError.run ()

ErrorDialog.py

global message = None

def __new__(cls, msg):
    builder = get_builder('ErrorDialog')
    new_object = builder.get_object('error_dialog')
    new_object.finish_initializing(builder)

    global message
    message = msg

    return new_object

def finish_initializing(self, builder):

    # Get a reference to the builder and set up the signals.
    self.builder = builder
    self.ui = builder.get_ui(self)

    global message
    self.builder.get_object ('lblMessage').set_text (message)

第二次尝试

PreferencesDialog.py

dlgError = ErrorDialog ()
dlgError.message = 'Have you been messing with the configuration files?'
dlgError.run ()

ErrorDialog.py

global message = None

def __new__(cls):
    builder = get_builder('ErrorDialog')
    new_object = builder.get_object('error_dialog')
    new_object.finish_initializing(builder)

    return new_object

def finish_initializing(self, builder):

    # Get a reference to the builder and set up the signals.
    self.builder = builder
    self.ui = builder.get_ui(self)

    global message
    self.builder.get_object ('lblMessage').set_text (message)

两者都抛出相同的异常;

self.builder.get_object ('lblMessage').set_text (message)
NameError: global name 'message' is not defined

请帮忙。我正在使用 Quickly、GTK 3 和 Python 2.7。

【问题讨论】:

    标签: python gtk python-2.7 pygtk canonical-quickly


    【解决方案1】:

    为什么不通过在__init__ 中设置message 来使message 成为类实例的成员?

    def __init__(self, msg):
      self._message = msg
    
    def finish_initializing(self, builder):
      self.builder.get_object("lblMessage").set_text(self._message)
    

    【讨论】:

    • TypeError: __new__() takes exactly 1 argument (2 given)
    • @RobinJ 这是我发现快速存根代码烦人的原因之一......但这很容易修复:将def __new__(cls, msg) 替换为def __new__(cls, msg, *args, **kwargs),如here 所述。之后,您可以使用 unwind 解决方案,我认为这是最好的解决方案。
    【解决方案2】:

    我设置了一个对话框,在其中我向对话框传递了一个变量以将文本放入输入框中。诀窍是将变量传递给 new ,然后在调用 finish.initializing() 时将其放入其中。代码如下:

    class QuerynameDialog(Gtk.Dialog):
        __gtype_name__ = "QuerynameDialog"
    
        def __new__(cls, name):
            """Special static method that's automatically called by Python when 
            constructing a new instance of this class.
    
            Returns a fully instantiated QuerynameDialog object.
            """
            builder = get_builder('QuerynameDialog')
            new_object = builder.get_object('queryname_dialog')
            new_object.finish_initializing(builder,name)
            return new_object
    
    
        def finish_initializing(self, builder,name):
            """Called when we're finished initializing.
    
            finish_initalizing should be called after parsing the ui definition
            and creating a QuerynameDialog object with it in order to
            finish initializing the start of the new QuerynameDialog
            instance.
            """
            # Get a reference to the builder and set up the signals.
            self.builder = builder
            self.ui = builder.get_ui(self)
            self.builder.get_object('name_entry').set_text(name)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-12
      相关资源
      最近更新 更多