gpt4 book ai didi

python - 如何让 gobject.idle_add() 通过引用传递参数?

转载 作者:太空宇宙 更新时间:2023-11-04 01:40:16 25 4
gpt4 key购买 nike

我的 PyGTK 应用程序中有两个线程:

  • 运行 GTK 循环并执行所有 GUI 工作的主线程
  • 处理网络请求等的另一个线程

我需要让第二个线程从第一个线程获取一些信息,所以我调用:

variable = None
gobject.idle_add( function_in_main_thread, variable )

在主线程中我有:

def function_in_main_thread( variable ):
variable = 1

问题是第二个线程中的变量永远不会被设置。它的值保持在 None。那么我怎样才能让主线程真正修改另一个线程中的变量呢?

注意:我在脚本中有一些线程同步代码,以防有人担心修改其他线程中的变量。我从这个例子中省略了它,因为我觉得它确实不适用于实际问题。

最佳答案

在 Python 中,赋值总是在当前范围内创建名称。您传递的名称确实是对您创建的变量的引用,但赋值运算符将尝试在当前范围内找到它,如果不存在,则创建它。

>>> def assign_to(name, value):
... name = value
...
>>> name = "nothing"
>>> assign_to(name, 5)
>>> name
'nothing'

您可以改为传递对某种实例、类型甚至列表的引用,然后使用该实例的某些方法。

>>> def append_to_list(my_list, value):
... my_list.append(value)
...
>>> my_list = []
>>> append_to_list(my_list, 5)
>>> my_list
[5]

当然,该列表也可以只是一个具有“值”成员的空对象。

简而言之,如果您想执行类似于通过引用调用的操作,请避免使用赋值运算符。改用对象的某种方法。


有一个简洁的 guide to Python Namespaces由 Shrutarshi Basu 撰写,以防您想深入挖掘。为了了解赋值运算符在做什么,请查看 wp: Name Binding .它还解释了为什么不能在 Python 中重载赋值运算符。


此外,正如指出的,您需要调用gobject.threads_init()

关于python - 如何让 gobject.idle_add() 通过引用传递参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5845896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com