Как изменить видимость кнопки в tkinter?

#python #python-3.x #tkinter

#python #python-3.x #tkinter

Вопрос:

Я новичок в python и пытаюсь создать приложение, в котором я хочу, чтобы кнопка была видна только после того, как я нажму кнопку «показать». Кнопка не должна быть видна с самого начала приложения, она должна быть видна только после нажатия на кнопку «показать».

У меня есть этот код, который скрывает кнопку после нажатия на другую кнопку. Он изменяет свой текст на «показать» после скрытия кнопки.

 
from tkinter import *

root = Tk()

btn1 = Button(root,text="Example")
btn1.visible = True
btn1.place(x=20, y=50)
btn1.pi = btn1.place_info()

btn3 = Button(root, text="click me", command=lambda:plugin())
btn3.place(x=20, y=150)

def plugin():
    master = Tk()

    def toggle1():
        if btn1.visible:
            btnToggle1["text"] = "Show Example"
            print ("Now you don't")
            btn1.place_forget()
        else:
            btn1.place(btn1.pi)
            print ("Now you see it")
            btnToggle1["text"] = "Hide Example"
        btn1.visible = not btn1.visible

    
    btnToggle1 = Button(master, text="Hide Example", command=toggle1)
    btnToggle1.place(x=70, y=150)

    master.mainloop()

root.mainloop()

  

Я хочу, чтобы кнопка отображалась только после того, как я нажму на кнопку «показать», а не с самого начала.

Ответ №1:

Рискуя заявить очевидное, если вы не хотите, чтобы кнопка была видна при запуске, не показывайте кнопку при запуске.

Вы явно делаете кнопку видимой с помощью этой строки кода рядом с началом программы:

 btn1.place(x=20, y=50)
  

Затем вы настраиваете btn1.pi с помощью вызова place_info , но вам не нужно этого делать. Вы можете установить напрямую, btn1.p без предварительного вызова .place с последующим place_info .

 btn1 = Button(root,text="Example")
btn1.visible = False
btn1.pi = {"x": 20, "y": 50}
  

Обратите внимание, что я также изменил btn1.visible на False . На самом деле вам не нужен отдельный атрибут, чтобы отслеживать, виден ли он, tkinter может ответить на этот вопрос с помощью метода winfo_viewable() .

Или вы можете просто удалить кнопку после вычисления btn1.pi :

 btn1.place(x=20, y=50)
btn1.visible = False
btn1.pi = btn1.place_info()
btn1.place_forget()
  

Ответ №2:

Я знаю, что это не по вопросу, мне было трудно найти это. Если вы используете библиотеку GTK, то ButtonName.set_visible(False) установите ее невидимой

приведенное ниже предназначено для tkinter, я только что протестировал приведенное ниже для tkinter:

 from tkinter import *

def hide_me(event):
    event.widget.pack_forget()
def make_invisible(widget):
   widget.pack_forget()
root = Tk()
btn=Button(root, text="Click")
btn.bind('<Button-1>', hide_me)
btn.pack()
btn2=Button(root, text="Click too")
btn2.bind('<Button-1>', hide_me)
btn2.pack()
make_invisible(btn2)
root.mainloop()
  

make_invisible(btn2) метод делает ее невидимой, однако обязательно вызывайте ее после упаковки кнопки, иначе она все равно будет отображаться.
вот мои ресурсы, которые я использовал, чтобы добраться до этого кода
https://www.tutorialspoint.com/how-to-make-a-tkinter-widget-invisible
и https://newbedev.com/in-tkinter-is-there-any-way-to-make-a-widget-not-visible

Комментарии:

1. Они не используют GTK

Ответ №3:

я надеюсь, что это то, что вы имеете в виду:

 from tkinter import *
import tkinter

root = Tk()

btn1 = Button(root,text="Example")
btn1.visible = True
btn1.place(x=20, y=50)
btn1.pi = btn1.place_info()

btn3 = Button(root, text="click me", command=lambda:plugin())
btn3.place(x=20, y=150)

def plugin():
    master = Tk()

    def toggle1():
        if btn1.visible:
            btnToggle1["text"] = "Show Example"
            btnToggle1["state"] = DISABLED
            print ("Now you don't")
            btn1.place_forget()
        else:
            btn1.place(btn1.pi)
            print ("Now you see it")
            btnToggle1["state"] = NORMAL
            btnToggle1["text"] = "Hide Example"
        btn1.visible = not btn1.visible


    btnToggle1 = Button(master, text="Hide Example", command=toggle1)
    btnToggle1.place(x=70, y=150)

    master.mainloop()

root.mainloop()
  

Комментарии:

1. На самом деле, это меняет не видимость, а скорее кликабельность. Является ли кнопка интерактивной или нет.