【问题标题】:python passing list reference to a functionpython将列表引用传递给函数
【发布时间】:2013-07-04 23:33:09
【问题描述】:

在 python 中,我在一个类中有以下代码:

def __init__(self):
    presets = []
    for i in range(6):
        presets.append(dbuilder.get_object("button_pres"+str(i)))
        presets[i].connect("clicked", self.on_preset_button, i, presets)
        print presets

def on_preset_button(self, origin, i, presets):
    recall(i)
    print presets

现在,当我在 for 循环中调用打印预设时,我得到了正确的结果,列表每次迭代都会增长。

但是在 on_preset_button 我得到了空列表。我以为我正在将对预设的引用传递给函数 connect,该函数又将引用传递给 on_preset_button。但好像没有。

我想访问之前附加到预设的 6 个元素。请帮忙!

这是长版:

import gtk

from galicaster.core import context
from galicaster.utils.visca import recall

class DistribUI(gtk.Box):
    __gtype_name__ = 'DistribUI'

    def __init__(self):
        gtk.Box.__init__(self)
        dbuilder= gtk.Builder()
        dbuilder.add_from_file(get_ui_path('distrib.glade'))
        self.builder = dbuilder

        # other gui elements omitted

        presets = []
        for i in range(6):
            presets.append(dbuilder.get_object("button_pres"+str(i)))
            presets[i].connect("clicked", self.on_preset_button, i, presets)
            print presets

    def on_preset_button(self, origin, i, presets):
            recall(i)
            print presets

这是加载类后的输出:

[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>]
[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>, <gtk.Button object at 0x204ab90 (GtkButton at 0x20ad4b0)>]
[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>, <gtk.Button object at 0x204ab90 (GtkButton at 0x20ad4b0)>, <gtk.Button object at 0x204ac30 (GtkButton at 0x20ad630)>]
[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>, <gtk.Button object at 0x204ab90 (GtkButton at 0x20ad4b0)>, <gtk.Button object at 0x204ac30 (GtkButton at 0x20ad630)>, <gtk.Button object at 0x204acd0 (GtkButton at 0x20ad3f0)>]
[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>, <gtk.Button object at 0x204ab90 (GtkButton at 0x20ad4b0)>, <gtk.Button object at 0x204ac30 (GtkButton at 0x20ad630)>, <gtk.Button object at 0x204acd0 (GtkButton at 0x20ad3f0)>, <gtk.Button object at 0x204ad70 (GtkButton at 0x20ad570)>]
[<gtk.Button object at 0x204ab40 (GtkButton at 0x20ad330)>, <gtk.Button object at 0x204ab90 (GtkButton at 0x20ad4b0)>, <gtk.Button object at 0x204ac30 (GtkButton at 0x20ad630)>, <gtk.Button object at 0x204acd0 (GtkButton at 0x20ad3f0)>, <gtk.Button object at 0x204ad70 (GtkButton at 0x20ad570)>, <gtk.Button object at 0x204ae10 (GtkButton at 0x20ad6f0)>]

例如,点击按钮 1 后的输出如下:

[]
10 OK - no return value

最后一行是recall(i)的结果,它是一个外部子进程。就在此之前,您可以看到空列表:(

【问题讨论】:

  • 尝试在__init__中打印presets
  • 什么是dbuilder?看起来该框架正在对您的列表执行不支持您的用例的操作。
  • dbuilder 使用 glade 并从 xml 文件创建 gui 元素。即:我在glade 文件中声明了一个GtkButoon 元素。然后在 python 中,我可以使用 dbuilder 使用它的 id 构建按钮,在我的例子中是 button_pres[0-5]。
  • 所有 6 个按钮都显示在 gui 中,单击它们会执行预期的操作:第二个函数中的调用 (i) 已正确执行。

标签: python list function arguments glade


【解决方案1】:

建议您在这里发布您的日志,源代码更好。 听起来 connect 函数在调用 on_preset_button 之前做了一些事情

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2015-12-13
    相关资源
    最近更新 更多