MATLAB:在循环中创建复选框及其回调

时间:2015-10-21 16:01:55

标签: matlab for-loop checkbox callback

我想创建一个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

1 个答案:

答案 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

enter image description here

希望这有帮助。