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.py
和utils.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()
我想知道如何更新通过 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
函数放在定义了 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()