PyGtk:单击按钮时将最新数据传递给模块?

PyGtk: pass most recent data to module when button clicked?

我想知道如何更新通过 PyGtk 表达式发送的变量 button.connect("clicked", funct, data)。我希望我的函数在单击按钮时接收最新数据,而不是调用 button.connect() 时存在的数据。

http://mailman.daa.com.au/pipermail/pygtk/2006-October/013018.html 回答了一个非常相似的问题,但没有像我的问题那样涉及使用单独的 python 文件。

具体来说,我的代码有两个python文件,main.pyutils.py,我要调用的函数在utils.py中。如果我将 on_clicked 函数放在定义了 data 变量的 main.py 中,代码将按预期工作,但我不想这样做,因为它会干扰模块化。

utils.py 包含一些带参数的函数:

def on_click(button, data):
    print(data)

main.py 通过 button.connect() 表达式调用此函数:

import utils

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

data = "1"

win = Gtk.Window()
button = Gtk.Button(label="call the on_click function")
button.connect("clicked", utils.on_click, data)
win.add(button)

data = "2"

win.show_all()
Gtk.main()

data更新时,on_clicked仍然使用旧的data;即 1 正在打印。我尝试在 data 更新后再次调用 button.connect("clicked", utils.on_click, data),但这似乎会导致其自身的问题并且不是很优雅 - connect() 应该只调用一次。

您正在传递一个对象,然后将数据分配给另一个对象。回调只知道第一个对象。

有一些方法,但我会举一个简单的例子,你用 setter/getter 创建一个 class 然后你就可以改变 属性 的值在回调知道的对象实例中:

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

class UserData:
    def __init__(self, data_value):
        self.data = data_value;

    def setData(self, new_value):
        self.data = new_value

    def getData(self):
        return self.data

def on_click(button, data):
    print(data.getData())

data = UserData("1")

win = Gtk.Window()
button = Gtk.Button(label="call the on_click function")
button.connect("clicked", on_click, data)
win.connect("destroy", Gtk.main_quit)
win.add(button)

data.setData("2") 

win.show_all()
Gtk.main()