SuckMyPython
@SuckMyPython
matrix.polling(none_stop=True)

Как вызвать функцию?

Help! Изучаю Canvas и Tkinter. Суть кода: при нажатии на одну картинку она сменяется другой. Всё работает, но как только я решил сделать так, чтобы при нажатии на вторую картинку, которая заменила первую, снова появлялась первая (типа цикл) столкнулся с проблемой:

c.tag_bind(imag1, 'Button-1', p2) - эта строка не может вызвать функцию без аргументов т.е. p2() , она вызывает её только если использовать p2(event) - это дело известное.

Чтобы скрипт работал мне нужно в данном случае вызвать функцию p1() перед root.mainloop(), и если я вызываю "def p1():" через "p1()" - функция вызывается, однако потом выдаёт ошибку, когда уже конструкция c.tag_bind(imag2, 'Button-1', p1) пытается вызвать функцию p1() снова (она не может; причина описана выше)

И главный затык в том, что если я вызываю функцию "def p1(event)" через "p1(event)" выдаёт ошибку (NameError: name 'event' is not defined)

Как вызвать функцию в данном случае, как запустить скрипт? Или как объявить "event" ведь в моём скрипте она используется только как издержка особенностей вызова через bind?

И да "command=p1" решило бы этот вопрос, но это не кнопка и здесь оно не работает, может есть аналоги?

p.s. "Да, талантом объяснять попонятней обделён)"

root = Tk()
root.title("LH")

c = Canvas(root, width=500, height=500)
c.pack()


def p1(event):   #или def p1():
	image1 = Image.open("C://...1.png")
	photo1 = ImageTk.PhotoImage(image1) 
	c.image = photo1
	imag1 = c.create_image(200, 250, image=photo1)
	
	c.tag_bind(imag1, '<Button-1>', p2)

	def p2(event):
		image2 = Image.open("C://...2.png")	
		photo2 = ImageTk.PhotoImage(image2) 
		c.image = photo2
		imag2 = c.create_image(200, 250, image=photo2)
		
		c.tag_bind(imag2, '<Button-1>', p1)

p1()   #или p1(event)
root.mainloop()
  • Вопрос задан
  • 247 просмотров
Решения вопроса 1
SuckMyPython
@SuckMyPython Автор вопроса
matrix.polling(none_stop=True)
Короче пардон за глупый вопрос! Может так и не правильно, но я просто задал значение для переменной event.
Если существуют более изящные и грамотные решения прошу кинуть весточку=)

# -*- coding: utf8 -*-
from tkinter import *
import tkinter.ttk as ttk
from PIL import Image, ImageTk 

root = Tk()
root.title("LH")

c = Canvas(root, width=500, height=500)
c.pack()

event = 123
imag1 = 0
imag2 = 0

def p1(event):
	c.delete(imag2)
	image1 = Image.open("C://1.png")
	photo1 = ImageTk.PhotoImage(image1) 
	c.image = photo1
	imag1 = c.create_image(200, 250, image=photo1)	
	c.tag_bind(imag1, '<Button-1>', p2)

	
def p2(event):
	c.delete(imag1)
	image2 = Image.open("C://2.png")	
	photo2 = ImageTk.PhotoImage(image2) 
	c.image = photo2	
	imag2 = c.create_image(200, 250, image=photo2)	
	c.tag_bind(imag2, '<Button-1>', p1)

p1(event)
root.mainloop()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы