我目前是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分为两个不同的def,一个用于变量跟踪,一个用于切换bglabel,但输出仍然相同。请帮忙。
(另外,当我继续添加按钮时,该window.bind是否会带来麻烦?如果是,请让我知道如何正确进行操作。)
答案 0 :(得分:1)
正如您提到的,发生的一个“错误”是图像立即跳到图像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
进行键绑定可以使我们将参数传递给函数。我们先指定要传递给函数的参数,然后再指定函数,并在方括号中加上参数。
答案 1 :(得分:0)
您需要提供功能,而不是功能结果。因此没有括号。像这样:
nextbutton1=Button(window, image=nextbutton, bd=0, command=next1)
也删除window.bind
行,则循环逻辑中断。因为您在函数中设置了“ slide”,所以它始终为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()
(因为我没有您的图像,所以未经测试)。