我想知道如何更新通过PyGtk表达式button.connect("clicked", funct, data)
发送的变量。我希望我的函数在单击按钮时接收最新数据,而不是在调用button.connect()
时存在的数据。
在http://mailman.daa.com.au/pipermail/pygtk/2006-October/013018.html回答了一个非常类似的问题,但是没有涉及使用单独的python文件,正如我的问题所做的那样。
具体来说,我的代码有两个python文件,main.py
和utils.py
,我要调用的函数位于utils.py
。如果我将on_clicked
函数放在main.py
内,data
变量已定义,但我不想这样做,因为它会干扰模块化。 / p>
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
。我尝试在button.connect("clicked", utils.on_click, data)
更新后再次调用data
,但这似乎会导致问题并且不是很优雅 - connect()
只需要调用一次。
答案 0 :(得分:0)
您正在传递一个对象,然后将数据分配给另一个对象。回调只知道第一个对象。
有一些方法,但我给出一个简单的例子,你用setter / getter创建一个类,然后你就可以改变回调知道的对象实例中属性的值: / p>
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()