Изменение цвета метки на основе пользовательского ввода

#python #tkinter

#питон #tkinter

Вопрос:

Я создал программу для угадывания песен с помощью Tkinter, и у меня есть такая программа, чтобы пользователи нажимали кнопку для воспроизведения песни, вводили, какая, по их мнению, песня, и после прослушивания и угадывания всех песен нажимали отправить. Теперь в правой части полей ввода у меня есть метка, которая либо показывает текст «Правильный», либо «Неправильный» относительно того, правильно ли они поняли песню, есть ли способ сделать этот текст зеленым, когда они поняли его правильно, и красным, когда они поняли это неправильно. Я поэкспериментировал с несколькими вещами, перечисленными в приведенном ниже коде.

 from playsound import playsound
import tkinter as tk
from tkinter import *

master=tk.Tk()
master.title("Song Guessing Game")
master.config(bg="ghost white")


def play1():
    playsound("sickomode.mp3")

def play2():
    playsound("onedance.mp3")

def play3():
    playsound("uptownfunk.mp3")

def play4():
    playsound("shapeofyou.mp3")

tk.Label(master,text="Song Guesser",font="Verdanda 20 underline bold",bg="ghost white",fg="black").grid(row=0,column=1)

tk.Button(master,text="Play Song 1",command=play1,font="Verdanda 15 bold").grid(row=1,column=0)
tk.Button(master,text="Play Song 2",command=play2,font="Verdanda 15 bold").grid(row=2,column=0)
tk.Button(master,text="Play Song 3",command=play3,font="Verdanda 15 bold").grid(row=3,column=0)
tk.Button(master,text="Play Song 4",command=play4,font="Verdanda 15 bold").grid(row=4,column=0)

guess1=tk.Entry(master,bg="ghost white",fg="black",font="Verdanda 15")
guess2=tk.Entry(master,bg="ghost white",fg="black",font="Verdanda 15")
guess3=tk.Entry(master,bg="ghost white",fg="black",font="Verdanda 15")
guess4=tk.Entry(master,bg="ghost white",fg="black",font="Verdanda 15")

guess1.grid(row=1,column=1)
guess2.grid(row=2,column=1)
guess3.grid(row=3,column=1)
guess4.grid(row=4,column=1)


def submit():
    s1guess=str(guess1.get()).upper()
    if s1guess=="SICKO MODE":
        print ("Correct")
        status.set("Correct")
        
    elif s1guess!="SICKO MODE":
        print("Incorrect")
        status.set("Incorrect")
    s2guess=str(guess2.get()).upper()
    if s2guess=="ONE DANCE":
        print("Correct")
        status2.set("Correct")
    elif s2guess!="ONE DANCE":
        print("Incorrect")
        status2.set("Incorrect")
    s3guess=str(guess3.get()).upper()
    if s3guess=="UPTOWN FUNK":
        print("Correct")
        status3.set("Correct")
    elif s3guess!="UPTOWN FUNK":
        print("Incorrect")
        status3.set("Incorrect")
    s4guess=str(guess4.get()).upper()
    if s4guess=="SHAPE OF YOU":
        print("Correct")
        status4.set("Correct")
    elif s4guess!="SHAPE OF YOU":
        print("Incorrect")
        status4.set("Incorrect")

status=StringVar()
status2=StringVar()
status3=StringVar()
status4=StringVar()


scolor=StringVar()
s2color=StringVar()
s3color=StringVar()
s4color=StringVar()


tk.Label(master,textvariable=status,font="Verdanda 15 bold",fg=scolor.get()).grid(row=1,column=2)
tk.Label(master,textvariable=status2,font="Verdanda 15 bold",fg=s2color.get()).grid(row=2,column=2)
tk.Label(master,textvariable=status3,font="Verdanda 15 bold",fg=s3color.get()).grid(row=3,column=2)
tk.Label(master,textvariable=status4,font="Verdanda 15 bold",fg=s4color.get()).grid(row=4,column=2)


tk.Button(master,text="Submit Score",command=submit).grid(row=5,column=1)


master.mainloop()
 

Основная область, на которую я смотрю, — это нижний набор меток. С помощью текущего способа, которым я это сделал, мне удалось заставить его работать, но значением по умолчанию для переменных scolor является просто «», который не является цветом, и поэтому код не работает

Ответ №1:

Используйте метод configure:

 ...
label.configure(foreground='[colour you want]')
...
 

Ответ №2:

Вам нужно использовать Label.config(fg=...) для изменения цвета переднего плана a Label , поэтому вам нужно назначить переменные для меток результатов:

 label1 = tk.Label(master, font="Verdanda 15 bold", width=10)
label2 = tk.Label(master, font="Verdanda 15 bold", width=10)
label3 = tk.Label(master, font="Verdanda 15 bold", width=10)
label4 = tk.Label(master, font="Verdanda 15 bold", width=10)

label1.grid(row=1, column=2)
label2.grid(row=2, column=2)
label3.grid(row=3, column=2)
label4.grid(row=4, column=2)
 

Затем измените submit() , чтобы изменить цвет переднего плана этих меток на основе результата угадывания:

 def submit():
    def check(guess, expected, label):
        if guess.get().strip().upper() == expected:
            label.config(text="Correct", fg="green")
        else:
            label.config(text="Incorrect", fg="red")

    check(guess1, "SICKO MODE", label1)
    check(guess2, "ONE DANCE", label2)
    check(guess3, "UPTOWN FUNK", label3)
    check(guess4, "SHAPE OF YOU", label4)
 

Обратите внимание, что вам вообще не нужны эти statusX переменные и sXcolor переменные.