linying002 发表于 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()

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

linying002 发表于 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'?


我心态崩了{:10_245:}

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

hveagle 发表于 2023-12-17 13:02:17

在我的电脑里,下载了Python3.12,高版本的Python会自己停止死循环
下载:https://fishc.com.cn/thread-237835-1-1.html

linying002 发表于 2023-12-22 17:03:22

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

我也是Python 3.12, 并没有自己停止死循环,都是我强制关掉的。
页: 1 [2]
查看完整版本: Ctrl+C 无法停止IDLE的死循环