问题描述
尝试创建一个接受键盘输入的程序,并将其存储在列表中以备后用。
import turtle as trtl
from functools import partial
wn = trtl.Screen()
def _onkeypress(self,fun,key=None):
if fun is None:
if key is None:
self.cv.unbind("<KeyPress>",None)
else:
self.cv.unbind("<KeyPress-%s>" % key,None)
elif key is None:
def eventfun(event):
fun(event.char)
self.cv.bind("<KeyPress>",eventfun)
else:
def eventfun(event):
fun()
self.cv.bind("<KeyPress-%s>" % key,eventfun)
def letter(character):
phL = character
print(phL)
def makeL(self):
L = []
phL = wn.onkeypress(letter)
L.append(phL)
print(L)
wn._onkeypress = partial(_onkeypress,wn)
wn.onkeypress(letter)
wn.onkeypress(makeL)
wn.listen()
wn.mainloop()
我在控制台中为打印 L 获得的值只是 []
。我不知道为什么会这样。但是函数字母中的 phL
打印和更新,而列表保持为空。
解决方法
你正在做的事实:
phL = wn.onkeypress(letter)
表示您对海龟事件没有基本的了解。 onkeypress()
函数不会停止执行并等待按键被按下,它只是注册一个在按键被按下时要调用的函数。 IE。它不返回任何东西。让事情按照我认为你想要的方式运作:
from turtle import Screen
from functools import partial
def _onkeypress(self,fun,key=None):
if fun is None:
if key is None:
self.cv.unbind("<KeyPress>",None)
else:
self.cv.unbind("<KeyPress-%s>" % key,None)
elif key is None:
def eventfun(event):
fun(event.char)
self.cv.bind("<KeyPress>",eventfun)
else:
def eventfun(event):
fun()
self.cv.bind("<KeyPress-%s>" % key,eventfun)
def letter(character):
characters.append(character)
print(characters)
screen = Screen()
screen._onkeypress = partial(_onkeypress,screen) # monkey patch
characters = []
screen.onkeypress(letter)
screen.listen()
screen.mainloop()
当您在海龟窗口中键入时,递增列表 characters
将打印到控制台。
注意_onkeypress
是对海龟自己的 onkeypress
方法的轻微修改,它允许在“任意键”情况下将键入的键传递给事件处理程序。原作中的失败,什么也没有通过。