Не удается получить доступ к классу из-за ошибки имени в неопределенном атрибуте (event) в __init__(), о котором я не знаю, как его определить! (Python)

#python #events #tkinter #bind #nameerror

#python #Мероприятия #tkinter #привязать #ошибка имени

Вопрос:

Я получаю эту ошибку :

Обратная трассировка (последний последний вызов): Файл «D:MariomodulesMovingBackground_4.py «, строка 54, в bg = BackgroundImage(холст, событие) Ошибка имени: имя ‘событие’ не определено.

Я новичок в Python и сейчас много читаю о каждом аспекте языка Python и логике, лежащей в его основе, но я еще не знаком с конкретным аргументом ‘event’ и большинством ошибок. После проверки печати (события) я обнаружил, что в нем хранятся позиции, номера ключей и т. Д. Я не знаю, как его определить (заранее?), Поэтому я могу передать его в bg = BackgroundImage(canvas, event) . Кто-нибудь?

 from tkinter import *
import tkinter as tk

import time
import keyboard
import random



posOfBackgrImage_X = 500
posOfBackgrImage_Y = -40




tk = Tk()    
canvas = Canvas (tk, width = 256, height = 224 ) 
canvas.pack()
tk.update()


class BackgroundImage:
    
    def __init__(self, canvas, event):

        self.canvas = canvas
        #self.event = event
        self.background = PhotoImage(file = "d:MarioimagesBackgroundssmw-bg-clouds1.png") #loads a background image and makes an instance of that
        self.marioBackGround = self.canvas.create_image(posOfBackgrImage_X, posOfBackgrImage_Y , image=self.background, anchor=NE) #loads in the parameters the height, witth and the object 'filename'.
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        
   
    def move(self):

        if event.char == "a":
            self.canvas.move(self.marioBackGround, -10, 0)
        elif event.char == "d":
            self.canvas.move(self.marioBackGround, 10, 0)

    tk.bind("<Key>", move)

    
    def draw(self):
     
        self.canvas.move(self.marioBackGround, self.x, 0)
        pos = self.canvas.coords(self.marioBackGround)
        #canvas.pack()

    

    
bg = BackgroundImage(canvas, event)
#g.GameLoop()


while 1:
    bg.move()   
    bg.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)
    
  

Комментарии:

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

2. Вы определили свой класс так, чтобы при создании экземпляра требовалось событие, и вы не передаете событие. Ваш класс не использует событие, так зачем вам это требуется? Это ваш код, или вы скопировали его у кого-то другого?

3. прежде чем bg = BackgroundImage(canvas, event) вам придется создать event = ... или удалить это event из определения и выполнения, потому что вы не используете это event внутри класса.

4. tk.bind() должен быть внутри __init__ и его следует использовать self.move() вместо move() . Bind отправит дополнительную информацию о событии, и функция move() должна ее получить def move(self, event) . Я не знаю, почему в цикле вы запускаете одну и ту же функцию bg.move() — и если вы хотите ее выполнить, вам нужно выполнить с информацией о событии, потому что вам это нужно def move(self, event): в ближайшее время: у вас много мелких ошибок, и вам нужно изучить основы tkinter и объектно-ориентированного программирования (ООП), что означает классы.