Tkinter - Как разместить надписи над фоном?

Я хочу сделать мини-игру, в которой должно появиться окно с фоном изображения, а виджет « Entry должен отображаться в центре фонового изображения. При этом виджеты Label должны располагаться поверх фонового изображения.

Проблемы, с которыми я сталкиваюсь, состоят в том, что поле ввода отображается под изображением, а виджеты label исчезают, если я применяю фоновый код.

Вот вывод с фоном: https://ibb.co/JpM4mGc

А вот без: https://ibb.co/rcmywK1

Вот мой код:

# Guess my number game
# User must attempt to guess randomly selected number within a range in fewest possible attempts

from tkinter import *
import random
import winsound

class Application(Frame):
    """A GUI application which which generates random number and gets user input"""

    def __init__(self, master): #initialize newly created Application object
        """Initialize the frame"""
        Frame.__init__(self, master) # super(Application, self).__init__(master) in python 3
        self.grid()
        self.create_widgets()
        self.number = random.randint(1, 20)
        self.numberofguesses = 0



    def create_widgets(self):
        """Get user inputs"""
        # create instruction label
        Label(self, text = "Gok een getal tussen de 1 en 20").grid(row = 0, column = 0, sticky = W)
        Label(self, text = "Probeer het binnen 5 keer te gokken!").grid(row = 1, column = 0, sticky = W)

        # create guess input prompt label and entry
        self.guess_ent = Entry(self, width=30)
        self.guess_ent.grid(row = 2, column = 0, sticky = W)

        # create start game prompt label and submit button
        Button(self, text = "Gok", command = self.run_game).grid(row = 2, column = 0)
        Button(self, text = "Reset", command = self.reset_game).grid(row = 3, column = 0, sticky=W)


        # create submit button
        #Button(self, text = "Submit", command = )

        # create computer feedback text box
        self.text = Text(self, width=75, height=2, wrap=WORD)
        self.text.grid(row=4, column=0, columnspan=2)

    def run_game(self):
        """Generate number and get user input"""
        try:
            guess = int(self.guess_ent.get())
            self.numberofguesses += 1
            print(self.numberofguesses)



            if guess == self.number:
                print_text = "Goed gedaan! Je hebt het nummer gegokt. het was {0}".format(self.number)
                self.text.delete(0.0, END)
                self.text.insert(0.0, print_text)
                self.numberofguesses = 0
                self.guess_ent.delete(0, END)
                self.number = random.randint(1, 20)


            else:
                if guess > self.number:
                   print_text = "Je gokt {0}.".format(guess)
                   print_text += " nummer is te hoog"
                   self.text.delete(0.0, END)
                   self.text.insert(0.0, print_text)
                   self.guess_ent.delete(0, END)

                else:
                    print_text = "Je gokt {0}.".format(guess)
                    print_text += " nummer is te laag"
                    self.text.delete(0.0, END)
                    self.text.insert(0.0, print_text)
                    self.guess_ent.delete(0, END)
                if self.numberofguesses == 5:
                    print_text = "Je bent af, alle 5 levens zijn op! Het getal was {0}".format(self.number)
                    self.text.delete(0.0, END)
                    self.text.insert(0.0, print_text)
                    self.guess_ent.delete(0, END)
                    self.numberofguesses = 0
                    self.number = random.randint(1, 20)

        except:
            print('Ongeldige nummer')                         


    def reset_game(self):          
            print_text = "Game is gereset!"
            self.number = random.randint(1, 20)
            self.text.delete(0.0, END)
            self.text.insert(0.0, print_text)
            self.numberofguesses = 0

# main
root = Tk()
root.title("Guessing Game")
root.resizable(0,0)
root.geometry(駼x120')
winsound.PlaySound("location", winsound.SND_ASYNC)
app = Application(root)

# background
photo = PhotoImage(file="background.jpg")
background_label = Label(root, image=photo)
background_label.place(x=0, y=0, relwidth=1, relheight=1)
background_label.image = photo

root.grid()
root.mainloop()

Всего 1 ответ


Виджеты имеют порядок размещения (также известный как z-порядок или z-индекс). Виджеты, созданные позже, будут поверх виджетов, созданных ранее.

Вы можете либо создать свою фоновую метку перед любыми другими виджетами, либо использовать метод lower чтобы изменить его место в порядке расположения (например: background_label.lower() ) так, чтобы оно было ниже других виджетов.


Есть идеи?

10000