2015-12-22 61 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是第一個數字 –