Как вызвать функцию при нажатии на изображение в Tkinter? - PullRequest
1 голос
/ 06 ноября 2019

Я знаю, что легко вызвать функцию с помощью кнопок Tkinter с помощью command, но она не работает так же, как с изображениями. Я считаю, что мой вопрос довольно прост, как я могу вызвать функцию, нажав на изображение?

Вот код. Я хочу нажать на picture, и это вызовет функцию make_newwindow.

from tkinter import *
import tkinter as tk

def make_newwindow():
    global newwindow
    root.withdraw()
    newwindow = tk.Toplevel()
    newwindow.title('Nível da grama região 2')
    newwindow.geometry('580x520')

root = tk.Tk()
root.title('Nível da grama região 1')
root.geometry("580x520")
picture = PhotoImage(file="picture.png")
label0 = Label(root, image=picture, borderwidth=0, highlightthickness=0)
label0.place(x=62, y=205)


root.mainloop()

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

По моему мнению, самый простой способ сделать это - прикрепить изображение к Button вместо Label виджета, потому что тогда все, что вам нужно будет сделать, это указать аргумент command=, ссылающийся на функцию, которую выхочу, чтобы его вызывали при нажатии.

Вот что я имею в виду:

import tkinter as tk

def make_newwindow():
    global newwindow

    raiz.withdraw()
    newwindow = tk.Toplevel()
    newwindow.title('Nível da grama região 2')
    newwindow.geometry('580x520')

raiz = tk.Tk()
raiz.title('Nível da grama região 1')
raiz.geometry("580x520")

picture = tk.PhotoImage(file="picure.png")
btn0 = tk.Button(raiz, image=picture, borderwidth=0, highlightthickness=0,
                 command=make_newwindow)
btn0.place(x=62, y=205)

raiz.mainloop()

Если вы действительно хотите по какой-то причине использовать Label, вы можете вызвать универсальный bind() метод виджета для присоединения вашей функции к нажатию кнопки мыши-1 события .

Для этого измените приведенный выше код, чтобы он создал Label (как вашкод), но также вызывает bind(), как показано на рисунке. Обратите внимание, как функция обратного вызова создается динамически с помощью выражения lambda. Это необходимо, потому что ваш make_newwindow() не принимает никаких аргументов. Однако tkinter функциям обратного вызова обработчика событий передается аргумент event (см. События и привязки ). Поскольку здесь он не нужен, аргумент просто игнорируется и ему присваивается имя _ (соглашение Python для таких вещей).

...
picture = tk.PhotoImage(file="picure.png")
label0 = tk.Label(raiz, image=picture, borderwidth=0, highlightthickness=0)
label0.place(x=62, y=205)
label0.bind('<Button-1>', lambda *_: make_newwindow())  # Create and bind callback func.

raiz.mainloop()
0 голосов
/ 06 ноября 2019

как насчет этого? Вот полный код, который работает

import tkinter as tk
from tkinter import *


def make_newwindow(data):
    global newwindow
    root.withdraw()
    newwindow = tk.Toplevel()
    newwindow.title('Nível da grama região 2')
    newwindow.geometry('580x520')


root = tk.Tk()
root.title('Nível da grama região 1')
root.geometry("580x520")
picture = PhotoImage(file="Capture001.png")
label0 = Label(root, image=picture, borderwidth=0, highlightthickness=0)
label0.place(x=62, y=205)


label0.pack()
label0.bind('<Button-1>', func=make_newwindow)


root.mainloop()

data - это информация о том, что произошло

...