Использование onclick черепахи в цикле - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь создать простой интерфейс из dict строк внутри функции.Каждая строка используется для отображения текста и кликабельной черепахи (используя onclick(), чтобы сделать черепаху кликабельной).Это так, чтобы я мог щелкнуть по черепашке и ввести некоторые значения.

Но, если я правильно понял, когда функция заканчивает выполнение цикла через словарь, все переменные, которые должен был определить циклпереопределяются как последний, прошедший через цикл, последний элемент словаря.Таким образом, функция onclick() возвращает мне только последний элемент словаря.

Есть ли способ заставить одну функцию onclick() реагировать / соответствовать каждому элементу словаря?Я действительно не хочу писать кучу onclick() функций для каждого элемента словаря.Я пытаюсь узнать лучший способ.

list_alunos={'joao': ['5', 'm'],'maria': ['5', 'm'],'lobo': ['5', 'm'],'mau': ['5', 'm']}
def caca(dictx,file):
    import turtle
    mes=file
    vert=350
    hor=-600


    def got(t,x,y,d) :
        t.penup()
        t.goto(x,y)
        t.pendown()
        t.seth(d)

    def text(t,text, size, color, pos1, pos2):
        t.penup()
        t.goto(pos1, pos2)
        t.color(color)
        t.begin_fill()
        t.write(text, font=('Arial', size, 'normal'))
        t.end_fill()




    new_vert = vert
    for key in dictx:
        nome = key
        if vert == -340:
            new_vert = 350
            new_hor = hor + 250
        if vert!= -340:
            new_vert= new_vert-30
            new_hor = hor
            txt_vert = new_vert - 15
            txt_hor = new_hor + 20

        screen = turtle.Screen()

        width = 1200
        height = 1500
        turtle.screensize(width, height)



        tnome = turtle.Turtle(shape='turtle')
        tnome.color('pink')
        textnome = turtle
        tnome.speed('fastest')
        textnome.speed('fastest')

        text(textnome, '%s' %(nome), '20', 'pink', txt_hor,txt_vert)

        got(tnome,new_hor,new_vert,0)
        def tnome_handler(x, y):

            pos = list(dictx.keys()).index(nome)
            listt = list(dictx)

            pnt = screen.textinput(' pontuação', '%s:  '%(listt[pos]))
            pnt = [int(x) for x in pnt.split()]
            if len(pnt) == 5 :
                with open('%s.py' %(mes), 'a') as fd:
                    fd.write('\n%s.pontuacao(%i,%i,%i,%i,%i)' % (nome,pnt[0],pnt[1],pnt[2],pnt[3],pnt[4]))
                tnome.color('blue')
        tnome.onclick(tnome_handler)


caca(list_alunos,'mm')

1 Ответ

1 голос
/ 31 мая 2019

Я полагаю, что следующая переделка вашего кода делает то, что вы хотите.Он эффективно генерирует пользовательский обработчик для каждой черепахи / кнопки, который уникально реагирует на это:

from turtle import Screen, Turtle

WIDTH, HEIGHT = 1200, 1500

dict_alunos = {'joao': ['5', 'm'], 'maria': ['5', 'm'], 'lobo': ['5', 'm'], 'mau': ['5', 'm']}

def text(t, text, size, color, x, y):
    t.penup()
    t.goto(x + size, y - size/2)
    t.color(color)
    t.write(text, align='left', font=('Arial', str(size), 'normal'))
    t.goto(x, y)

def caca(dictionary, mes):

    def tnome_handler(nome, turtle, x, y):

        pnt = screen.textinput('pontuação', '%s:  ' % (nome))
        pnt = [int(x) for x in pnt.split()]

        if len(pnt) == 5:
            with open('%s.py' % (mes), 'a') as fd:
                fd.write('s.pontuacao(%i, %i, %i, %i, %i)\n' % (nome, pnt[0], pnt[1], pnt[2], pnt[3], pnt[4]))

        turtle.color('blue')

    vert = 350
    hor = -600

    new_vert = vert

    for nome in dictionary:

        if vert == -340:
            new_vert = 350
            new_hor = hor + 250

        if vert != -340:
            new_vert = new_vert - 30
            new_hor = hor
            txt_vert = new_vert - 15
            txt_hor = new_hor + 20

        turtle = Turtle(shape='turtle')
        turtle.color('pink')
        turtle.speed('fastest')
        turtle.setheading(0)

        text(turtle, '%s' % (nome), 20, 'pink', txt_hor, txt_vert)

        turtle.onclick(lambda x, y, n=nome, t=turtle: tnome_handler(n, t, x, y))

screen = Screen()
screen.setup(WIDTH, HEIGHT)

caca(dict_alunos, 'mm')

screen.mainloop()

Я также переработал код, чтобы он соответствовал более распространенному дизайну программирования.

...