creating a GUI with edit box and push button

2 visualizaciones (últimos 30 días)
Noa Prasquier
Noa Prasquier el 21 de Abr. de 2021
Comentada: Jan el 22 de Abr. de 2021
Hi,
I need to write a code that will create a editable text box and I have a few questions about it
How and where to insert a function that will place my text into 5 lines?
Here's my code and the output is an error :
I think there are a lot of things to modify so I would really appreciate your help :
clc;clear all; close all;
figures=figure()
global text
set(gcf,'CurrentAxes',figures.Children)
%button.Callback=@testoccurences2;
button = uicontrol('Style','pushbutton','String','Count Letters','Position',[50 50 300 75]);
editbox=uicontrol('Style','edit','String','0','Position',[200 200 100 100]);
editbox.Callback=@ (src,evt)entertext
button.Callback=@(src,evt) get_occurences(text);
function[]=entertext()
global text
prompt={'Enter poem'};
text=inputdlg(prompt);
end
function[]=get_occurences(String)
vect_A=[];
i=1;
for letter=String(1:length(String))
letter=lower(letter);
for alphabet=['a':'z']
A=count(String,alphabet);
vect_A(i)=A; %stock the value
i=i+1;
end
end
occ_table=array2table(vect_A);
occ_table.Properties.VariableNames = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}
end
When the user presses the button, a table needs to show up, with the alphabet and the nu;ber of occurences of each letter in the text

Respuestas (1)

Jan
Jan el 21 de Abr. de 2021
Editada: Jan el 21 de Abr. de 2021
Omit the brute clearing header
clc;clear all; close all;
It is a waste of time, kills other windows, and has not serious benefit. It is recommended by teachers, which remember to have learned this as pupils also. This is called "Cargo Cult programming".
Avoid global variables, because they are a shot in your knee.
Using "text" as a variable does not let you use the command text() anymore. This is called "shadowing" and a frequent source of unexpected behavior.
String(1:length(String)) is the same as String.
'a':'z' is a vector already. There is no need to included it in [ and ] , because this is Matlab concatenation operator. But you do not concatenate 'a':'z' to anything.
Now the actual problem:
for letter=String(1:length(String)) % < This is not used inside the inner loop
letter=lower(letter); % < So you can omit the outer loop
for alphabet=['a':'z']
A=count(String,alphabet);
vect_A(i)=A; %stock the value
i=i+1;
end
end
Althout the for letter loop is not used at all, the counting is performed as often as the String has characters. So vect_A contains the list of numers of repetitions repeatedly. vect_A has 26 * numel(String) values finally. Therefore assiging the 26 characters as names of the variables of the table cannot work.
Solution: Omit the outer loop.
function get_occurences(String)
vect_A = [];
i = 1;
for alphabet=['a':'z']
A = count(String,alphabet);
vect_A(i)=A; %stock the value
i=i+1;
end
occ_table = array2table(vect_A);
occ_table.Properties.VariableNames = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}
end
Or a simplified version:
function get_occurences(String)
CharList = 'a':'z';
vect_A = zeros(1, numel(CharList)); % pre-allocate
for k = 1:numel(CharList)
vect_A(k) = count(String, CharList(k));
end
occ_table = array2table(vect_A);
occ_table.Properties.VariableNames = num2cell(CharList);
end
  2 comentarios
Noa Prasquier
Noa Prasquier el 22 de Abr. de 2021
Editada: Jan el 22 de Abr. de 2021
Thanks for your answer, I tried it and this is what I got :
Moreover, another figure appears like a window with a message 'enter a poem'in addition to my edit text box. I dont know how to remove it since I can't find the part of the code that is related to it
figures=figure()
set(gcf,'CurrentAxes',figures.Children)
%button.Callback=@testoccurences2;
button = uicontrol('Style','pushbutton','String','Count Letters','Position',[50 50 300 75]);
editbox=uicontrol('Style','edit','String','0','Position',[200 200 100 100]);
editbox.Callback=@ (src,evt)entertext
button.Callback=@(src,evt) get_occurences1(text);
function[]=entertext()
prompt={'Enter poem'};
txt=inputdlg(prompt);
end
function get_occurences1(String)
vect_A = [];
i = 1;
for alphabet=['a':'z']
A = count(String,alphabet);
vect_A(i)=A; %stock the value
i=i+1;
end
occ_table = array2table(vect_A);
occ_table.Properties.VariableNames = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}
end
The output is :
Error using count
First argument must be text.
Error in pushbutton>get_occurences1 (line 21)
A = count(String,alphabet);
Error in pushbutton>@(src,evt)get_occurences1(text) (line 10)
button.Callback=@(src,evt) get_occurences1(text);
Error using inputdlg (line 367)
Error while evaluating UIControl Callback.
Jan
Jan el 22 de Abr. de 2021
What is the purpose of
set(gcf,'CurrentAxes',figures.Children)
Directly after opening a figure, it does not have Children. You set the CurrentAxes to the empoty matrix, which is the default already.
What is "text" in this line:
button.Callback=@(src,evt) get_occurences1(text);
? Please try somethiung like:
button.Callback=@(src,evt) get_occurences1(editbox.String);
I cannot guess, where "enter a poem" comes from. But you can find this out easily: Set a breakpoint in the first line of the code and step through it line by line. Then you will see, which line produces this output.

Iniciar sesión para comentar.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by