Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com background no tkinter


Pedro Vidal

Pergunta

Bom, em meu codigo eu necessitava trocar o fundo do aplicativo de acordo com uma condição. Porém, o novo fundo está sendo carregado na frente de todos os Entry, coisa que não é para acontecer. Alguém saberia como colocar esse novo fundo para realmente o fundo do app? Código abaixo e agradeço pela ajuda!!

(Também adoraria saber se teria algum jeito de fazer o tkinter trabalhar com imagens de fundo transparente, já que importei um png, mas ele interpreta como se fosse um fundo branco)

from tkinter import *
import serial
#listas com os logins e senhas
usuario_br = 'bruno'
senha_br = '1234'

#local para onde enviaremos os sinais
#arduinoData = serial.Serial('com4', 9600)

def led_on():
    #arduinoData.write(b'1')
    print("LED ligado")
def led_off():
    #arduinoData.write(b'0')
    print("LED desligado")

def login():
    sphynx.destroy()

    login_sphynx = Tk()
    login_sphynx.title("Sphynx")
    login_sphynx.geometry("300x600")

    usuario = StringVar()
    senha = StringVar()

    img_fundo_login = PhotoImage(file="sphynx_fundo_login.png")
    img_botao_login = PhotoImage(file="sphynx_botao_login.png")
    img_erro = PhotoImage(file="sphynx_fundo_login_erro.png")

    lab_inicio_login = Label(login_sphynx, image=img_fundo_login)
    lab_inicio_login.place(x=0, y=0)

    en_usuario = Entry(login_sphynx, bd=2, textvariable=usuario)
    en_usuario.place(width=250, height=50, x=27, y=270)

    en_senha = Entry(login_sphynx, bd=2, textvariable=senha, show="*")
    en_senha.place(width=250, height=50, x=27, y=390)

    bt_login = Button(login_sphynx, image=img_botao_login, bd=0, command=lambda: verificacao(login_sphynx, lab_inicio_login, img_erro, usuario, senha))
    bt_login.place(width=200, height=100, x=50, y=470)

    return login_sphynx()

def verificacao(login_sphynx, lab_inicio_login, img_erro, usuario, senha):
    str_usuario = usuario.get()
    str_senha = senha.get()

    if str_usuario in usuario_br and str_senha in senha_br:
        print("Dale deli doli!!")
    else:
        lab_inicio_login.destroy()
        login_erro = Label(login_sphynx, image=img_erro)
        login_erro.place(x=0, y=0)


sphynx = Tk()
sphynx.title("Sphynx")
sphynx.geometry("500x300")
sphynx.iconphoto(True, PhotoImage(file="sphynx.png"))

#importar as imagens
img_banner = PhotoImage(file="sphynx_banner.png")

#labels
lab_inicio = Label(sphynx, image=img_banner)
lab_inicio.pack()

sphynx.after(2000, login)

sphynx.mainloop()
Editado por Pedro Vidal
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0

olhei por cima, e não identifiquei onde é feito a mudança do fundo, seria bom se você indicasse as linhas.

uma coisa que dificulta é que você colocou o codigo, mas não tem as imagens, vai ser complicado testar. se puder fazer um zip apenas com o essencial para o teste vai ajudar muito

Link para o comentário
Compartilhar em outros sites

  • 0
52 minutos atrás, ArteEN disse:

olhei por cima, e não identifiquei onde é feito a mudança do fundo, seria bom se você indicasse as linhas.

uma coisa que dificulta é que você colocou o codigo, mas não tem as imagens, vai ser complicado testar. se puder fazer um zip apenas com o essencial para o teste vai ajudar muito

opa, perdao por não deixar claro. A mudança é realizada na função "def verificação", mais especificamente na parte do "else", que é onde aparece o Label com a imagem de erro no login. Eu até criei o arquivo zip, mas pelo visto o site não aceita

Editado por Pedro Vidal
Link para o comentário
Compartilhar em outros sites

  • 0

ok, é o seguinte

no caso, não esta mudando o plano de fundo, e sim criando um novo elemento.

quando você cria, o ultimo elemento criado fica por cima.

o que você pode fazer é ao invez de destruir a label, simplemente mudar a imagem dela

from tkinter import *

r = Tk()

l = Label(r, text='teste')
l.pack()

img = PhotoImage(file='')

l.config(image=img)) 

 

Link para o comentário
Compartilhar em outros sites

  • 0
22 minutos atrás, ArteEN disse:

ok, é o seguinte

no caso, não esta mudando o plano de fundo, e sim criando um novo elemento.

quando você cria, o ultimo elemento criado fica por cima.

o que você pode fazer é ao invez de destruir a label, simplemente mudar a imagem dela

from tkinter import *

r = Tk()

l = Label(r, text='teste')
l.pack()

img = PhotoImage(file='')

l.config(image=img)) 

 

consegui!! foi de um jeito meio xoxo, mas nesse comentario seu "criando um novo elemento", me veio na mente que era mais facil so deixar o fundo da minha imagem igual ao fundo que teria c fosse transparente

Não sei se pode fazer isso, mas aproveitando para tirar outra duvida.. Teria algum jeito de reabrir uma janela? Pois com o destroy não é possivel fazer isso ne? Codigo atual ta embaixo, e a linha que quero que ocorra o comando ta com um comentario do lado

from tkinter import *
import serial

#'listas' com os logins e senhas
usuario_br = 'bruno'
senha_br = '1234'

#local para onde enviaremos os sinais
arduinoData = serial.Serial('com4', 9600)

def login():
    sphynx.destroy()

    login_sphynx = Tk()
    login_sphynx.title("Sphynx")
    login_sphynx.geometry("300x600")
    login_sphynx.resizable(False, False)

    usuario = StringVar()
    senha = StringVar()

    img_erro = PhotoImage(file="msgerro_improviso.png")
    img_botao_login = PhotoImage(file="sphynx_botao_login.png")
    img_fundo_login = PhotoImage(file="sphynx_fundo_login.png")

    lab_inicio_login = Label(login_sphynx, image=img_fundo_login)
    lab_inicio_login.place(x=0, y=0)

    en_usuario = Entry(login_sphynx, bd=2, textvariable=usuario)
    en_usuario.place(width=250, height=50, x=27, y=270)

    en_senha = Entry(login_sphynx, bd=2, textvariable=senha, show="*")
    en_senha.place(width=250, height=50, x=27, y=390)

    bt_login = Button(login_sphynx, image=img_botao_login, bd=0, command=lambda: verificacao(login_sphynx, img_erro, usuario, senha))
    bt_login.place(width=200, height=100, x=50, y=470)

    return login_sphynx()

def verificacao(login_sphynx, img_erro, usuario, senha):
    str_usuario = usuario.get()
    str_senha = senha.get()

    if str_usuario in usuario_br and str_senha in senha_br:
        print("Login realizado com sucesso!")
        login_sphynx.destroy()
        salas()
    else:
        login_erro = Label(login_sphynx, image=img_erro, bd=0)
        login_erro.place(x=50, y=220)

def salas():
    salas_sphynx = Tk()
    salas_sphynx.title("Sphynx")
    salas_sphynx.geometry("300x600")
    salas_sphynx.resizable(False, False)

    img_fundo_salas = PhotoImage(file="sphynx_fundo_salas.png")
    img_salas_lab1 = PhotoImage(file="sphynx_sala_lab1.png")

    lab_inicio_salas = Label(salas_sphynx, image=img_fundo_salas)
    lab_inicio_salas.place(x=0, y=0)

    bt_salas_lab1 = Button(salas_sphynx, image=img_salas_lab1, bd=0, command=lambda: lab1(salas_sphynx))
    bt_salas_lab1.place(width=250, height=75, x=28, y=300)
    return salas_sphynx()

def lab1(salas_sphynx):
    salas_sphynx.destroy()

    lab1_sphynx = Tk()
    lab1_sphynx.title("Sphynx")
    lab1_sphynx.geometry("500x300")
    lab1_sphynx.resizable(False, False)

    img_fundo_lab1 = PhotoImage(file="sphynx_fundo_lab1.png")

    lab_fundo_lab1 = Label(lab1_sphynx, image=img_fundo_lab1)
    lab_fundo_lab1.place(x=0,y=0)

    bt_abrir = Button(lab1_sphynx, background="green", command=abrir)
    bt_abrir.place(width=250, height=75, x=130, y=100)

    bt_fechar = Button(lab1_sphynx, background="red", command=fechar)
    bt_fechar.place(width=250, height=75, x=130, y=200)

    bt_voltar = Button(lab1_sphynx, background="white", command=salas_sphynx) #botao que eu desejo que volte para a aba anterior
    bt_voltar.place(width=250, height=75, x=130, y=50)

    return lab1_sphynx()

def abrir():
    arduinoData.write(b'1')

def fechar():
    arduinoData.write(b'0')

sphynx = Tk()
sphynx.title("Sphynx")
sphynx.geometry("500x300")
sphynx.resizable(False, False)
sphynx.iconphoto(True, PhotoImage(file="sphynx.png"))

#importar as imagens
img_banner = PhotoImage(file="sphynx_banner.png")

#labels
lab_inicio = Label(sphynx, image=img_banner)
lab_inicio.pack()

sphynx.after(2000, login)

sphynx.mainloop()

 

Editado por Pedro Vidal
Link para o comentário
Compartilhar em outros sites

  • 0

destruiu, não tem volta.

mas, uma coisa é interface, outra é informação.

o que quero dizer é que deve se manter separado a informação essencial separada.

assim você pode criar uma nova aba para mostrar a informação

Link para o comentário
Compartilhar em outros sites

  • 0
6 minutos atrás, ArteEN disse:

destruiu, não tem volta.

mas, uma coisa é interface, outra é informação.

o que quero dizer é que deve se manter separado a informação essencial separada.

assim você pode criar uma nova aba para mostrar a informação

é que o objetivo dessa volta é realmente mostrar a janela de volta, já que essa janela seria como se fosse o acesso para varias outras diferentes, então o usuario tem que conseguir voltar para essa tela para acessar todos os menus e opções, como se fosse uma tela inicial. 

Aí não sei se apenas salvar a informação adiantaria de alguma coisa

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...