如何使用复选按钮激活和停用功能?

时间:2018-12-20 10:35:04

标签: python matplotlib tkinter

我想激活和停用一种通过按下按钮来选择图像的感兴趣区域(ROI)的方法。我使用了一个检查按钮,如果按下或不按下,它会返回10。应该打开或关闭的功能是matplotlibs RectangleSelector。到目前为止,按下ROI按钮根本没有任何作用。

import sys
if sys.version_info[0] < 3:
    import Tkinter as Tk
else:
    import tkinter as Tk
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
from numpy.random import rand
from matplotlib.widgets import RectangleSelector

root = Tk.Tk()
root_panel = Tk.Frame(root)
root_panel.pack(side="top", fill="both", expand="no")

fig = Figure()
ax = fig.add_subplot(111)
img = ax.imshow(rand(10, 5), extent=(1, 2, 1, 2), picker=True)
ax.axis([0, 3, 0, 3])

canvas = FigureCanvasTkAgg(fig, master=root)
canvas.get_tk_widget().pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)
canvas._tkcanvas.pack(side=Tk.TOP, fill=Tk.BOTH, expand=1)

# ROI BUTTON
switch_variable = Tk.IntVar()
ROIBtn = Tk.Checkbutton(master=root_panel, text='ROI', indicatoron=False, 
variable=switch_variable)
ROIBtn.pack(side=Tk.LEFT)

def onselect(eclick, erelease):
    global switch_variable
    if switch_variable.get() == 1:
        x1, y1 = eclick.xdata, eclick.ydata
        x2, y2 = erelease.xdata, erelease.ydata
        global roi
        roi = (x1,y1,x2,y2)
        roi = list(map(int, roi))
        global cropped
        cropped = img[int(roi[1]):int(roi[3]), int(roi[0]):int(roi[2])]
        ax.clear
        ax.imshow(cropped)
        fig.canvas.draw()

def toggle_selector(event):
    global switch_variable
    if switch_variable.get() == 1:
        if event.key in ['Q', 'q'] and toggle_selector.RS.active:
            print('RectangleSelector deactivated.')
            toggle_selector.RS.set_active(False)
        if event.key in ['A', 'a'] and not toggle_selector.RS.active:
            print('RectangleSelector activated.')
            toggle_selector.RS.set_active(True)

if switch_variable.get() == 1:
    toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='box')
    fig.canvas.mpl_connect('key_press_event', toggle_selector)

root.mainloop()

我想知道的是如何使用switch_variable告诉程序何时使用onselect,什么时候不执行任何操作。谢谢!

2 个答案:

答案 0 :(得分:1)

您似乎完全是从here复制了部分代码,却不了解不同部分的功能。 toggle_selector函数确实可以完成您想做的事情,但是您需要在正确的时间运行它,并且需要检查所需的条件。

您需要了解的第一件事是,启动GUI时,功能中未包含的所有内容将仅执行一次。由于switch_variable的起始值为0,因此您的代码将跳过if switch_variable.get() == 1:的代码段,并且将永远不会对其进行重新评估。

您需要toggle_selector.RS = RectangleSelector(ax, onselect, drawtype='box')来启动RectangleSelector,但是您不需要fig.canvas.mpl_connect('key_press_event', toggle_selector),因为您不想将任何东西绑定到按键,而是想绑定到被点击的按钮。
您可以通过两种方式进行操作,或者在command=toggle_selector中使用CheckButton(请注意,在这种情况下,您需要在Checkbutton之前定义函数)或通过跟踪变量{{1} }。

然后,在switch_variable.trace("w", toggle_selector)函数中,将检查toggle_selector。在这种情况下,这没有任何意义,因为它使您可以使用event.key in ['Q', 'q']q键打开和关闭该功能,但在代码示例中使用了它,但是您不希望这样做。您唯一需要检查的是a拥有值switch_variable还是1

将所有内容合并为:

0

答案 1 :(得分:0)

由于toggle_selector()已基于按下的键用于启用/禁用RectangleSelector,因此command的{​​{1}}选项也可以使用它。

以下是根据您的代码修改的代码:

ROIBtn