Почему кнопки не отображаются в Tkinter

#python #tkinter

Вопрос:

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

 from tkinter import *
from PIL import Image, ImageTk
root = Tk()
root.geometry("1200x1200")
img = Image.open("s8XND.png")

resized = img.resize((1200, 900), Image.ANTIALIAS)
chessboard = ImageTk.PhotoImage(resized)
canvas = Canvas(root, width = 1200, height = 900)
canvas.place( relheight = 1, relwidth = 1)
canvas.create_image(0, 0, image = chessboard, anchor = "new")

label = Label(root, bg = chessboard)
label.place(pady = 10, padx = 20)
#Black Rook
blackRook = Button(root, text = "Castle", fg = "white", bg = "black")
blackRook.grid(row = 1, column = 0)

#Black Knight
blackHorse = Button(root, text = "Horse", fg = "white", bg = "black")
blackHorse.grid(row = 1, column = 1)

#Black Bishop
blackBishop = Button(root, text = "Bishop", fg = "white", bg = "black")
blackHorse.grid(row = 1, column = 2)

#Black Queen
blackQueen= Button(root, text = "Queen", fg = "white", bg = "black")
blackQueen.grid(row = 1, column = 3)

#Black King
blackKing= Button(root, text = "King", fg = "white", bg = "black")
blackQueen.grid(row = 1, column = 4)

root.mainloop()
 

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

1. Ваш код не может быть выполнен из-за ошибок: _tkinter.TclError: bad anchor position "new" . Также вы забыли позвонить blackBishop.grid(...) и blackKing.grid(...) .

2. Вы хотите разместить изображение шахматной доски внутри холста или на этикетке? Потому что в данный момент вы делаете и то, и другое. Я подозреваю, что вам следует использовать здесь только холст и create_image рисовать значки фигур на шахматной доске, а не кнопки. Затем вы можете определить, на какой фрагмент был нажат, используя метод canvas .find_closest , чтобы определить, на какой значок был нажат.

Ответ №1:

Этот код работает для меня. Обратите внимание, что я удалил метку и исправил несколько ошибок в вашем коде:

 from tkinter import *
from PIL import Image, ImageTk
root = Tk()
root.geometry("1200x1200")
img = Image.open("s8XND.png")

resized = img.resize((1200, 900), Image.ANTIALIAS)
chessboard = ImageTk.PhotoImage(resized)
canvas = Canvas(root, width=1200, height=900)
canvas.place(relheight=1, relwidth=1)
canvas.create_image(0, 0, image=chessboard, anchor="nw")

# Black Rook
blackRook = Button(root, text="Castle", fg="white", bg="black")
blackRook.grid(row=1, column=0)

# Black Knight
blackHorse = Button(root, text="Horse", fg="white", bg="black")
blackHorse.grid(row=1, column=1)

# Black Bishop
blackBishop = Button(root, text="Bishop", fg="white", bg="black")
blackBishop.grid(row=1, column=2)

# Black Queen
blackQueen = Button(root, text="Queen", fg="white", bg="black")
blackQueen.grid(row=1, column=3)

# Black King
blackKing = Button(root, text="King", fg="white", bg="black")
blackKing.grid(row=1, column=4)

root.mainloop()
 

Также обратите внимание, что вы допустили некоторые ошибки при копировании blackHorse и вставке blackKing .

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

1. Использование anchor="ne" in canvas.create_image(...) сделает изображение невидимым. Используйте anchor="nw" вместо этого.

2. Пропустил это. Исправил это. Спасибо.

3. Большое спасибо. Действительно ценю это