Как создать изображение под другим tkinter
Хочу сделать чтобы при выполнении условия появлялось изображение, но оно появляется так, что перекрывает другие и их не видно, как создать изображение чтобы оно появлялось под этими и не перекрывало их? Вот код типа игры
import sys
import random
from PIL import Image, ImageTk
from tkinter import Tk, Frame, Canvas, ALL, NW
from keyboard import *
from time import *
import threading
class Cons:
roadSpeed = 20
class Game(Canvas):
def __init__(self):
super().__init__(
width=1024, height=900, highlightthickness=0, background="black"
)
self.start()
self.pack()
def start(self):
self.inGame = True
self.score = 0
self.barrierX = 128
self.barrierY = -500
self.loadImages()
self.createObjects()
self.locateBarrier()
self.bind_all("<Key>", self.keyPressed)
self.after(100, self.onTimer)
def loadImages(self):
self.icar = Image.open("ttt.png")
self.car = ImageTk.PhotoImage(self.icar)
self.ienemy = Image.open("enemy.png")
self.barrier = ImageTk.PhotoImage(self.ienemy)
self.iroad = Image.open("1396441575.png")
self.road = ImageTk.PhotoImage(self.iroad)
def createObjects(self):
self.create_image(512, 502, image=self.road, tag="road")
self.create_image(128, 650, image=self.car, tag="car")
self.create_text(
30, 10, text="Счет: {0}".format(self.score),
tag="score", fill="white"
)
def moveLeft(self):
car = self.find_withtag("car")
x1, y1, x2, y2 = self.bbox(car)
if x1 - 256 > 2:
self.move(car[0], -256, 0)
def moveRight(self):
car = self.find_withtag("car")
x1, y1, x2, y2 = self.bbox(car)
if x1 + 256 < 1022:
self.move(car[0], 256, 0)
def checkBarrierCollision(self):
barrier = self.find_withtag("barrier")
car = self.find_withtag("car")
x1, y1, x2, y2 = self.bbox(car)
overlap = self.find_overlapping(x1, y1, x2, y2)
for i in overlap:
for j in range(0, len(barrier)):
if barrier[j] == i:
self.inGame = False
def moveRoadAndBarrier(self):
road = self.find_withtag("road")
cnt = 0
for i in range(len(road)):
x, y = self.coords(road[i])
if y < 502:
cnt += 1
if cnt == 0:
self.create_image(512, -502, image=self.road, tag="road")
barrier = self.find_withtag("barrier")
road = self.find_withtag("road")
z = 0
while z < len(road):
self.move(road[z], 0, Cons.roadSpeed)
z += 1
z = 0
while z < len(barrier):
self.move(barrier[z], 0, Cons.roadSpeed)
z += 1
def locateBarrier(self):
barrier = self.find_withtag("barrier")
for i in range(0, len(barrier)):
self.delete(barrier[i])
r = random.randint(1, 3)
for i in range(r):
r1 = random.randint(1, 4)
r2 = r1 - 1
self.create_image(256 * r2 + 128, 20, image=self.barrier, tag="barrier")
def keyPressed(self, e):
car = self.find_withtag("car")
x, y = self.coords(car)
key = e.keysym
leftKey = "Left"
if key == leftKey and x >= 128:
self.moveLeft()
rightKey = "Right"
if key == rightKey and x <= 896:
self.moveRight()
def onTimer(self):
road = self.find_withtag("road")
for i in range(len(road)):
x, y = self.coords(road[i])
if y == 1502:
self.delete(road[i])
self.drawScore()
self.checkBarrierCollision()
if self.inGame:
self.moveRoadAndBarrier()
self.after(100, self.onTimer)
else:
self.gameOver()
def drawScore(self):
score = self.find_withtag("score")
self.itemconfigure(score, text="Счет: {0}".format(self.score))
def gameOver(self):
self.delete(ALL)
self.create_text(self.winfo_width() / 2, self.winfo_height() / 2,
text="Игра окончена", fill="blue")
class Car(Frame):
def __init__(self):
super().__init__()
self.master.title('ооаоаа')
self.board = Game()
self.pack()
def main():
root = Tk()
ooaoaa = Car()
root.mainloop()
if __name__ == '__main__':
main()
Мне нужно чтобы в moveRoadAndBarrier создавалось изображение дороги, которое далее не будет перекрывать машины.
Вот изображения, использованные в коде.

Ответы (1 шт):
Нужно после добавления картинки дороги понижать ее по уровню ("слоям") ниже картинок машин:
if cnt == 0:
self.create_image(512, -502, image=self.road, tag="road")
self.tag_lower("road")
Метод tag_lower перемещает объект (или несколько объектов с общим тегом) на самый низ "стопки" объектов на холсте. См. описание методов холста здесь: Canvas
Еще небольшое дополнение: вы создаете объект-холст Game в методе класса-фрейме Car, но фактически холст крепится к окну, а не к фрейму Car из-за того что в Game не передается родительский объект. Чтобы крепилось к фрейму, можно поправить так:
class Game(Canvas):
def __init__(self, parent=None):
super().__init__(
parent, width=1024, height=900, highlightthickness=0, background="black"
)
...
class Car(Frame):
def __init__(self):
super().__init__(self)
Еще, немного не правильно, что Car меняет заголовок окна, в котором этот фрейм размещен. Если вы вдруг решите поместить этот фрейм в другой фрейм, изменение заголовка перестанет работать. Лучше заголовок менять в функции main().
Также размещение созданных объектов (через .pack(), например) лучше не делать внутри этих объектов, а делать это снаружи: допустим, у вас в окне размещено несколько объектов, и чтобы поменять pack на grid или поменять параметры размещения вам придется заходить в каждый объект. Если размещение "вытащить" из объектов, то оно будет для всех объектов данного фрейма/окна в пределах одной функции, и будет легко его поменять.