Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python/Tkinter中删除按钮几秒钟?_Python_Tkinter - Fatal编程技术网

在Python/Tkinter中删除按钮几秒钟?

在Python/Tkinter中删除按钮几秒钟?,python,tkinter,Python,Tkinter,我正在编写一个程序,用户将根据目标图像进行选择。我试图让程序删除选择按钮,并在更新目标图像后等待2秒钟,然后重新显示选择。我的代码似乎在2秒钟内“禁用”单击的按钮,但没有删除任何一个按钮 from tkinter import * import random root = Tk() root.geometry("500x500") def click_b(event): btn_b.pack_forget() btn_c.pack_forget() new_a()

我正在编写一个程序,用户将根据目标图像进行选择。我试图让程序删除选择按钮,并在更新目标图像后等待2秒钟,然后重新显示选择。我的代码似乎在2秒钟内“禁用”单击的按钮,但没有删除任何一个按钮

from tkinter import *
import random

root = Tk()
root.geometry("500x500")


def click_b(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns())


def click_c(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns())


def new_a():
    k = random.randrange(1, 3)
    if k == 1:
        btn_a.configure(image=a1)
    elif k == 2:
        btn_a.configure(image=a2)


def show_btns():
    btn_b.pack(side=LEFT)
    btn_c.pack(side=RIGHT)

a1 = PhotoImage(file="A1.gif")
a2 = PhotoImage(file="A2.gif")
orange = PhotoImage(file="orange_btn.gif")
green = PhotoImage(file="yellowgreen_btn.gif")
btn_a = Button(root, image=a1)
btn_a.pack()

btn_b = Button(root, image=orange)
btn_b.bind('<Button-1>', click_b)
btn_b.pack(side=LEFT)

btn_c = Button(root, image=green)
btn_c.bind('<Button-1>', click_c)
btn_c.pack(side=RIGHT)

root.mainloop()
从tkinter导入*
随机输入
root=Tk()
根几何(“500x500”)
def单击按钮(事件):
btn_b.打包忘记()
btn_c.打包忘记()
新(a)
root.update()
root.after(2000,show_btns())
def单击(事件):
btn_b.打包忘记()
btn_c.打包忘记()
新(a)
root.update()
root.after(2000,show_btns())
def new_a():
k=随机。随机范围(1,3)
如果k==1:
btn_a.配置(图像=a1)
elif k==2:
btn_a.配置(图像=a2)
def show_btns():
btn_b.组件(侧面=左侧)
btn_c.组件(侧面=右侧)
a1=照片图像(file=“a1.gif”)
a2=照片图像(file=“a2.gif”)
橙色=照片图像(file=“orange\u btn.gif”)
绿色=照片图像(file=“yellowgreen\u btn.gif”)
btn_a=按钮(根,图像=a1)
btn_a.pack()
btn_b=按钮(根,图像=橙色)
btn_b.绑定(“”,单击)
btn_b.组件(侧面=左侧)
btn_c=按钮(根,图像=绿色)
btn_c.绑定(“”,单击)
btn_c.组件(侧面=右侧)
root.mainloop()

问题在
after()方法中。
您需要删除
show_btns
函数调用的括号,否则tkinter将无法正确运行此命令。如果您有一个没有参数的函数,您可以省略
()
部分

如果您确实有参数,那么您需要在after语句中提供这些参数,即
after(2000,some_func,arg1,arg2)
或使用
lambda
创建一个一次性函数来执行类似于
after(2000,lambda:some_func(arg1,arg2))
的工作。lambda可能更复杂,但这是基本概念

更改:

after(2000, show_btns())
致:

只要图像的路径工作正常,下面的代码就应该按预期工作

from tkinter import *
import random

root = Tk()
root.geometry("500x500")

def click_b(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns)

def click_c(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns)

def new_a():
    k = random.randrange(1, 3)
    if k == 1:
        btn_a.configure(image=a1)
    elif k == 2:
        btn_a.configure(image=a2)

def show_btns():
    btn_b.pack(side=LEFT)
    btn_c.pack(side=RIGHT)

a1 = PhotoImage(file="A1.gif")
a2 = PhotoImage(file="A2.gif")
orange = PhotoImage(file="orange_btn.gif")
green = PhotoImage(file="yellowgreen_btn.gif")
btn_a = Button(root, image=a1)
btn_a.pack()

btn_b = Button(root, image=orange)
btn_b.bind('<Button-1>', click_b)
btn_b.pack(side=LEFT)

btn_c = Button(root, image=green)
btn_c.bind('<Button-1>', click_c)
btn_c.pack(side=RIGHT)

root.mainloop()
从tkinter导入*
随机输入
root=Tk()
根几何(“500x500”)
def单击按钮(事件):
btn_b.打包忘记()
btn_c.打包忘记()
新(a)
root.update()
root.after(2000,show_btns)
def单击(事件):
btn_b.打包忘记()
btn_c.打包忘记()
新(a)
root.update()
root.after(2000,show_btns)
def new_a():
k=随机。随机范围(1,3)
如果k==1:
btn_a.配置(图像=a1)
elif k==2:
btn_a.配置(图像=a2)
def show_btns():
btn_b.组件(侧面=左侧)
btn_c.组件(侧面=右侧)
a1=照片图像(file=“a1.gif”)
a2=照片图像(file=“a2.gif”)
橙色=照片图像(file=“orange\u btn.gif”)
绿色=照片图像(file=“yellowgreen\u btn.gif”)
btn_a=按钮(根,图像=a1)
btn_a.pack()
btn_b=按钮(根,图像=橙色)
btn_b.绑定(“”,单击)
btn_b.组件(侧面=左侧)
btn_c=按钮(根,图像=绿色)
btn_c.绑定(“”,单击)
btn_c.组件(侧面=右侧)
root.mainloop()

您做过任何研究吗?在这个网站上有很多关于隐藏小部件的问题,可能大多数tkinter教程都以这样或那样的方式介绍了这个主题。从我发现的一切来看,我拥有的代码应该可以工作。我能找到的所有问题都没有重新呈现小部件-它们只是删除了它们。实际上这对我来说很好。。。按钮真的不见了。@row多奇怪啊。我确实测试了代码,按下按钮时出错。现在,在您的评论之后测试OPs代码时,它可以正常工作…@SierraMountainTech好吧,也许当您为自己的工作更改代码时(更改了图像和其他内容),您意外地更改了一些不应该更改的内容。您不必使用
lambda
作为位置参数。您可以将它们作为参数提供给
after
(例如:
after(2000,一些函数,arg1,arg2)
)@BryanOakley我不知道这一点。谢谢你的信息。我的印象是,如果需要争论,lambda是唯一的选择。我会更新我的答案。谢谢你们!我的问题示例代码没有参数,但我的实际程序有参数。两者现在都在工作。@Ash.notKetchum很高兴知道您的主代码有参数。这是一个重要的信息。
from tkinter import *
import random

root = Tk()
root.geometry("500x500")

def click_b(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns)

def click_c(event):
    btn_b.pack_forget()
    btn_c.pack_forget()
    new_a()
    root.update()
    root.after(2000, show_btns)

def new_a():
    k = random.randrange(1, 3)
    if k == 1:
        btn_a.configure(image=a1)
    elif k == 2:
        btn_a.configure(image=a2)

def show_btns():
    btn_b.pack(side=LEFT)
    btn_c.pack(side=RIGHT)

a1 = PhotoImage(file="A1.gif")
a2 = PhotoImage(file="A2.gif")
orange = PhotoImage(file="orange_btn.gif")
green = PhotoImage(file="yellowgreen_btn.gif")
btn_a = Button(root, image=a1)
btn_a.pack()

btn_b = Button(root, image=orange)
btn_b.bind('<Button-1>', click_b)
btn_b.pack(side=LEFT)

btn_c = Button(root, image=green)
btn_c.bind('<Button-1>', click_c)
btn_c.pack(side=RIGHT)

root.mainloop()