您好,我发现使用乌龟库和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。当然,我们仍然可以通过外壳与乌龟进行交互,但这并不是我在实际应用中想要的。我的主程序使用input()询问用户是否要移动/旋转以及移动多少。直到用户输入诸如“ quit”之类的词来结束程序之前,这一直处于无休止的循环中。我会注意到,即使处于“空闲”状态,乌龟仍会移动并正确绘制。问题在于窗口本身变得没有响应。内容全部正确。
我很好奇为什么只有IDLE会给我这样的行为……不仅如此,还有什么方法可以防止龟窗口不响应并仍然使用input()之类的方法?也许还有我没有想到的替代方法?我的研究使我相信,这与TkInter有关。那可以解释为什么它只在IDLE之外起作用。
下图显示了我的困境。
Unresponsive turtle window
最佳答案
如您所怀疑,主要问题是tkinter的问题,而不是使用tkinter的turtle应用程序的特别问题。我首先用裸露的tk窗口在IDLE中转载。
import tkinter as tk
root = tk.Tk()
input('prompt: ')
然后,我在3.5.2中一次在Win10的Command Prompt中以交互方式运行上面的一行。第二行显示一个裸窗口,在TaskManager中添加一个条目,并将Python图标添加到任务栏。在CP和Tk之间来回单击会导致相应的窗口和图标具有“活动”外观。窗口边框从灰色变为黑色,而图标背景从黑色变为灰色。
在键入输入语句时,但在按回车键之前,Tk窗口在标题栏和TaskManager中都显示“无响应”(几秒钟后)。鼠标移到窗口内部将变成蓝色的忙碌圈。窗口如上所述变为“活动”状态,并且可以移动,但不能调整大小,也不能正常关闭(单击[X]会弹出“无响应,关闭还是等待?”框。
输入该语句后,tk窗口将再次正常响应。一旦“用户”输入任何内容,tk窗口就会以上述方式无响应,直到用Enter完成输入。
如果您在CP中重试并输入了一些字符却未按Enter,您是否会看到同样的无响应?
IDLE外壳的区别:创建根目录将在TaskManager中放置一个新条目,但是新窗口将附加到IDLE图标上。在编写输入语句时,Tk窗口通常保持响应状态。因此,在此阶段,IDLE更好。输入input()语句后,如前所述,Tk窗口甚至在进行任何输入之前都变得完全无响应(无法移动)。这部分更糟。
我尝试了另一个实验:使用-n(“ no subprocess”)选项运行IDLE。
C:\Users\Terry>python -m idlelib -n
在这种模式下,我无法检测到任何问题(与CP不同)。当我跑乌龟时,情况依然如此。您现在可以忽略弃用警告。
评论1:IDLE是为开发和学习而设计的,而不是为生产执行而设计的。但是,如果这样做有优势,则可以用于后者。您只需要检查使用-n不会引起任何其他问题,或者在同一进程中运行时,turtle和您的代码不会干扰IDLE。
注释2:GUI程序通常不使用输入和打印。它们通常在没有控制台进行交互的情况下运行。如果使用input(),即使在Windows控制台中,用户也不应在响应提示之前触摸窗口。
注释3:GUI程序通常使用GUI小部件来获取和显示信息。如turtledemo所示,Turtle使这变得更加困难,但并非不可能。您可能会简化并改编turtledemo / main.py中的代码。
关于python - Tkinter在运行input()时无响应,在IDLE中更糟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40387329/