鱼C论坛

 找回密码
 立即注册
查看: 34|回复: 3

Tkinter报错

[复制链接]
发表于 10 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
Tkinter截图程序报错
  1. Exception in Tkinter callback
  2. Traceback (most recent call last):
  3.   File "c:\Users\h_qiy\AppData\Local\Programs\Python\Python313\Lib\tkinter\__init__.py", line 2068, in __call__
  4.     return self.func(*args)
  5.            ~~~~~~~~~^^^^^^^
  6.   File "D:\Users\python-user\ImageGrab\main.py", line 12, in get_keys
  7.     if event.keysym == "F1": full_scr(); print("full")
  8.                              ~~~~~~~~^^
  9.   File "D:\Users\python-user\ImageGrab\main.py", line 19, in full_scr
  10.     screenshot.save(f"{image_dir}ScreenShot{datetime.now().__str__()}.png")
  11.     ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  12.   File "c:\Users\h_qiy\AppData\Local\Programs\Python\Python313\Lib\site-packages\PIL\Image.py", line 2583, in save
  13.     fp = builtins.open(filename, "w+b")
  14. OSError: [Errno 22] Invalid argument: 'D://ImageGrab/ScreenShots/ScreenShot2025-08-24 00:31:28.245790.png'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 10 小时前 | 显示全部楼层
您好!您的Tkinter截图程序报错是因为文件路径或文件名中包含无效字符。具体来说:

1. 路径中使用 "D://" 可能不正确(Windows中应使用 "D:/" 或 "D:\\")。
2. 文件名中的日期时间包含空格和冒号,这些在Windows文件名中是非法字符。

解决方案:
- 使用 os.path.join() 来处理路径,确保跨平台兼容。
- 使用 strftime() 格式化日期时间,避免非法字符(例如用下划线替换)。
- 确保保存目录存在(必要时创建它)。

修改后的代码示例:

  1. import os
  2. from datetime import datetime
  3. from PIL import ImageGrab

  4. # 定义截图保存目录(使用正斜杠或双反斜杠)
  5. image_dir = "D:/ImageGrab/ScreenShots/"  # 或 "D:\\ImageGrab\\ScreenShots\"

  6. def full_scr():
  7.     screenshot = ImageGrab.grab()
  8.     # 检查并创建目录
  9.     if not os.path.exists(image_dir):
  10.         os.makedirs(image_dir)
  11.     # 生成安全的文件名
  12.     timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
  13.     filename = f"ScreenShot{timestamp}.png"
  14.     full_path = os.path.join(image_dir, filename)
  15.     screenshot.save(full_path)
  16.     print("截图已保存:", full_path)
复制代码


关键修改:
- 使用 os.makedirs() 确保目录存在。
- 文件名中的时间部分用下划线连接(如 "2025-08-24_00-31-28"),避免非法字符。

如果问题仍然存在,请检查 image_dir 的定义是否正确(例如,不要有多余的斜杠)。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
本帖最后由 1q23w31 于 2025-8-24 06:28 编辑
  1. D://ImageGrab/ScreenShots/ScreenShot2025-08-24 00:31:28.245790.png
复制代码

文件名在windows中由于非法无法创建,具体创建规则如下
  1. https://blog.csdn.net/Dontla/article/details/135200176#:~:text=1.1%20%E9%81%BF%E5%85%8D%E4%BD%BF%E7%94%A8%E7%89%B9%E6%AE%8A%E5%AD%97%E7%AC%A61.2%20%E9%99%90%E5%88%B6%E6%96%87%E4%BB%B6%E5%90%8D%E9%95%BF%E5%BA%A6
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
1. 路径中使用 "D://" 可能不正确(Windows中应使用 "D:/" 或 "D:\\")。
2. 文件名中的日期时间包含空格和冒号,这些在Windows文件名中是非法字符。

解决方案:
- 使用 os.path.join() 来处理路径,确保跨平台兼容。
- 使用 strftime() 格式化日期时间,避免非法字符(例如用下划线替换)。
- 确保保存目录存在(必要时创建它)。

修改后的代码示例:

import os
from datetime import datetime
from PIL import ImageGrab

# 定义截图保存目录(使用正斜杠或双反斜杠)
image_dir = "D:/ImageGrab/ScreenShots/"  # 或 "D:\\ImageGrab\\ScreenShots\"

def full_scr():
    screenshot = ImageGrab.grab()
    # 检查并创建目录
    if not os.path.exists(image_dir):
        os.makedirs(image_dir)
    # 生成安全的文件名
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    filename = f"ScreenShot{timestamp}.png"
    full_path = os.path.join(image_dir, filename)
    screenshot.save(full_path)
    print("截图已保存:", full_path)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-24 11:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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