Saya belajar python melalui sebuah buku, dan ada kode untuk versi Pong yang disederhanakan. Saya menulis kode dan saya mendapatkan pesan kesalahan lanjutan. Adakah yang bisa membantu? Saya menggunakan 3.9.2 dan melampirkan kode dan pesan kesalahan di bawah ini.

from tkinter import*
import random
import time

class Ball:
    def __init__(self, canvas, paddle, color):
        self.canvas = canvas
        self.paddle = paddle
        self.id=canvas.create_oval(10,10,25,25,fill=color)
        self.canvas.move(self.id, 245, 100)
        starts = [-3,-2,-1, 1,2,3]
        random.shuffle(starts)
        self.x=starts[0]
        self.y=-3
        self.canvas_height = self.canvas.winfo_height()
        self.canvas_width = self.canvas.winfo_width()
        self.hit_bottom = False
    
    def hit_paddle(self,pos):
        paddle_pos = self.canvas.coords(self.paddle.id)
        if pos[2] >= paddle_pos[0] and pos[0] <= paddle_pos[2]:
            if pos[3] >= paddle_pos[1] and pos[3] <= paddle_pos[3]:
                return True
        return False
    

    def draw(self):
        self.canvas.move(self.id, self.x, self.y)
        pos = self.canvas.coords(self.id)
        if pos[1] <= 0:
            self.y = 3
        if pos[3] >= self.canvas_height:
            self.hit_bottom = True
        if self.hit_paddle(pos) == True:
            self.y = -3
        if pos[0] <= 0:
            self.x = 3
        if pos[2] >= self.canvas_width:
            self.x = -3

class Paddle:
    def __init__(self, canvas, color):
        self.canvas = canvas
        self.id = canvas.create_rectangle(0, 0, 100, 10, fill=color)
        self.canvas.move(self.id,200,300)
        self.x = 0
        self.canvas_width = self.canvas.winfo_width()
        self.canvas.bind_all('<Keypress-Left>', self.turn_left)
        self.canvas.bind_all('<Keypress-Right>', self.turn_right)
    
    def draw(self):
        self.canvas.move(self.id, self.x, 0)
        pos = self.canvas.coords(self.id)
        if pos[0] <= 0:
            self.x = 0
        elif pos[2] >= self.canvas_width:
            self.x = 0
       
    def turn_left(self,evt):
        self.x = -2

    def turn_right(self,evt):
        self.x = 2





tk=Tk()
tk.title=('Game')
tk.resizable(0,0)
tk.wm_attributes('-topmost', 1)
canvas = Canvas(tk, width=500, height=500, bd=0, highlightthickness=0)
canvas.pack()
tk.update()

paddle = Paddle(canvas, 'blue')
ball = Ball(canvas, paddle, 'red')

while 1:
    if ball.hit_bottom == False:
        ball.draw()
        paddle.draw()
    tk.update_idletasks()
    tk.update()
    time.sleep(0.01)

Pesan eror: Traceback (panggilan terakhir terakhir): File "/Users/bennettsullivan/Documents/BOUNCE!!!.py", baris 77, di dayung = Dayung (kanvas, 'biru') File "/Users/bennettsullivan/Documents/BOUNCE!!!.py", baris 48, di init self.canvas.bind_all('', self.turn_left) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/init.py", baris 1406, di bind_all kembalikan self._bind(('bind', 'all'), sequence, func, add, 0) File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/init.py", baris 1346, di _bind self.tk.call(apa + (urutan, cmd)) _tkinter.TclError: jenis kejadian buruk atau keysym "Keypress"

0
Python coder 10 Mei 2021, 23:06

1 menjawab

Jawaban Terbaik

Masalahnya ada di dalam kelas Paddle Anda. Binding acara Anda harus berbentuk unta (mis. <KeyPress-Left>, bukan <Keypress-Left>). Setelah huruf besar 'p', program berjalan dengan baik (hanya perlu cara untuk memutar ulang game atau menutupnya dengan benar).

1
piccoloser 10 Mei 2021, 20:23