Как изменить метку (форму изображения) с помощью следующей кнопки Python - PullRequest
0 голосов
/ 24 февраля 2019

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

from tkinter import *

def next1():
    global slide
    slide=1
    if slide==1:
        bglabel.config(image=bg1)
    elif slide==2:
        bglabel.config(image=bg2)
    slide+=1
    window.update()

window=Tk()
window.geometry("1500x750+0+0")

bg1=PhotoImage(file="backslide1.png")
bg2=PhotoImage(file="backslide2.png")
nextbutton=PhotoImage(file="next.png")

bglabel=Label(window, image=bg1)
bglabel.place(x=600,y=200)

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1())

window.bind('<Button-1>', next1())

Я сидел добрый час или около того, пытаясь изменить переменную slide (пытаясь объявить ее перед def, удалить глобальный, изменить значение, изменить, где находится slide + = 1 и т. Д.) но всегда происходит одно из двух;либо он застревает на bg1 нажатием кнопки, но ничего не делает, либо прыгает прямо на bg2.Я также попытался разделить next1 на два разных определения, одно для отслеживания переменных, другое для переключения bglabel, но все равно тот же вывод.Пожалуйста, помогите.

(Кроме того, возникнут ли проблемы с этим window.bind, когда я продолжу добавлять кнопки? Если да, пожалуйста, дайте мне знать, как это сделать правильно.)

Ответы [ 2 ]

0 голосов
/ 24 февраля 2019

Как вы упомянули, возникает одна «ошибка»: изображение сразу переходит к изображению bg2.Эта строка вызывает следующее:

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1())

Более конкретно, где вы объявляете команду, связанную с кнопкой:

command=next1()

С помощью заключенных в скобки вы вызываете функцию next1 т. Е. Как только кнопка будет создана, запустите указанную функцию.

Чтобы решить эту проблему, просто удалите пару скобок:

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1)

То же самое относится и к привязке вашего ключа.Таким образом, кнопка / клавиша теперь имеет ссылку на функцию - она ​​знает, какую функцию запустить, и будет запускать ее при выполнении указанного действия.

Подробнее о привязке клавиш ... При использовании bind для назначения клавиши для запуска функции, любая функция, которая должна быть запущена, должна быть осведомлена как таковая.В настоящее время функция next, которую вы пытаетесь связать, не имеет указаний на то, что ее можно вызвать с помощью события кнопки клавиатуры.Чтобы исправить это, мы устанавливаем параметр по умолчанию в next, определяя событие:

def next1(event=None):
    #rest of function code here

window.bind('<Button-1>', lambda event: next(event))

Установка параметра по умолчанию, event=None, в основном означает, что никакое значение для event не было передано функции изчто бы он ни вызывал, установите его по умолчанию None (в этом смысле вы можете выбрать его по умолчанию).Использование lambda для привязки клавиш таким образом позволяет нам передавать параметры в функции.Мы указываем, какой параметр (параметры) мы хотим передать функции, а затем указываем функцию с параметрами, заключенными в квадратные скобки.

0 голосов
/ 24 февраля 2019

Вы должны предоставить функцию, а не результат функции.Так что без скобок.Вот так:

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1)

Также удалите строку window.bind, и ваша логика цикла нарушена.«Слайд» всегда равен 1, так как вы устанавливаете это в функции.Вы пытаетесь переключаться между двумя изображениями с каждым кликом?Если это так, используйте itertools.cycle:

from tkinter import *
from itertools import cycle

def next1():
    bglabel.config(image=next(bgimages))

window=Tk()
window.geometry("1500x750+0+0")

bg1=PhotoImage(file="backslide1.png")
bg2=PhotoImage(file="backslide2.png")
bgimages = cycle([bg1, bg2])
nextbutton=PhotoImage(file="next.png")

bglabel=Label(window)
bglabel.place(x=600,y=200)
next1() # set the first image

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1)
nextbutton1.pack()
window.mainloop()

(полностью не проверено, поскольку у меня нет ваших изображений).

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