2016-09-15 75 views
2

我創建了一個腳本,該腳本進入一個獲取傳入COM端口數據的while循環,並且還生成一個用所述數據更新的圖形。將按鈕添加到MATLAB圖(不是GUI)以退出循環

目前,我沒有一個優雅的方式來退出此循環。我希望能夠添加一些按鈕來完成這個任務,但是我對這個主題的瞭解很朦朧。

我真的不想創建一個圖形用戶界面,想知道我是否可以在我的身上拍一個按鈕。

我曾嘗試:

創建一個單獨的M文件,以容納一個按鈕,按下回撥,以獲得按鈕狀態:

function [button_state] = fun1(hObject, eventData) 
    button_state = get(hObject, 'Value'); 
end 

在while循環,我有以下按鈕聲明,其中'無花果'是我的人物圖:

while 1 > 0 

    ... 

    fig = figure(1); 

    ... 

    tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop', 'Callback', @fun1); 

    out = fun1(tb); 
    if out == 1 
     break; 
    end 

end 

似乎沒有工作...任何幫助,非常感謝。謝謝。

+0

邏輯上似乎很好...什麼並不完全工作?你有錯誤嗎? '價值'沒有得到你期望的價值?函數從未被調用過? –

回答

3

如果您發現自己在主循環中創建了任何對象,那麼很有可能您沒有做正確的事情:在循環的每次迭代中,都會創建一個新的togglebutton。儘管它們在同一地點重複創建,但它在視覺上並不明顯。事實上,如果您能夠快速點擊以便點擊在該按鈕被下一個按鈕覆蓋之前完成,您的代碼就可以工作。

您應該改爲在循環外部創建togglebutton,如果您只是對其Value屬性感興趣,則不需要使用回調。此外,您還需要使用drawnowpause在各個地方,以確保所有的事件得到妥善處理:

fig = figure(1); 
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop'); 
drawnow; 
while true 
    drawnow; 
    if (get(tb, 'Value')==1); break; end 
end 
close all 
+0

沒有看到這個,當我寫我的,好的寫作 – Trogdor

+0

謝謝,這工作得很好! – pj2452

-1

實際上我認爲你應該將你的代碼添加到fun1.m中,因爲如果你在按鈕上添加回調屬性時按下按鈕,fun1.m會被引用。個人而言,我並不建議你處理GUI while循環。

0

另一種解決方案是使用一個全局變量(例如stoploop)。

修改你的函數fun1

function [button_state] = fun1(hObject, eventData) 
    global stoploop 
    stoploop = (get(hObject, 'Value')==1); 
    % in new version of MATLAB 
    % stoploop = (hObject.Value==1); 
end 

和主腳本:

global stoploop 
stoploop = false; 

... 

fig = figure(1); 
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop', 'Callback', @fun1); 
% declaration of button inside while-loop is not necessary 

while true 

    ... 

    if stoploop 
     stoploop = false; 
     break 
    end 

end  

while -loop您可以使用短版本:

while ~stoploop 

    ... 

end 
2

好了,你有夫婦問題。

  1. 您正在while循環中創建按鈕,所以它會一遍又一遍地創建它自己。

  2. 你給它一個回調,並直接調用回調。在這種情況下,你甚至不需要回調函數,因爲按下按鈕會改變Value屬性。

您可以通過創建按鈕然後直接在循環內檢查其值來實現您的目標。

下面是一些代碼,你想要做什麼:

fig = figure(1); 
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop'); 

while true % loop for forever 
    drawnow %this command makes sure background functions (callbacks) run 
    if tb.Value == 1 %read the value of the uicontrol 
    % alternatively use: if get(tb, 'Value') == 1  
     break; 
    end 
end 

編輯:下面是一個更簡單的方法來做到這一點

fig = figure(1); 
tb = uicontrol(fig, 'Style', 'togglebutton', 'String', 'Stop'); 

while tb.Value == 0 % loop until button is pressed 
    % do stuff 
    drawnow % run background functions 
end 
+0

謝謝你的幫助! – pj2452