如何使用 Matlab App Designer 在标签中包装文本
How to wrap text in a label using Matlab's App Designer
我正在使用 Matlab 的 App Designer 制作一个 GUI 应用程序。我有一个标签,我将其放入 GUI 中,用于向用户提供说明。随着他们的进行,说明文本的长度会有所不同。当文本长度到达标签末尾时,它给出 ...
并切断消息。我希望文本环绕在标签内。
我试过textwrap
,但它给了我一个错误,指出父项不能是标签。
要重现,请在 Matlab 的 App Designer 上创建一个新应用程序,将标签拖放到 canvas 上,然后在其中键入一个长文本。标签大小将调整以使其离开应用 window。如果您将标签宽度调整回来,它只会切断带有 ...
的文本,如下所示:
按 Run
不会改变它。
当我将文本更改为没有新行的字符串时,这是我想要自动生成的内容:
我用来更改文本的代码是这样的:
methods (Access = private)
% Callback function
function ButtonPushed(app, event)
app.Label.Text = "Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.";
end
end
我希望我不需要重新发明轮子和设计我自己的文本环绕功能。是否有文档中尚未阐明的执行此操作的方法?
您可能不再需要它,但对于遇到与 OP 和我相同问题的任何人:我已经为 textwrap
编写了一个包装器。这是:
function wrapLabelText(label, txt)
% Create a uicontrol whose text will look like that of the label.
h = uicontrol( ...
'Style', 'Text', ...
'Parent', figure('Visible', 'off'), ... % Make sure the containing figure is invisible.
'Position', label.Position, ...
'FontUnits', 'pixels', ... % By default App Designer uses 'pixels' but uicontrol uses 'points'. Define before the FontSize!
'FontSize', label.FontSize, ...
'FontName', label.FontName, ...
'FontAngle', label.FontAngle, ...
'FontWeight', label.FontWeight, ...
'HorizontalAlignment', label.HorizontalAlignment ...
);
% Determine where the text will be wrapped.
outtext = textwrap(h, {txt});
delete(h);
% Assign the text to the label.
label.Text = outtext;
end
第一个输入是 uilabel 对象,第二个是您想要作为 Text
属性 的文本。因为我们正在创建一个图形并再次删除它,所以它不是非常快(更新约 0.05 秒)。在您的代码中,您可以将其称为:
% Callback function
function ButtonPushed(app, event)
txt = 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.';
wrapLabelText(app.Label, txt);
end
结束
直接在 uilabel 上使用 textwrap 不起作用的原因是因为 textwrap 适用于使用 GUIDE 而不是 App Designer 创建的组件。 App Designer 可能有替代品,但我不知道。
或者,您可以使用 "Edit Field (Text)" 组件而不是标签,它会自动换行文本。
非常感谢您的代码,由于某种原因它在我的 MATLAB 2019b 中不起作用,通过在这一行中添加最大文本宽度选项来修复:
*outtext = textwrap(h, {txt}, 20);*
20 表示最大文本宽度为 20 个字符。
我正在使用 Matlab 的 App Designer 制作一个 GUI 应用程序。我有一个标签,我将其放入 GUI 中,用于向用户提供说明。随着他们的进行,说明文本的长度会有所不同。当文本长度到达标签末尾时,它给出 ...
并切断消息。我希望文本环绕在标签内。
我试过textwrap
,但它给了我一个错误,指出父项不能是标签。
要重现,请在 Matlab 的 App Designer 上创建一个新应用程序,将标签拖放到 canvas 上,然后在其中键入一个长文本。标签大小将调整以使其离开应用 window。如果您将标签宽度调整回来,它只会切断带有 ...
的文本,如下所示:
按 Run
不会改变它。
当我将文本更改为没有新行的字符串时,这是我想要自动生成的内容:
我用来更改文本的代码是这样的:
methods (Access = private)
% Callback function
function ButtonPushed(app, event)
app.Label.Text = "Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.";
end
end
我希望我不需要重新发明轮子和设计我自己的文本环绕功能。是否有文档中尚未阐明的执行此操作的方法?
您可能不再需要它,但对于遇到与 OP 和我相同问题的任何人:我已经为 textwrap
编写了一个包装器。这是:
function wrapLabelText(label, txt)
% Create a uicontrol whose text will look like that of the label.
h = uicontrol( ...
'Style', 'Text', ...
'Parent', figure('Visible', 'off'), ... % Make sure the containing figure is invisible.
'Position', label.Position, ...
'FontUnits', 'pixels', ... % By default App Designer uses 'pixels' but uicontrol uses 'points'. Define before the FontSize!
'FontSize', label.FontSize, ...
'FontName', label.FontName, ...
'FontAngle', label.FontAngle, ...
'FontWeight', label.FontWeight, ...
'HorizontalAlignment', label.HorizontalAlignment ...
);
% Determine where the text will be wrapped.
outtext = textwrap(h, {txt});
delete(h);
% Assign the text to the label.
label.Text = outtext;
end
第一个输入是 uilabel 对象,第二个是您想要作为 Text
属性 的文本。因为我们正在创建一个图形并再次删除它,所以它不是非常快(更新约 0.05 秒)。在您的代码中,您可以将其称为:
% Callback function
function ButtonPushed(app, event)
txt = 'Lorem ipsum dolor sit amet consectetur adipiscing elit. Vivamus scelerisque nisi ac enim faucib porttitor velit varius. Phasellus luctus ullamcorper nul sit amet finibus neque vehicula ut. Nulla pellentesque.';
wrapLabelText(app.Label, txt);
end
结束
直接在 uilabel 上使用 textwrap 不起作用的原因是因为 textwrap 适用于使用 GUIDE 而不是 App Designer 创建的组件。 App Designer 可能有替代品,但我不知道。
或者,您可以使用 "Edit Field (Text)" 组件而不是标签,它会自动换行文本。
非常感谢您的代码,由于某种原因它在我的 MATLAB 2019b 中不起作用,通过在这一行中添加最大文本宽度选项来修复:
*outtext = textwrap(h, {txt}, 20);*
20 表示最大文本宽度为 20 个字符。