2013-05-28 61 views
3

我正在編寫一個程序來改變我的桌面背景。它通過閱讀文本文件來完成。如果文本文件顯示其中一個BG文件名稱,則將其另存爲我的背景,並將另一個名稱寫入文件並關閉它。IOError寫入文件時

我似乎無法得到它的工作。
這裏是我的代碼:

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+"它只是擦除文件中已有的內容。

任何人都可以告訴我爲什麼我得到這個奇怪的錯誤,並有可能的方法來解決它?

+0

是的我只是用名字來記住哪一個是我爲什麼得到-1? – Serial

+0

我在前些天做了這樣的事情, – Noelkd

回答

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) 
+0

哦,這很有道理,我做了你剛剛解釋的東西,只是有點不同而已謝謝! – Serial