python - Tkinter 在运行 input() 时无响应,在空闲时更糟

标签 python python-3.x tkinter python-idle turtle-graphics

您好,我在使用 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 键输入之前,turtle 窗口将被标记为无响应且不允许用户调整其大小。也就是说,如果它以 IDLE 运行。但是,当运行诸如 Windows 命令提示符或 PowerShell 之类的东西时,它工作得非常好。

如果通过 IDLE 运行,在用户按下回车键后,窗口可以然后自由移动和调整大小,不会有任何问题。这样做的缺点是我们不再在脚本中,而是回到了 python 的 shell。当然,我们仍然可以通过 shell 与 turtle 交互,但这不是我在实际应用程序中想要的。我的主程序使用 input() 询问用户是否希望移动/旋转以及移动/旋转多少。这将保持无限循环,直到用户输入诸如“退出”之类的短语来结束程序。我会注意到,即使在 IDLE 下, turtle 仍然会移动并正确绘制。问题是窗口本身变得无响应。内容全部正确。

我很好奇为什么只有 IDLE 会给我这样的行为...不仅如此,有没有办法让 turtle 窗口不响应并且仍然使用 input() 等?或者也许有一个我没有想到的替代方案?我的研究使我相信这与 TkInter 有关。这可以解释为什么它只能在 IDLE 之外工作。

下图展示了我的困境。

Unresponsive turtle window

最佳答案

如您所料,主要问题出在 tkinter,而不是特别是使用 tkinter 的 turtle 应用程序。我首先在 IDLE 中使用裸 tk 窗口进行复制。

import tkinter as tk
root = tk.Tk()
input('prompt: ')

然后我在 3.5.2 中一次在 Win10 的命令提示符中以交互方式运行上述一行。第二行显示一个裸窗口,在 TaskManager 中添加一个条目,并在任务栏中添加一个 Python 图标。在 CP 和 Tk 之间来回单击会导致相应的窗口和图标获得“事件”外观。窗口边框从灰色变为黑色,而图标背景从黑色变为灰色。

在键入输入语句时,但在按回车键之前,Tk 窗口的标题栏和任务管理器中都显示“无响应”(几秒钟后)。将鼠标悬停在窗口内部变成蓝色的忙碌圆圈。如上所述,窗口变为“事件”,可以移动,但不能调整大小,也不能正常关闭(单击 [X] 会弹出“没有响应,关闭或等待?”框。

当输入语句时,tk 窗口再次变为正常响应。一旦“用户”输入任何内容,tk 窗口就会以上述方式变得无响应,直到使用 Enter 完成输入。

如果您在 CP 中重试并输入一些字符而没有按 Enter,您会看到同样的无响应吗?

IDLE shell 的不同之处:创建 root 会在 TaskManager 中添加一个新条目,但新窗口会附加到 IDLE 图标上。在写入输入语句时,Tk 窗口保持正常响应。所以现阶段还是IDLE比较好。当输入 input() 语句时,正如您所注意到的,Tk 窗口甚至在任何输入之前就完全没有响应(无法移动)。这部分更糟。

我尝试了一个进一步的实验:使用 -n('no subprocess')选项运行 IDLE。

C:\Users\Terry>python -m idlelib -n

在这种模式下,没有我可以检测到的问题(与 CP 不同)。当我运行 turtle 时,情况仍然如此。您现在可以忽略弃用警告。

评论 1:IDLE 是为开发和学习而设计的,而不是为生产执行而设计的。但如果这样做有优势,它可以用于后者。您只需要检查使用 -n 不会引入任何其他问题,或者更确切地说, turtle 和您的代码在同一进程中运行时不会干扰 IDLE。

评论2:GUI程序通常不使用输入和打印。它们通常在没有控制台的情况下运行以与之交互。如果使用 input(),即使在 Windows 控制台中,用户在响应提示之前也不应触摸窗口。

评论 3:GUI 程序通常使用 GUI 小部件来获取和显示信息。正如 turtledemo 所展示的那样,Turtle 使这变得更加困难,但并非不可能。您可能会简化和调整 turtledemo/ma​​in.py 中的代码。

关于python - Tkinter 在运行 input() 时无响应,在空闲时更糟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40387329/

相关文章:

python - ValueError : numpy. dtype 大小错误,尝试重新编译

python - 寻找训练模型所需的最低特征的问题

python - 在 Python 中分组并查找连续时间并创建一个标志

python无法通过邮件发送附件文件

python 在 linux 上使用 os.system 传递参数

python-3.x - Boxsdk JWTAuth 一直给我这个错误 : 'NoneType' object has no attribute 'encode'

python - Tkinter:抓取 ScrolledText 文本板的内容

python - 如何使 tkinter 文本小部件不可选择?

python - 在 tkinter GUI 的另一侧制作按钮

python - 打印 Python 异常类型(在 Fabric 中引发)