Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 一个线性设置一个变量值与信号处理器功能,以响应来自GUI的信号?_Python_User Interface_Pyqt_Pyside - Fatal编程技术网

Python 一个线性设置一个变量值与信号处理器功能,以响应来自GUI的信号?

Python 一个线性设置一个变量值与信号处理器功能,以响应来自GUI的信号?,python,user-interface,pyqt,pyside,Python,User Interface,Pyqt,Pyside,不,问题不是重复的。这不是关于如何在python中表示a=1的问题 这不是小事。请仔细阅读 答案是:创建这样一个单行程序是不可能的,至少不使用肮脏的黑客是不可能的。有关详细信息,请参阅已接受的答案 如果你不想阅读,但来这里只是为了简单的因果报应,请不要再贬低我,因为公认的答案非常有用 问题: 我正在做一些GUI编程,希望创建一个非常短的信号处理程序,该处理程序将本地变量设置为一个值,以响应来自GUI的信号 def function(): output = False #this is l

不,问题不是重复的。这不是关于如何在python中表示a=1的问题

这不是小事。请仔细阅读

答案是:创建这样一个单行程序是不可能的,至少不使用肮脏的黑客是不可能的。有关详细信息,请参阅已接受的答案

如果你不想阅读,但来这里只是为了简单的因果报应,请不要再贬低我,因为公认的答案非常有用

问题:

我正在做一些GUI编程,希望创建一个非常短的信号处理程序,该处理程序将本地变量设置为一个值,以响应来自GUI的信号

def function():
    output = False #this is local variable; I want to change its value by signal handler
    button = PyQt4.QtGui.QPushButton("simple button")
    #next line sets output to True
    button.pressed.connect(lambda:SOME_FUNCTION_I_AM_LOOKING_FOR(output, True))
    #Now output==True
你能建议用什么来代替我正在寻找的功能吗?显然,您不能只说button.pressed.connectoutput=True,因为output=True不是一个函数

为了说明我在寻找什么,这里有一个类似的例子:如果你想设置一个对象的属性,你可以使用setattr函数。这是上面代码的模拟,设置属性而不是局部变量:

def function():
    ...
    #create a dummy UserObject class and make an instance of it to store attributes
    output_object = type('UserObject', (), {})() 
    output_object.it_was_pressed = False #flags that button was pressed
    #when "pressed" signal of button is emitted, "it_was_pressed" attribute of output_object is set to True
    button = PyQt4.QtGui.QPushButton("simple button")
    button.pressed.connect(lambda: setattr(output_object, "it_was_pressed", True) 
那不是我想做的。我想做的是创建一个模拟,以设置一个局部变量来响应信号:

更新:


我要求的是一个线性解决方案:简洁和优雅。当然,我可以分三行来做,但我不想

如果您只关心布尔检查,您可以使用一些Python习惯用法:

output = {} # similar to False case

def callback_func(output, val):
    if val:
       output['set']=True
    else:
       output.clear()
如果dictionary为空,它将被计算为False,否则将被计算为true。

没有可靠的方法以编程方式修改本地环境,即没有显式赋值

例如,这在python2中起作用:

>>> def test():
...     output = False
...     exec('output=True')
...     print(output)
... 
>>> test()
True
>>> test()
True
但是它在python3中不起作用

>>> def test():
...     output = False
...     exec('output=True')
...     print(output)
... 
>>> test()
False
修改返回的词典可能不起作用,例如:

>>> def test():   #python 2 and 3
...     output = False
...     locals()['output'] = True
...     print(output)
... 
>>> test()
False
它可能适用于一些旧版本的python

exec可能在python2中工作,因为它是一个语句,因此python编译器可以确定函数是否真的需要使用dict来存储其变量并使exec正常工作。检查这一点非常简单:

>>> def test():
...     exec('pass')
...     locals()['output'] = True
...     print(output)
... 
>>> test()
True
>>> def test():
...     locals()['output'] = True
...     print(output)
... 
>>> test()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in test
NameError: global name 'output' is not defined
在python2中,你甚至没有非本地的,所以你必须使用一个黑客来解决这个问题,比如在输出中加入一个元素列表等等

我不排除存在一种丑陋的、不可读的、粗俗的方式来编写一个定义函数而不是lambda的单行程序!这就达到了你想要的,但我敢肯定,没有一种简洁优雅的线条能满足你的需求

显然,如果您不介意将输出作为一个列表,那么您可以执行以下操作:

output = [False]

button.pressed.connect(lambda: output.__setitem__(0, True))

另请阅读:要么使用全局变量,要么传递self(如果它已经在类中)。@delnan不完全是这样,问题更具体地说是与回调函数相关的,IMOI担心短:回调函数有5行长。我接受一行lambda函数:注意,在第二个代码段中,输出是一个变量,而不是一个对象。我想设置output=True,而不是output.attribute=True。更一般地说,我想要一个函数,类似于exec output=1,类似于exec=1,如果exec是一个类似eval的函数的话。非常感谢您花时间阅读这个问题并编写一份完整的调查报告!我暂时不提这个问题,也许有人只是出于兴趣而提出了一种丑陋、不可读和刻薄的方式,但稍后会接受你的答案。
output = [False]

button.pressed.connect(lambda: output.__setitem__(0, True))