Способ скрыть и показать кнопку без сетки?(питон ткинтер) - PullRequest
0 голосов
/ 24 февраля 2019

Мне было интересно, есть ли способ скрыть и показать кнопку в 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 еще ничего не делают, но они должны быть невидимыми до слайда = 3, что, конечно,нет, оставляя class_select_screen довольно бесполезным в данный момент (есть ли способ это исправить, может быть?).

Метку classstart удалось восстановить, и мне было интересно, почему.Сначала я подумал, что, может быть, это только потому, что это было не в следующем1, но я попробовал это несколькими разными способами: один, где он полностью потерпел неудачу, как и другие, и другой, где это было невидимо, когда slide = 2, но не 1.

Далее нужно дважды щелкнуть, чтобы получить слайд, равный 2, что я не совсем понимаю.Она начинается с 1 и в конце она говорит: слайд + = 1, поэтому она должна перейти к слайду = 2 в один клик, верно?

Так что да.Это много, но если у кого-то есть идеи, пожалуйста, дайте мне знать.Я хочу сейчас избегать использования сетки, потому что я все еще не очень знаком с ней, и ни одно из прочитанных объяснений не имеет смысла, поэтому я собирался спросить об этом своего профессора в понедельник.(Хотя, если бы кто-то объяснил это здесь, это было бы здорово, хотя я знаю, что спрашиваю много)

Извините, если я не был ясен, но спасибо заранее.

1 Ответ

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

Чтобы скрыть кнопку b1, отображаемую менеджером пакетов , используйте b1.pack_forget().Чтобы отобразить его снова, вы можете сделать это так же, как если бы оно никогда не отображалось ранее: с помощью b1.pack(), b1.place() или (если на экране уже ничего не упаковано) b1.grid().

Обратите внимание, что b1 будет упакован снизу (после всех других уже упакованных виджетов).Чтобы избежать этого, я предлагаю использовать другой менеджер компоновки ( grid или place ) или, когда вы хотите снова отобразить b1, скрыть все виджеты, которые должны быть ниже b1а затем упакуйте b1 и их в правильном порядке.

Я не смог правильно запустить ваш код из-за отсутствия функций, поэтому не могу сказать, что там что-то не так, и отладить его для вас.

Поскольку вы новичок, я хотел бы предложить вам два справочных сайта tkinter, чтобы легче найти ответы на ваши вопросы и расширить свои знания о tkinter: effbot.org & infohost.nmt.edu

Там вы можете узнать, как работает сетка в деталях.Короче говоря, сетка имеет строки и столбцы.При нахождении в сетке каждый виджет помещается в собственную ячейку (i-я строка, j-й столбец).По умолчанию каждая строка / столбец имеет такую ​​же высоту / ширину, как и самый высокий / самый широкий виджет внутри.Это означает, что если в определенной строке / столбце нет виджетов, эта строка / столбец не отображается.Конечно, вы можете настроить это с помощью параметров сетки (например, row_configure () может помочь в этом). Для получения дополнительной информации просмотрите сайты, на которые я ссылался.

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