一种隐藏和取消隐藏没有网格的按钮的方法吗? (python tkinter)

时间:2019-02-24 07:23:47

标签: python python-3.x tkinter

我想知道是否有一种方法可以在不使用网格的情况下隐藏和取消隐藏python中的按钮。我试过将它们移动到屏幕外的位置,然后由变量触发后将其移回屏幕,但这是行不通的(这使按钮看起来好像它们根本不存在)。打包,忘记然后再打包似乎仅适用于标签。让我知道是否还有其他方法(注意:我是新手)。到目前为止,这是我的代码:

from tkinter import*
health=1
stamina=1
magica=1
healthcap=1
staminacap=1
magicacap=1
slide=1

def next1(event=None):
    global slide
    if slide==1:
        bglabel.config(image=bg1)
    elif slide==2:
        classstart.pack()
        classstart.pack_forget()
        bglabel.config(image=bg2)
    elif slide==3:
        classstart.pack()
        bglabel.pack()
        bglabel.pack_forget()
        nextbutton1.pack()
        nextbutton1.pack_forget()
    slide+=1
    window.update()

def class_select_screen():
    global slide
    if slide==3:
        classstart.config(image=classdesc)
        rougeselbut.pack()
        mageselbut.pack()
        warriorselbut.pack()
    elif slide<3:
        rougeselbut.pack()
        rougeselbut.pack_forget()
        mageselbut.pack()
        mageselbut.pack_forget()
        warriorselbut.pack()
        warriorselbut.pack_forget()

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

classdesc=PhotoImage(file="classdescription.png")
rougedesc=PhotoImage(file="rougedescription.png")
warriordesc=PhotoImage(file="warriordescription.png")
magedesc=PhotoImage(file="magedescription.png")
bg1=PhotoImage(file="backslide1.png")
bg2=PhotoImage(file="backslide2.png")
nextbutton=PhotoImage(file="next.png")
magesel=PhotoImage(file= "mageselect.png")
warriorsel=PhotoImage(file="warriorselect.png")
rougesel=PhotoImage(file="rougeselect.png")

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

rougeselbut= Button(window, image=rougesel, bd=0, command=rouge_select())
rougeselbut.place(x=500, y=200)

warriorselbut= Button(window, image=warriorsel, bd=0, command= warrior_select())
warriorselbut.place(x=670, y=195)

mageselbut= Button(window, image=magesel, bd=0, command=mage_select())
mageselbut.place(x=840, y=200)

nextbutton1=Button(window, image=nextbutton, bd=0, command=next1)
nextbutton1.place(x=100, y=100)

window.bind('<Button-1>', lambda event: next1(event))
window.bind('<Button-1>', lambda event: rouge_select(event))
window.bind('<Button-1>', lambda event: warrior_select(event))
window.bind('<Button-1>', lambda event: mage_select(event))
window.mainloop()
  1. 按钮mageselbut,warriorselbut和rougeselbut并没有做任何事情,但是应该在slide = 3之前看不到它们,这当然是不可见的,现在让class_select_screen变得非常无用(有没有办法解决这个问题?)。

可以很好地恢复classstart标签,我想知道为什么。一开始我以为可能是因为它不在next1之内,但是我尝试了几种不同的方法,一种方法完全失败,而另一种方法是在slide = 2时看不见,但不是1

  1. 下一步需要单击两次以使幻灯片等于2,我对此不太了解。它从1开始,并在末尾说slide + = 1,因此应该一按就可以变成slide = 2?

是的。那里很多,但是如果有人有想法请告诉我。我现在想避免使用网格化,因为我还不是很熟悉网格,而且我读过的所有解释都没有道理,因此我打算在周一向我的教授询问。 (尽管有人会在这里解释这太棒了,尽管我知道我要问很多)

对不起,如果我不清楚,请提前谢谢。

1 个答案:

答案 0 :(得分:2)

要隐藏pack manager显示的按钮b1,请使用b1.pack_forget()。要再次显示它,您可以使用以前从未显示过的方法进行操作:使用b1.pack()b1.place()或(如果屏幕上没有其他内容,请使用b1.grid())。

请注意,b1将被打包在底部(在所有其他已经打包的小部件之后)。为避免这种情况,我建议使用不同的布局管理器(gridplace),或者,当您想再次显示b1时,请隐藏应位于b1下的所有小部件。然后按正确的顺序包装b1和它们。

由于缺少功能,我无法正确运行您的代码,因此我无法确定那里是否有问题并为您调试。

由于您是新手,所以我想向您推荐两个tkinter参考站点,以更轻松地找到问题的答案并扩展您对tkinter的了解:  effbot.orginfohost.nmt.edu

您可以在其中找到网格的详细工作原理。简而言之,网格具有行和列。网格化后,每个窗口小部件都放置在其自己的单元格中(第i行,第j列)。默认情况下,每行/列的高度/宽度与内部的最高/宽度最小的控件一样高。这意味着,如果在某些行/列中没有任何小部件,则不会显示该行/列。当然,您可以使用网格选项进行调整(例如,row_configure()可能会有所帮助)。有关更多信息,请查看我链接的网站。