【问题标题】:Closing the figure window causes a new figure window to open关闭图形窗口会导致打开一个新的图形窗口
【发布时间】:2020-12-02 20:43:33
【问题描述】:

这是一个模拟时钟。它运行完美。但是一旦我关闭时钟,另一个人影就会打开,只有时钟指针显示。这使得停止程序变得困难。如何停止程序?

x=0;y=0;r=10;
hold on;
theta = 0:pi/60:2*pi;
xc = r * cos(theta);
yc = r * sin(theta);
h = plot(xc,yc,'r','linewidth',4);
axis off
r=9; i=1;
set(gca,'FontWeight','bold');

for theta = pi/6: pi/6: 2*pi
    y1 = r * cos(theta);
    x1 = r * sin(theta);
    plot([x1/9*8 x1/9*7],[y1/9*8 y1/9*7],'color',[0 0 1])
    text(x1/9*9.5,y1/9*9.5,num2str(i),'color',[0 0 1]);
    i=i+1;
end

for theta=pi/30 : pi/30 : 2*pi
    y1 = 10 * cos(theta);
    x1 = 10 * sin(theta);
    plot([x1/9*8 x1/9*7],[y1/9*8 y1/9*7],'color',[0 0 0])
end

while(1)
    tic
    c = clock;
    c = c(1,4:6);
    minute =c(1,2); sec=c(1,3);
    if (c(1,1)>12)
       hr = c(1,1)-12;
    else
       hr = c(1,1);
    end
    min1 = ceil(minute/12);
    theta = (hr*pi)/6 + (min1*pi)/30;
    f=figure(1); hold on;
    y1 = 3 * cos(theta); Yhr = [0 y1];
    x1 = 3 * sin(theta); Xhr = [0 x1];
    hrhnd=plot(Xhr,Yhr);hold on;
    theta1 = (minute*pi)/30;
    y2 = 4.5 * cos(theta1); Ymin = [0 y2];
    x2 = 4.5 * sin(theta1); Xmin = [0 x2];
    minhnd=plot(Xmin,Ymin);
    theta2 = (sec*pi)/30;
    y3 = 5 * cos(theta2); Ysec = [0 y3];
    x3 = 5 * sin(theta2); Xsec = [0 x3];
    sechnd=plot(Xsec,Ysec);
    z=toc;
    pause(1-z);
     delete(sechnd);
     delete(minhnd);
     delete(hrhnd);
end

【问题讨论】:

  • 预期的行为是什么?
  • 让它显示实时。它确实如此。但是当我关闭时钟动画时。其他奇怪的动画弹出
  • 你能运行它,看看它是否对你有同样的效果
  • 您只描述了实际行为,但我不清楚您要更改什么?预期的行为是什么?不,我无法运行代码。
  • 我得到了预期的行为。但它做的比预期的要多

标签: matlab matlab-figure


【解决方案1】:

关闭窗口时停止脚本的最简单方法是在窗口仍然存在的情况下在其循环中测试脚本。

我们通过创建一个图形窗口并记录其句柄来启动脚本:

fig = figure;

接下来,在循环中,我们使用ishandle检查窗口是否仍然存在:

while(ishandle(fig))
   ...
end

完整程序:

x=0;y=0;r=10;
fig = figure;       %!!! NEW LINE
hold on;
theta = 0:pi/60:2*pi;
xc = r * cos(theta);
yc = r * sin(theta);
h = plot(xc,yc,'r','linewidth',4);
axis off
r=9; i=1;
set(gca,'FontWeight','bold');

for theta = pi/6: pi/6: 2*pi
    y1 = r * cos(theta);
    x1 = r * sin(theta);
    plot([x1/9*8 x1/9*7],[y1/9*8 y1/9*7],'color',[0 0 1])
    text(x1/9*9.5,y1/9*9.5,num2str(i),'color',[0 0 1]);
    i=i+1;
end

for theta=pi/30 : pi/30 : 2*pi
    y1 = 10 * cos(theta);
    x1 = 10 * sin(theta);
    plot([x1/9*8 x1/9*7],[y1/9*8 y1/9*7],'color',[0 0 0])
end

while(ishandle(fig))    %!!! UPDATED LINE
    tic
    c = clock;
    c = c(1,4:6);
    minute =c(1,2); sec=c(1,3);
    if (c(1,1)>12)
       hr = c(1,1)-12;
    else
       hr = c(1,1);
    end
    min1 = ceil(minute/12);
    theta = (hr*pi)/6 + (min1*pi)/30;
    f=figure(1); hold on;
    y1 = 3 * cos(theta); Yhr = [0 y1];
    x1 = 3 * sin(theta); Xhr = [0 x1];
    hrhnd=plot(Xhr,Yhr);hold on;
    theta1 = (minute*pi)/30;
    y2 = 4.5 * cos(theta1); Ymin = [0 y2];
    x2 = 4.5 * sin(theta1); Xmin = [0 x2];
    minhnd=plot(Xmin,Ymin);
    theta2 = (sec*pi)/30;
    y3 = 5 * cos(theta2); Ysec = [0 y3];
    x3 = 5 * sin(theta2); Xsec = [0 x3];
    sechnd=plot(Xsec,Ysec);
    z=toc;
    pause(1-z);
     delete(sechnd);
     delete(minhnd);
     delete(hrhnd);
end

您可以通过不删除和重新绘制手,而是更新它们的位置来改进您的程序。您可以在循环之前执行hrhnd=plot(Xhr,Yhr);,将手画在其初始位置,然后set(hrhnd,'XData',Xhr,'YData', Yhr) 更新其位置。

你也可以在画完钟面之后axis equal,保证它是圆的。

请注意,您只需在顶部输入一次hold on,不需要在每个plot 命令之后。

【讨论】:

  • @Jason:另外,如果您只按照 Chris 的建议更新手的位置(而不是重新绘制),则手不会在每次更新时改变颜色。
猜你喜欢
  • 2017-09-12
  • 1970-01-01
  • 2021-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多