Функция Tkinter вызывается самостоятельно - PullRequest
0 голосов
/ 01 января 2019

Используя tkinter, я пытаюсь заставить шар появляться на экране, а затем исчезать (становиться того же цвета, что и фон) при нажатии клавиши "w", но он сразу исчезает при запуске программы.

Я думаю, это может быть связано с структурированием кода с функцией ball_disappear перед переменными, но я не заметил разницы, когда поставил функцию под ней.Вот код.

from tkinter import *

root = Tk()

height = 700
width = 1000
canvas = Canvas(width=width, height=height)
canvas_background = '#63fff9'
canvas.configure(background=canvas_background)
root.title = "Ball Bouncer Tk"

def ball_disappear():
    canvas.itemconfig(ball, fill=canvas_background, outline=canvas_background)
    canvas.update()

ballP1 = 400
ballP2 = 400
ballP3 = 600
ballP4 = 600

ball = canvas.create_oval(ballP1, ballP2, ballP3, ballP4, fill='#000000', tags="ball")

canvas.pack()
canvas.bind("w", ball_disappear())
canvas.mainloop()

1 Ответ

0 голосов
/ 01 января 2019

Рассмотрим следующую строку кода:

canvas.bind("w", ball_disappear())

Это имеет точно такой же эффект, как этот:

result = ball_disappear()
canvas.bind("w", result)

Когда вы связываете событие, вы должны дать ему вызываемая .Обычно это принимает форму ссылки на функцию, хотя это также может быть результатом вызова lambda или functools.partial или даже вашей собственной функции, если эта функция возвращает другую функцию.

Таким образомправильный способ связывания ball_disappear выглядит следующим образом:

canvas.bind("w", ball_disappear)

Однако ваш код все равно не будет работать из-за двух других ошибок в вашем коде.

Во-первых,холст не получает события клавиатуры по умолчанию.Вы должны явно указать ей фокус клавиатуры, поэтому через некоторое время после создания холста вам необходимо сделать следующее:

canvas.focus_set()

Во-вторых, когда вы связываете функцию с событием, вызываемая функция будет переданаобъект, который имеет информацию о событии.Таким образом, вам нужно определить свою функцию следующим образом, даже если вы не планируете использовать параметр в своем коде:

def ball_disappear(event):
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...