3

デスクトップの背景を変更するプログラムを書いています。これは、テキスト ファイルを読み取ることによって行われます。テキスト ファイルに BG ファイル名の 1 つが示されている場合、その 1 つを背景として保存し、もう 1 つの名前をファイルに書き込んで閉じます。

私はそれを機能させることができないようです。
これが私のコードです:

import sys, os, ctypes

BGfile = open('C:\BG\BG.txt', 'r+' )
BGread = BGfile.read()
x=0
if BGread == 'mod_bg.bmp':
    x = 'BGMATRIX.bmp'
    BGfile.write('BGMATRIX.bmp')
    BGfile.close()

elif BGread == 'BGMATRIX.bmp':
    x = 'mod_bg.bmp'
    BGfile.write('mod_bg.bmp')
    BGfile.close()

pathToImg = x
SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, pathToImg, 0)

使用する"r+"と、次のエラーが表示されます。

Traceback (most recent call last):
  File "C:\BG\BG Switch.py", line 13, in <module>
    BGfile.write('mod_bg.bmp')
IOError: [Errno 0] Error

これはまったく役に立ちません!
使用する"w+"と、ファイルに既にあるものを消去するだけです。

この奇妙なエラーが発生する理由と、それを修正する方法を誰か教えてもらえますか?

4

1 に答える 1

4

読み取り後にファイルを書き込みモードで再度開くだけです。

with open('C:\BG\BG.txt') as bgfile:
    background = bgfile.read()

background = 'BGMATRIX.bmp' if background == 'mod_bg.bmp' else 'mod_bg.bmp'

with open('C:\BG\BG.txt', 'w') as bgfile:
    bgfile.write(background)

SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, background, 0)

ファイルを読み取りと書き込みの両方で開いている場合は、少なくともファイルの先頭に巻き戻し、書き込みの前に切り詰める必要があります。

with open('C:\BG\BG.txt', 'r+') as bgfile:
    background = bgfile.read()

    background = 'BGMATRIX.bmp' if background == 'mod_bg.bmp' else 'mod_bg.bmp'

    bgfile.seek(0)
    bgfile.truncate() 
    bgfile.write(background)

SPI_SETDESKWALLPAPER = 20  
ctypes.windll.user32.SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, background, 0)
于 2013-05-28T23:00:36.917 に答える