Найти - Пользователи
Полная версия: Не вызывается привязанная к событию функция в canvas
Начало » GUI » Не вызывается привязанная к событию функция в canvas
1
WoMax
Привет,

подскажите, пожалуйста, почему функция self.tranform в первом сценарии вызывается без проблем (перемещает картинку вправо). А во втором, несколько усложненном, не работает:

1) первый
from tkinter import *
class MMain():
    def __init__(self, parent = None):
        canvas = Canvas(width=508, height=508, bg = '#aa9d93')
        canvas.pack(fill = BOTH, expand = YES)
        canvas.bind('<Right>', self.moveRight)
        canvas.focus_set()
        self.canvas = canvas
        self.photo = PhotoImage(file = 'numbers\\small_2.gif')
        self.canvas.create_image(10, 10, image = self.photo, anchor = NW, tag = 'asd')
        self.photo2 = PhotoImage(file = 'numbers\\small_2.gif')
        self.canvas.create_image(10, 150, image = self.photo, anchor = NW, tag = 'zxc')
    
    def moveRight(self, event):
        for i in [['asd', 248, 0, False], ['zxc', 248, 0, False]]:
            tagg = i[0] 
            moveX = i[1]
            moveY = i[2]
            merge = i[3]
            print(tagg, moveX, moveY, merge)                             # работает
            self.tranform(tagg, moveX, moveY, merge)                 # работает
    
    def tranform(self, tagg, moveX, moveY, merge):                 
        if merge == False:
            if moveX > 0:
                move, moveX = 31, (moveX - 31)
                self.canvas.move(tagg, move, 0)
                if moveX:
                    self.canvas.after(50, self.tranform, tagg, moveX, 0, merge)
            elif moveY > 0:
                move, moveY = 31, (moveY - 31)
                self.canvas.move(tagg, 0, move)
                if moveY:
                    self.canvas.after(50, self.tranform, tagg, 0, moveY, merge)
        else:
            num = int(tagg[-4:])
            if moveX > 0:
                move, moveX = 31, (moveX - 31)
                self.canvas.move(tagg, move, 0)
                if moveX:
                    self.canvas.after(50, self.tranform, tagg, moveX, 0, merge)
            elif moveY > 0:
                move, moveY = 31, (moveY - 31)
                self.canvas.move(tagg, 0, move)
                if moveY:
                    self.canvas.after(50, self.tranform, tagg, 0, moveY, merge)
                    
if __name__ == '__main__':
    MMain()
    mainloop()

2) второй
from tkinter import *
class MMain():
    photos = {}
    def __init__(self, parent = None):
        canvas = Canvas(width=508, height=508, bg = '#aa9d93')
        canvas.pack(fill = BOTH, expand = YES)
        canvas.bind('<Right>', self.moveRight)
        canvas.focus_set()
        self.canvas = canvas
        tagg = '260120002'
        self.photos[tagg] = PhotoImage(file = 'numbers\\small_2.gif')
        self.canvas.create_image(10, 10, image = self.photos[tagg], anchor = NW, tag = tagg)
    
    def moveRight(self, event):
        for tagg in sorted(self.photos, reverse = True):       
            num = int(tagg[-4:])
            if tagg[:3] == '384':                              
                continue
            elif tagg[:5] == '26012':                          
                L = [0, 0, 2]
                merge = False                                  
                moveX = 0                                      
                moveY = 0                                      
                for i in L:
                    if i > num:
                        break
                    elif i == 0:
                        moveX += 124
                        continue
                    elif i == num:
                        moveX += 124
                        merge = True
                        break
                if moveX > 0:
                    print(tagg, moveX, moveY, merge)               # работает
                    self.tranform(tagg, moveX, moveY, merge)   # НЕ РАБОТАЕТ!
                continue
    
    def tranform(self, tagg, moveX, moveY, merge):                 
        if merge == False:
            if moveX > 0:
                move, moveX = 31, (moveX - 31)
                self.canvas.move(tagg, move, 0)
                if moveX:
                    self.canvas.after(50, self.tranform, tagg, moveX, 0, merge)
            elif moveY > 0:
                move, moveY = 31, (moveY - 31)
                self.canvas.move(tagg, 0, move)
                if moveY:
                    self.canvas.after(50, self.tranform, tagg, 0, moveY, merge)
        else:
            num = int(tagg[-4:])
            if moveX > 0:
                move, moveX = 31, (moveX - 31)
                self.canvas.move(tagg, move, 0)
                if moveX:
                    self.canvas.after(50, self.tranform, tagg, moveX, 0, merge)
            elif moveY > 0:
                move, moveY = 31, (moveY - 31)
                self.canvas.move(tagg, 0, move)
                if moveY:
                    self.canvas.after(50, self.tranform, tagg, 0, moveY, merge)
                    
if __name__ == '__main__':
    MMain()
    mainloop()

При этом функция print с теми же аргументами работает в обеих сценариях.
В прикреплении папка с обеими сценариями и картинками для тестирования
4kpt_II
С таггирование не работает. Используйте id

from tkinter import *
class MMain():
    photos = {}
    def __init__(self, parent=None):
        self.canvas = Canvas(width=508, height=508, bg='#aa9d93')
        self.canvas.pack(fill=BOTH, expand=YES)
        self.canvas.bind('<Right>', self.moveRight)
        self.canvas.focus_set()
        self.id = {}
        tagg = '260120002'
        self.photos[tagg] = PhotoImage(file='numbers/small_2.gif')
        self.id[tagg] = self.canvas.create_image(10, 10,
                                                 image=self.photos[tagg],
                                                 anchor=NW)
    def moveRight(self, event):
        for tagg in sorted(self.photos, reverse=True):
            num = int(tagg[-4:])
            if tagg[:3] == '384':
                continue
            elif tagg[:5] == '26012':
                L = [0, 0, 2]
                merge = False
                moveX = 0
                moveY = 0
                for i in L:
                    if i > num:
                        break
                    elif i == 0:
                        moveX += 124
                        continue
                    elif i == num:
                        moveX += 124
                        merge = True
                        break
                if moveX > 0:
                    print(tagg, moveX, moveY, merge)               # работает
                    print "move"
                    self.tranform(tagg, moveX, moveY, merge)   # НЕ РАБОТАЕТ!
                continue
    def tranform(self, tagg, moveX, moveY, merge):
        id = self.id[tagg]
        if moveX > 0:
            move, moveX = 31, (moveX - 31)
            self.canvas.move(id, move, 0)
            if moveX:
                self.canvas.after(50, self.tranform, tagg, moveX, 0, merge)
        elif moveY > 0:
            move, moveY = 31, (moveY - 31)
            self.canvas.move(id, 0, move)
            if moveY:
                self.canvas.after(50, self.tranform, tagg, 0, moveY, merge)
if __name__ == "__main__":
    root = Tk()
    MMain(root)
    root.mainloop()

Идея, надеюсь, понятна…

P.S. Я понимаю, что это, возможно, первый Ваш код, но почитайте по PEP8
WoMax
Спасибо, буду пробовать с id.

А почему с тэгами код не работает? Ведь в теории вроде должен…

4kpt_II
Я понимаю, что это, возможно, первый Ваш код, но почитайте по PEP8
Оки
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB