当类在函数内时,为什么类中的全局行为会有所不同?

阿德里安·汤普金斯

我试图用来ginput注册地图上的点击,并想使用 matplotlib 小部件添加操作按钮。在下面的代码中,我可以通过将 action 的值声明为 a 来将其传递回主代码global如果我点击地图,action=0,如果我点击按钮,action=1,根据需要。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.widgets import Button

class Index:
    def test(self, event):
        global action
        action=1

# fake data
x=np.arange(30)
y=x**2
fig,ax=plt.subplots()
ax.plot(x,y)
callback = Index()
buttonname=['test']
colors=['white']
idx=[0.2]
bax,buttons={},{}

# set up list of buttons.
for i,col,button in zip(idx,colors,buttonname):
    bax[button] = plt.axes([0.92, i, 0.07, 0.07])
    buttons[button] = Button(bax[button],button,color=col,hovercolor='green')
    buttons[button].on_clicked(getattr(callback,button))

# register click on plot
while True:
     pts=plt.ginput(1)
     plt.pause(0.5)
     print("action is ",action)
     action=0 # reset 

但我的困惑是,如果我采用完全相同的代码并将其放在 def 块中,则 action 的值不再传回,action始终为零。

def subtest():
    class Index:
        def test(self, event):
            global action
            action=1

    # fake data
    action=0
    x=np.arange(30)
    y=x**2
    fig,ax=plt.subplots()
    ax.plot(x,y)
    callback = Index()
    buttonname=['test']
    colors=['white']
    idx=[0.2]
    bax,buttons={},{}

    # set up list of buttons.
    for i,col,button in zip(idx,colors,buttonname):
        bax[button] = plt.axes([0.92, i, 0.07, 0.07])
        buttons[button] = Button(bax[button],button,color=col,hovercolor='green')
        buttons[button].on_clicked(getattr(callback,button))

    # register click on plot
    while True:
         pts=plt.ginput(1)
         plt.pause(0.5)
         print("action is ",action)
         action=0 # reset

res=subtest()

我很困惑为什么会发生这种情况。我尝试将类定义移到主代码中,但这没有帮助。我很高兴任何类型的解决方案(例如通过参数传递动作,我不知道如何处理小部件),因为我认为 的使用global经常被皱眉。global基于 - 的解决方案也很好。

真帕尔松

actioninsidesubtest是局部的子测试,而actioninsideIndex.test是全局的。要么声明action全局 in subtest,要么使用nonlocalin Index.test

(我怀疑没有全局变量可能有更好的解决方案,但由于我不熟悉 GUI 工具包,我将把它留给其他人。)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当类中的counter较大时,为什么java线程的行为会有所不同?

为什么OOP中的静态类的最佳实践会有所不同?

为什么我的html中的类顺序会有所不同?

为什么使用默认构造函数构造std :: string对象时,其行为会有所不同?

为什么从函数调用Bash的“源”命令的行为会有所不同?

为什么当类型实现接口时,行为会有所不同?

为什么在递增计数与递减计数时,for循环的行为会有所不同?

为什么从定制模块导入的函数在JSfiddle中工作时行为会有所不同?

为什么在测试用例中时,此TensorFlow代码的行为会有所不同?

tensorflow - 为什么在度量函数中调用数组时会有所不同?

为什么流到具有不同函数的输出时std :: numeric_limits <float> :: min()的行为会有所不同?

为什么hasattr在使用@property方法的类和实例上的行为有所不同?

为什么嵌套类在Java和C#之间的行为有所不同?

为什么带有边距的块元素在网格内的行为会有所不同?

为什么我的文本规范化在不同环境中的行为会有所不同?

为什么JavaScript“删除”运算符在不同浏览器中的行为会有所不同?

为什么当应用程序在后台时本机线程的行为会有所不同?

在直接分配或从get-content检索数组时,为什么数组的行为会有所不同

将VB.NET代码迁移到C#时,为什么for循环的行为会有所不同?

为什么在以“ self”为前缀时,Ruby实例方法调用的行为会有所不同?

为什么在使用ICustomTypeDescriptor时TypeDescriptor.GetProperties对于类型和对象的行为会有所不同

为什么使用交叉元运算符时** 2和²的行为会有所不同?

当环境将Dev更改为Prod时,为什么此Unzip Shell脚本的行为会有所不同?

提供通用类型与直接类型时,为什么Typescript映射元组类型的行为会有所不同?

为什么在for循环中更新Python生成器时,其行为会有所不同?

为什么当static_cast(ing)一个函数作废*时,编译器的行为会有所不同?

为什么在具有一级索引的MultiIndex列的熊猫DataFrame中,行为会有所不同?

为什么以foreach调用时,ForEach-Object的行为会有所不同?

为什么对于相同但按比例缩放的数据,绘图的行为会有所不同?