您好我发现使用turtle库和python的IDLE有点问题。请注意以下用Python 3.5.2编写的代码:
import turtle
turtle.Turtle()
input("Try moving/resizing the window in IDLE. Press enter than try again.")
在按Enter键输入之前,乌龟窗口将被标记为无响应,并且不允许用户调整其大小。也就是说,如果它与IDLE一起运行。但是,当运行诸如Windows命令提示符或PowerShell之类的东西时,它可以正常工作。
如果通过IDLE运行,在用户按下Enter后窗口可以然后自由移动并调整大小而没有任何问题。这带来的缺点是我们不再在脚本中,而是回到python的shell。当然,我们仍然可以通过shell与龟交互,但这不是我想要的实际应用程序。我的主程序使用input()来询问用户是否希望移动/旋转以及使用多少。这将保持无限循环,直到用户输入诸如“退出”之类的短语来结束程序。我会注意到,即使使用IDLE,乌龟仍会移动并被正确绘制。问题是窗口本身变得没有响应。内容都是正确的。
我很好奇为什么只有IDLE才给我这样的行为......不仅如此,有没有办法让乌龟窗口没有反应,仍然可以使用输入()等等?或许还有一个我没想到的替代方案?我的研究让我相信这与TkInter有关。这可以解释为什么它只能在IDLE之外工作。
下面的图片展示了我的困境。
答案 0 :(得分:1)
如您所料,主要问题是使用tkinter,而不是特别使用tkinter的turtle应用程序。我首先在IDLE中使用裸露的tk窗口进行了再现。
import tkinter as tk
root = tk.Tk()
input('prompt: ')
然后我在3.5.2中一次在Win10上的命令提示符中以交互方式运行上面的一行。第二行显示一个裸窗口,在TaskManager中添加一个条目,并在任务栏中添加一个Python图标。在CP和Tk之间来回点击会使相应的窗口和图标显示“活动”外观。窗口边框从灰色变为黑色,而图标背景从黑色变为灰色。
在输入输入语句时,但在返回之前,Tk窗口在标题栏和TaskManager中显示“没有响应”(几秒钟后)。窗口内侧的鼠标变为蓝色繁忙的圆圈。如上所述,窗口变为“活动”,可以移动,但无法调整大小,无法正常关闭(单击[X]会显示“无响应,关闭或等待?”框。
当语句输入时,tk窗口将再次正常响应。一旦“用户”输入任何内容,tk窗口就会以上述方式变为无响应,直到输入完成为止。
如果您在CP中重试并输入一些字符而没有按Enter键,您是否看到相同的无响应?
IDLE shell的不同之处:创建root会在TaskManager中添加一个新条目,但新窗口会附加到IDLE图标。在写入输入语句时,Tk窗口保持正常响应。所以在这个阶段,IDLE更好。当输入()语句被输入时,正如您所指出的那样,即使在任何条目之前,Tk窗口也会变得完全没有响应(无法移动)。这部分更糟糕。
我尝试了另一个实验:使用-n('无子进程')选项运行IDLE。
C:\Users\Terry>python -m idlelib -n
在这种模式下,我可以检测到没有问题(与CP不同)。当我跑龟时,这仍然是真的。您现在可以忽略弃用警告。
评论1:IDLE专为开发和学习而设计,不适用于生产执行。但如果有这样的优势,它可以用于后者。您只需检查使用-n不会引入任何其他问题,或者说,在同一进程中运行时,乌龟和您的代码不会干扰IDLE。
评论2:GUI程序通常不使用输入和打印。它们通常在没有控制台的情况下运行。如果使用input(),即使在Windows控制台中,用户也不应在响应提示之前触摸窗口。
评论3:GUI程序通常使用GUI小部件来获取和显示信息。乌龟使这变得更加困难,但并非不可能,正如turtledemo所证明的那样。您可以简化并调整turtledemo / main .py。
中的代码