Python 如何在回调函数中更新Gtk.Box对象?

Python 如何在回调函数中更新Gtk.Box对象?,python,pygobject,Python,Pygobject,单击按钮时,我想在两列上都添加一个条目。 这是我当前的代码。 python解释器说MainWindow对象没有属性a 如何从添加功能访问对象a和b 现在的新问题是,如何显示新创建的对象? 我试过: 将其添加到添加上的函数中的vbox对象中 如何更新hbox的 import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, GObject class MainWindow(Gtk.Window): de

单击按钮时,我想在两列上都添加一个条目。 这是我当前的代码。 python解释器说MainWindow对象没有属性
a

如何从添加功能访问对象
a
b
现在的新问题是,如何显示新创建的对象?
我试过:
将其添加到添加上的函数
中的
vbox
对象中

如何更新hbox的

import gi
gi.require_version('Gtk', '3.0')
from gi.repository
import Gtk, GObject

class MainWindow(Gtk.Window):

    def __init__(self): #initiate
        Gtk.Window.__init__(self)
        self.set_border_width(17)
        self.set_default_size(700, 400)

        # defining objects
        hb = Gtk.HeaderBar()
        hbox = Gtk.Box(spacing = 7)
        vbox0 = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
        vbox1 = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
        save_button = Gtk.Button("Save")
        hintlabel0 = Gtk.Label("Entry A")
        hintlabel1 = Gtk.Label("Entry B")
        add_button = Gtk.Button("New Entry")
        a = list()
        b = list()

        # appending
        a.append(a_entry())
        b.append(b_entry())

        # property setting
        hb.set_show_close_button(True)
        hb.props.title = "Cerebrium List Editor"
        self.set_titlebar(hb)
        hb.pack_end(save_button)
        hb.pack_end(add_button)
        add_button.connect("clicked", self.on_adding)


        # adding
        vbox0.add(hintlabel0)
        vbox1.add(hintlabel1)
        for i in range(0, len(a)):
            vbox0.add(a[i])
        for i in range(0, len(b)):
            vbox1.add(b[i])

        hbox.add(vbox0)
        hbox.add(vbox1)
        self.add(hbox)# flow control

        def on_adding(self, button):
            self.a.append(a_entry())
            self.b.append(b_entry())


class a_entry(Gtk.Entry):
    def __init__(self):
        Gtk.Entry.__init__(self)
        self.set_width_chars(25)

class b_entry(Gtk.Entry):
    def __init__(self):
        Gtk.Entry.__init__(self)
        self.set_width_chars(60)

win = MainWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()
python解释器说MainWindow对象没有属性“a”

要简单地解决这个问题,您必须设置
self.a
而不是
a
,这是一个局部变量

我发现你的列表很奇怪,只是直接修改Gtk.Box的内容

python解释器说MainWindow对象没有属性“a”

要简单地解决这个问题,您必须设置
self.a
而不是
a
,这是一个局部变量

我发现您的列表很奇怪,只需直接修改Gtk.Box内容即可。

更改此设置

add_button.connect("clicked", self.on_adding)
对此

add_button.connect("clicked", self.on_adding, vbox0, vbox1)
还有这个

def on_adding(self, button):
    self.a.append(a_entry())
    self.b.append(b_entry())
对此,请不要忘记上面评论中提到的
show()

def on_adding(self, button, vbox0, vbox1):
    entry = a_entry()
    self.a.append(entry)
    vbox0.add(entry)

    entry = b_entry()
    self.b.append(entry)
    vbox1.add(entry)
改变这个

add_button.connect("clicked", self.on_adding)
对此

add_button.connect("clicked", self.on_adding, vbox0, vbox1)
还有这个

def on_adding(self, button):
    self.a.append(a_entry())
    self.b.append(b_entry())
对此,请不要忘记上面评论中提到的
show()

def on_adding(self, button, vbox0, vbox1):
    entry = a_entry()
    self.a.append(entry)
    vbox0.add(entry)

    entry = b_entry()
    self.b.append(entry)
    vbox1.add(entry)

这次不再出现错误,但是否会将其添加到
vbox0
vbox1
?当我点击它时,它似乎没有显示额外的条目。不,它仍然不会显示新条目。我想使用列表的原因是我可以更容易地获取信息。这次不再出现错误,但是它会添加到
vbox0
vbox1
中吗?当我点击它时,它似乎没有显示额外的条目。不,它仍然不会显示新条目。我想使用列表的原因是我可以更容易地获取信息。