如何使用下一步按钮python

时间:2019-02-23 21:43:58

标签: python python-3.x tkinter

我目前是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是否会带来麻烦?如果是,请让我知道如何正确进行操作。)

2 个答案:

答案 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()

(因为我没有您的图像,所以未经测试)。