【问题标题】:python, create multiple matplotlib button widgets in for looppython,在for循环中创建多个matplotlib按钮小部件
【发布时间】:2022-01-10 06:40:12
【问题描述】:

我需要在 matplotlib 中生成一个可变数量(总数)的按钮小部件,并让每个小部件在变量 var 中存储一个不同的数字。

import matplotlib.pyplot as plt
from matplotlib.widgets import Button as BT

total = 4

class Index:
    ind = 0
        
    def plot_pick(self, event):
        var=event
        print(var)

ax_chooseplot={}
chooseplot_BT={}
callback=Index()

for i in range(0,total):
    loc=0.95-i*0.03
    ax_chooseplot[i] = plt.axes([loc-0.002, 0.87, 0.02, 0.03])
    chooseplot_BT[i] = BT(ax_chooseplot[i], '')
    chooseplot_BT[i].on_clicked(callback.plot_pick(i))         
    
plt.show()

此代码按顺序打印 i 然后按任意按钮:

TypeError: 'NoneType' object is not callable

似乎在 for 循环期间调用了函数“plot_pick”,然后丢弃了 i 的值?

我已经看到为 tkinter 按钮解决了这个问题,但我无法将这些答案应用于 matplotlib 嵌入式按钮。有没有简单的方法来解决这个问题?

【问题讨论】:

    标签: python for-loop matplotlib tkinter button


    【解决方案1】:

    问题来自您将i 参数传递给plot_pick 函数的方式。将其直接传递给您的函数将不起作用。一种可能的替代方法是使用functools.partial。您可以在下面找到一个示例,其中我使用functools.partial 打印被点击按钮的索引:

    import matplotlib.pyplot as plt
    from matplotlib.widgets import Button as BT
    import functools
    
    total = 4
    
    class Index:
        ind = 0
    
        def plot_pick(self,i, event):
            print('Button '+str(i))
            
    
    ax_chooseplot={}
    chooseplot_BT={}
    callback=Index()
    
    
    for i in range(0,total):
        loc=0.95-i*0.03
        ax_chooseplot[i] = plt.axes([loc-0.002, 0.87, 0.02, 0.03])
        chooseplot_BT[i] = BT(ax_chooseplot[i], str(i))
        chooseplot_BT[i].on_clicked(functools.partial(callback.plot_pick,i))  
       
        
    plt.show()
    

    【讨论】:

    • 谢谢,成功了!
    • 不客气。如果您对结果感到满意,您可以通过勾选我的答案旁边的绿色复选标记将问题标记为已回答。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2020-07-23
    • 2022-07-07
    相关资源
    最近更新 更多