我一直在写一个程序,我遇到了一个错误。我目前的代码是:
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(...)
导致错误。不过你们有什么想法吗?
答案 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()
。