微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何将一个项目存储在一个由 onkeypress 调用激活的函数的列表中

如何解决我如何将一个项目存储在一个由 onkeypress 调用激活的函数的列表中

尝试创建一个接受键盘输入的程序,并将其存储在列表中以备后用。

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 方法的轻微修改,它允许在“任意键”情况下将键入的键传递给事件处理程序。原作中的失败,什么也没有通过。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。