【问题标题】:Simultaneously control color of multiple buttons in matplotlibmatplotlib中同时控制多个按钮的颜色
【发布时间】:2017-08-18 12:41:49
【问题描述】:

我有三个白色按钮 [A,B,C]。单击其中任何一个按钮时,它们应立即变为绿色。依次单击多个按钮时,只有最近单击的按钮会变为绿色,其他按钮应返回到原来的白色状态。

我已阅读此页面Change matplotlib Button color when pressed,但没有帮助。这是我编写的代码。目前按钮甚至没有变成绿色。我正在使用 Matplotlib 2.0。

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

fig, ax = plt.subplots()


button_axcut={}
button={}

button_axcut['A'] = plt.axes([0.25,0.5, 0.1, 0.1])
button['A'] = Button(button_axcut['A'] ,'A', color='white')

button_axcut['B'] = plt.axes([0.45,0.5, 0.1, 0.1])
button['B'] = Button(button_axcut['B'] ,'B', color='white')

button_axcut['C'] = plt.axes([0.65,0.5, 0.1, 0.1])
button['C'] = Button(button_axcut['C'],'C', color='white')


def A_clicked(event):
    print('A')
    button['A'].ax.set_facecolor('green')
    button['B'].ax.set_facecolor('white')
    button['C'].ax.set_facecolor('white')

    button['A'].ax.figure.canvas.draw()
    button['B'].ax.figure.canvas.draw()
    button['C'].ax.figure.canvas.draw()

def B_clicked(event):
    print('B')
    button['A'].ax.set_facecolor('white')
    button['B'].ax.set_facecolor('green')
    button['C'].ax.set_facecolor('white')

    button['A'].ax.figure.canvas.draw()
    button['B'].ax.figure.canvas.draw()
    button['C'].ax.figure.canvas.draw()

def C_clicked(event):
    print('C')
    button['A'].ax.set_facecolor('white')
    button['B'].ax.set_facecolor('white')
    button['C'].ax.set_facecolor('green')

    button['A'].ax.figure.canvas.draw()
    button['B'].ax.figure.canvas.draw()
    button['C'].ax.figure.canvas.draw()

button['A'].on_clicked(A_clicked)
button['B'].on_clicked(B_clicked)
button['C'].on_clicked(C_clicked)

【问题讨论】:

    标签: python matplotlib interactive


    【解决方案1】:

    当我将代码作为脚本运行时,在末尾添加plt.show(),它已经可以正常工作了。这是在 python 2.7 中使用 matplotlib 2.0 测试的,使用 Qt4Agg 以及 TkAgg 后端。

    当将鼠标移出轴时,可以稍微压缩代码并确保按钮保持颜色:

    from matplotlib.widgets import Button
    import matplotlib.pyplot as plt
    
    fig, ax = plt.subplots()
    
    
    button_axcut={}
    button={}
    
    button_axcut['A'] = plt.axes([0.25,0.5, 0.1, 0.1])
    button['A'] = Button(button_axcut['A'] ,'A', color='white')
    
    button_axcut['B'] = plt.axes([0.45,0.5, 0.1, 0.1])
    button['B'] = Button(button_axcut['B'] ,'B', color='white')
    
    button_axcut['C'] = plt.axes([0.65,0.5, 0.1, 0.1])
    button['C'] = Button(button_axcut['C'],'C', color='white')
    
    def click(event):
        for b in ["A", "B", "C"]:
            if button[b].ax == event.inaxes:
                button[b].ax.set_facecolor('green')
                button[b].color = 'green'
            else:
                button[b].ax.set_facecolor('white')
                button[b].color = 'white'
        fig.canvas.draw_idle()
    
    
    for b in ["A", "B", "C"]:
        button[b].on_clicked(click)
    
    plt.show()
    

    【讨论】:

    • 我在 if 语句下添加了一个 print(b),它显示按钮工作正常,但是颜色仍然没有变为绿色。感谢您压缩我的代码,现在它读起来好多了。
    • 您能否更新问题以包含详细说明您如何运行代码?另外,在哪个系统上?您可以尝试使用不同的后端吗?
    猜你喜欢
    • 2013-07-16
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    相关资源
    最近更新 更多