如何修复此速度变量写回文件?

时间:2016-01-27 11:27:45

标签: python

我一直在写一个程序,我遇到了一个错误。我目前的代码是:

import tkinter as tk
speed = 80
def onKeyPress(event, value):
    global speed 
    text.delete("%s-1c" % 'insert', 'insert')
    text.insert('end', 'Current Speed: %s\n\n' % (speed, ))
    with open("speed.txt", "r+") as p:
        speed = p.read()
        speed = int(speed)
    speed = min(max(speed+value, 0), 100)
    with open("speed.txt", "r+") as p:
        p.writelines(str(speed))
    print(speed)
    if speed == 100:
        text.insert('end', 'You have reached the speed limit')
    if speed == 0:
        text.insert('end', 'You can not go any slower')



speed = 80

root = tk.Tk()
root.geometry('300x200')
text = tk.Text(root, background='black', foreground='white', font=('Comic Sans MS', 12))
text.pack()

# Individual key bindings
root.bind('<KeyPress-w>', lambda e: onKeyPress(e, 1)) 
root.bind('<KeyPress-s>', lambda e: onKeyPress(e, -1)) #

root.mainloop()

我相信speed = min(...)导致错误。不过你们有什么想法吗?

1 个答案:

答案 0 :(得分:2)

一个问题(我猜这是你遇到的问题)是你试图覆盖文件speed.txt的内容,但是,你写的值包含的字符数比文件中已包含的字符少。

这可能会导致文件中出现意外值,例如:如果文件包含

10

如果您尝试将值递减1(用户点击s键),请考虑会发生什么:

with open('speed.txt', 'r+') as p:
    speed = int(p.read())

speed -= 1    # speed is now 9

with open("speed.txt", "r+") as p:
    p.writelines(str(speed))

speed.txt现在包含:

90

而不是将速度降低到9,实际上已增加到90!如果速度已经是100并且你试图递减它,那么你最终会在文件中找到990。

这是因为用模式r+打开文件会打开文件进行读写,并将文件指针放在文件的开头。写入只会覆盖第一个 n 字符,其中 n 是写入数据的长度。因此,您可以获得上面显示的那种腐败。

您可以通过使用模式'w'为_second __ open()打开文件来解决此问题。这将完全覆盖该文件。而且您不需要使用writelines(),只需使用write()