如何在没有Racket中的frame [x]按钮的情况下退出GUI应用程序

时间:2016-08-15 12:24:14

标签: user-interface racket

“退出”是使用按钮在Racket中退出gui应用程序的正确方法,还是其他最适合的方法?

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    NSString *stringUrl = [url absoluteString];
    if ([stringUrl containsString:@"cancel"]) {

        // Handle if user cancelled the login
        [[NSNotificationCenter defaultCenter] postNotificationName:@"dropboxRegistrationCancel" object:self];
        return NO;
    }

    if ([[DBSession sharedSession] handleOpenURL:url]) {
        if ([[DBSession sharedSession] isLinked]) {
            NSLog(@"App linked successfully!");
            // At this point you can start making API calls
             [[NSNotificationCenter defaultCenter] postNotificationName:ApplicationComeBackFromDropBoxLoginPage object:self];
        }
        return YES;
    }
    // Add whatever other url handling code your app requires here
    return NO;
}

我发现DrRacket在使用退出按钮时给出了“禁止交互”警告消息,但在使用框架的[x]按钮关闭时有一个干净的退出。

我在此页面上找到了“退出”方法,但没有找到实际的退出方法:https://docs.racket-lang.org/gui/frame_.html?q=frame%25https://docs.racket-lang.org/reference/Exiting.html

也没有提及具体内容

我相信以下声明只会隐藏框架而不会关闭应用程序:

(define myfr 
    (new frame% [label "myframe"] [width 100] [height 100] ))
(new message% [label "my gui app"][parent myfr])
(define exitbutton 
    (new button% [parent myfr] [label "Exit"]
                 [callback   (lambda (b e)   (exit)  )]))
(send myfr show #t)

2 个答案:

答案 0 :(得分:1)

exit绝对是您希望结束应用程序的方式。但是,DrRacket中的REPL停止运行的原因是因为你的程序不再运行,即使你的程序中没有gui,也会在你调用exit时发生。

你也是对的:

(send myfr show #f)

会隐藏窗口但实际上不会退出应用程序。

因此,您可以做的一件事是尝试测试您是否在DrRacket中运行。如果你是,而不是退出程序,只需关闭窗口,让DrRacket在用户点击kill或启动新程序后退出应用程序。

问题在于,通常无法检测您是否在沙箱中运行。你可以用一些黑客来测试它,但它不是很强大:

Determin if a racket program is in a sandbox

另一种方法是创建自己的沙箱,并在该沙箱中运行程序(这就是DrRacket实际运行代码的方式)。然后,当您的程序退出时,仍然会有一个可用的repl。虽然请注意,repl将用于沙箱本身,而不是它所在的repl。

以下是creating a sandbox.

的文档

答案 1 :(得分:1)

Leif已经完全解释了这一点,但我只是想以更新手的观众来形容它。

" gui application"你提到的问题可能意味着不同的东西,这取决于你运行该代码的位置。

如果从DrRacket REPL运行,则lambda(exit)将退出REPL(导致"禁用交互"消息)。如果此代码是由racket可执行文件运行的脚本(例如,从命令行),它将退出该脚本/ shell(可能是您想要的)。

我不确定您是否想要尝试退出代码,如果您在沙盒或REPL中并且在每个环境中单击退出按钮时表现不同,但Leif还指出了答案它也是。

在Leif的回答中写这个不必要的补充的另一个原因是,我想指出你的术语" gui application"。如果我听起来很光顾,我很抱歉。在您的应用程序中显示gui框架或其他图形界面是您选择使用的功能,并且不会使应用程序有所不同。与操作系统的观点的一个区别是与顶级框架/窗口相关联的回调函数。并且这个回调函数非常好(很可能 - 尽管我没有检查球拍代码的细节),在我们的案例中由语言注册和处理。所以我想说 - 显示一个gui与否我会认为它们是相同的,它会在你打电话(退出)时退出。并且通常(可能)框架的x按钮将默认隐藏它(因为您已经知道,因此您添加了退出lambda函数)。您的应用程序可以在应用程序生命周期内取消隐藏它。