2015-12-22 59 views
0

我需要通过另一个m文件来控制gui组件,例如,如果我有一些按钮,我想让他通过某个m文件禁用(而不是gui m文件,但在相同的工作空间)。问题是,M档无法识别按钮(因为它是一个不同的文件),所以我不能使用这个命令:MATLAB GUI和m文件控制组件

set(handle.pushbutton, 'Enable', 'off') 

你有一些想法做呢?我曾尝试使用全局变量,它不是working..that是whay我已经试过:

在GUI M档

,并在其他M档(不是GUI M档) :

global h; 
set(h,'Enable', 'off'); 
+0

如果h已经在使用,可能在程序运行时可能会更改,如果使用GLOBAL_HANDLES这样的长名称和唯一名称,可能会更好。无论如何,全局变量的长名称是很好的练习,因为它们可能会导致很多麻烦。 –

+0

您可能需要在致电set(h,'enable','on')后致电[guidata](http://uk.mathworks.com/help/matlab/ref/guidata.html) –

+0

我该怎么办它? –

回答

2

您可以使用findobj“发现”与您的GUI从M文件中相关的人物,得到了孩子和访问要禁用按钮,然后将其禁用。为了方便起见,给每个元素添加标签,以便在需要时很容易找到。

举个例子,假设你给的名字“MyFigure”到GUI的图形它的创作过程:

hfigure = figure('Position',[100 100 200 100],'Units','normalized','name','MyFigure'); 

,并给予标签“为myButton”的按钮:

hButton1= uicontrol('Style','push','String','1','Position',[40 50 50 30],'Tag','MyButton'); 

现在在你的M档,你可以用这个命令来访问这个数字(注意,需要打开):

F = findobj('Name','MyFigure'); 

由于您的GUI的所有元素实际上是主要人物的孩子,你可以用“孩子”访问他们的财产,再次使用findobj

PushHandles = findobj(F.Children,'style','pushbutton','Tag','MyPushbutton') 

你现在有把手到您的按钮保存在PushHandles,其中您可以根据需要启用/禁用:

set(PushHandles,'Enable','off'); 

yay!

+0

我不明白第一个命令(hfigure = ...),我应该把它放在哪里? –

+0

你在使用GUIDE吗?如果是这样,您可以简单地在属性检查器中编辑GUI的名称。 –

+0

yes..ok并将所有其他命令放在m文件中?因为我已经尝试过了,并且出现错误。 它在m文件(名称是GUI)中看起来如何: F = findobj('Name','GUI'); PushHandles = findobj(F.Children,'style','pushbutton','Tag','pushbutton1'); set(PushHandles,'Value','off'); –

0

这是我执行Benoit的答案。

我在指南中创建了一个名为'TheGui'的gui。它保存在文件TheGui.fig和TheGui.m中。 TheGui有一个标签为'TheGuiButton'的按钮。

在MATLAB命令行中,我使用TheGui命令启动gui,并打开它。

在MATLAB命令窗口中使用此循环,我得到'TheGui'的句柄。我无法让F = findobj('Name','TheGui')工作。

for hx = findall(0, 'type','figure'),if isequal('TheGui',get(hx,'name')),hGui=hx,end,end 

有了TheGui的句柄,我得到了一个按钮(唯一的孩子)的句柄。

hButton = findobj(hGui,'style','pushbutton') 

我可以看到,这就是我想要的东西用

v = get(hButton) 

检查其属性和我可以改变按钮的属性这样

set(hButton,'enable','off') 

我把这一切一起在一个MATLAB脚本文件中看到它的工作

for hx = findall(0, 'type','figure') 
    if isequal('TheGui',get(hx,'name')) 
    hGui=hx 
    end 
end 
hButton = findobj(hGui,'style','pushbutton') 
for i = 1:10 
    set(hButton,'enable','off') 
    pause(1) 
    set(hButton,'enable','on') 
    pause(1) 
end 
+0

确定它现在的作品,但为什么你使用循环,如果?我把它没有for循环,它的工作.. 我只写这个命令:hGui = findall(0,'type','figure') –

+0

你可能有多个数字,特别是如果你的程序做了很多情节。 –

+0

但在我的程序中gui是第一个数字 –