我想激活和停用一种通过按下按钮来选择图像的感兴趣区域(ROI)的方法。我使用了一个检查按钮,如果按下或不按下,它会返回1
或0
。应该打开或关闭的功能是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
,什么时候不执行任何操作。谢谢!
答案 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