鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: linying002

Ctrl+C 无法停止IDLE的死循环

[复制链接]
 楼主| 发表于 2023-12-16 22:05:03 | 显示全部楼层
代码是这样吗?
import tkinter as tk
tk = tk.Tk()

def on_key(event):
    if event.char == 'q':
        tk.quit()

def action():
    print("打倒反贼苏沪!")
    tk.after(1000, action)
   
thread = threading.Thread(target = tk.mainloop)
thread.start()

#绑定按键事件
tk.bind('<KeyPress>', on_key)

#延迟1秒后开始执行action函数
tk.after(1000, action)

#开启主循环
tk.mainloop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 22:05:15 | 显示全部楼层
linying002 发表于 2023-12-16 22:05
代码是这样吗?
import tkinter as tk
tk = tk.Tk() ...

非常抱歉,我之前的回答还是有误导性。在IDLE中,由于其特殊的交互模式,无法在同一进程中通过多线程运行Tkinter主循环来监听键盘输入。为了在IDLE中实现这个功能,我们可以结合使用`signal`模块来捕获键盘的中断信号。下面是一个修正后的示例代码,可以在IDLE中按下Ctrl+C来终止循环:import tkinter as tktk = tk.Tk()def on_key(event):    if event.char == 'q':        tk.quit()def action():    print("打倒反贼苏沪!")    tk.after(1000, action)# 捕获键盘中断信号signal.signal(signal.SIGINT, lambda *_: tk.quit())# 绑定按键事件tk.bind('', on_key)# 延迟1秒后开始执行action函数tk.after(1000, action)# 开启主循环tk.mainloop()请将这段修正后的代码复制到IDLE中运行,然后尝试按下Ctrl+C来终止循环。希望这次的回答能够正确解决你的问题。如果还有其他疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 22:11:51 | 显示全部楼层
FishC 发表于 2023-12-16 22:05
非常抱歉,我之前的回答还是有误导性。在IDLE中,由于其特殊的交互模式,无法在同一进程中通过多线程运行 ...

修改后的代码如下:
import tkinter as tk
tk = tk.Tk()

def on_key(event):
    if event.char == 'q':
        tk.quit()

def action():
    print("打倒反贼苏沪!")
    tk.after(1000, action)  

#捕获键盘中断信号
signal.signal(signal.SIGINT,lambda*_:tk.quit())

#绑定按键事件
tk.bind('<KeyPress>', on_key)

#延迟1秒后开始执行action函数
tk.after(1000, action)

#开启主循环
tk.mainloop()

run module 后提示如下:
= RESTART: D:/OneDrive/桌面/打倒反贼.py
Traceback (most recent call last):
  File "D:/OneDrive/桌面/打倒反贼.py", line 13, in <module>
    signal.signal(signal.SIGINT,lambda*_:tk.quit())
NameError: name 'signal' is not defined. Did you forget to import 'signal'?


我心态崩了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-16 22:12:03 | 显示全部楼层
linying002 发表于 2023-12-16 22:11
修改后的代码如下:
import tkinter as tk
tk = tk.T ...

非常抱歉,我忽略了一点,在使用`signal`模块之前需要先导入它。这是一个常见的错误,不用担心。请将代码中开头的`import signal`添加到代码的开头处,像这样:import signalimport tkinter as tktk = tk.Tk()# ...后续代码不变...现在,尝试再次运行代码,应该就能够正常捕获键盘中断信号并结束循环了。如果还有其他问题,请随时提问,我会尽力帮助你!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-17 13:02:17 | 显示全部楼层
在我的电脑里,下载了Python3.12,高版本的Python会自己停止死循环
下载:https://fishc.com.cn/thread-237835-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-22 17:03:22 | 显示全部楼层
hveagle 发表于 2023-12-17 13:02
在我的电脑里,下载了Python3.12,高版本的Python会自己停止死循环
下载:https://fishc.com.cn/thread-23 ...

我也是Python 3.12, 并没有自己停止死循环,都是我强制关掉的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-26 18:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表