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

时间:2017-04-28 02:54:09

标签: python pygtk

我想知道如何更新通过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函数放在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()只需要调用一次。

1 个答案:

答案 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()