我想创建一个gui,它读取文件夹中的所有文件(每种情况下文件的数量变化(ii)),然后文件数量(ii)创建ii复选框。如果激活了复选框,则匹配文件将显示在图表上。
我的问题是在循环中创建回调:
function main
N=500;
M=300;
handles.fig=figure('Units', 'Pixels','Position',[100 100 N M]);
handles.axes=axes('Units', 'Pixels','Position',[25 25 N-200 M-50]);
for ii=1:4; %input exemple
handles.check{ii}=uicontrol('style','checkbox','string','Display','position',[N-150-ii*20 M/2 150 50]);
set(handles.check{ii},'Callback',{@checkbox_callback(ii), handles});
end
end
for ii=1:4;
function checkbox_callback(ii)(gcf, event_data, handles)
val=get(handles.check(ii),'Value');
if val
x=1:10;
y=1:10;
plot(x,y)
else
grid off;
end
end
end
答案 0 :(得分:0)
import scala.annotation.tailrec
import scala.util.Random
sealed trait GridValue
case object Bomb extends GridValue
case object Empty extends GridValue
case object Checked extends GridValue
case class Grid(private var grid: List[List[GridValue]]){
def click(x: Int, y: Int): String = {
grid(x)(y) match {
case Bomb => "BOOM! You lose!"
case Empty =>
grid = grid.updated(x, grid(x).updated(y, Checked))
"No bomb! Good Job"
case Checked => "You've already clicked here!"
}
}
}
object Grid{
def buildGrid(x: Int, y: Int, mines: Int): Grid = {
@tailrec
def placeMines(grid: List[List[GridValue]] = List.fill(x)(List.fill(y)(Empty)), minesRemaining: Int = mines): List[List[GridValue]] = {
if(minesRemaining == 0) {
grid
} else {
val xcoord = Random.nextInt(x)
val ycoord = Random.nextInt(y)
grid(xcoord)(ycoord) match {
case Bomb => placeMines(grid, minesRemaining)
case Empty => placeMines(grid.updated(xcoord,grid(xcoord).updated(ycoord, Bomb)), minesRemaining - 1)
}
}
}
Grid(placeMines())
}
}
//Start game: val game = Grid.buildGrid(100, 100, 5)
//Click: game.click(10, 10)
实际上只需要一个callback
。
因为您正在以编程方式创建GUI" (不是checkboxes
)您可以按如下方式修改代码:
创建GUIDE
更改创建轴的代码,如下所示
figure
即定义属性handles.axes=axes('Units', 'Pixels','tag','axes_tag','Position',[25 25 N-200 M-50]);
,您将在tag
中使用它; checkbox callaback
的{{1}}可与函数tag
一起使用,以访问uicontrol
更改复选框的defionition如下
findobj
即:
uicontrol
属性:因为你是一个循环,你可以通过将当前循环索引转换为字符串来定义不同的标记 handles.check{ii}=uicontrol('style','checkbox','string', ...
['Display_file_' num2str(ii)],'tag',['c_b_' num2str(ii)], ...
'position',[N-150 M/2-ii*20 100 25],'callback','plot_sel_cb(handles.axes)');
属性,以便为每个checkbos提供不同的字符串(这不是非常必要的)tag
并将轴句柄设置为输入参数复选框回调的定义
string
中使用callback
来访问uicontrols的属性(gcbo
返回已调用回调的uicontrol的句柄 - gcbo ==>获取回调对象)在单个回调中,您可以使用属性get
在下文中,您可以查找用于生成GUI窗口和复选框calback的脚本。
我已经修改了回调的definitioin,以便根据所选的复选框绘制不同的曲线。
GUI窗口
gcbo
复选框回调
tag
希望这有帮助。