Python 如何修复Tkinter画布重叠图像?
嘿,伙计们,我有一个用Tkinter用python制作的简单棋盘,我试图在棋盘上的特定行和列添加棋子的图像,但画布一直与图像重叠。请帮忙 这是我的董事会代码:Python 如何修复Tkinter画布重叠图像?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,嘿,伙计们,我有一个用Tkinter用python制作的简单棋盘,我试图在棋盘上的特定行和列添加棋子的图像,但画布一直与图像重叠。请帮忙 这是我的董事会代码: class GameBoard(tk.Frame): def __init__(self, parent, rows=8, columns=8, size=75, color1="white", color2="lightgrey"): '''size is in pixels'''
class GameBoard(tk.Frame):
def __init__(self, parent, rows=8, columns=8, size=75, color1="white",
color2="lightgrey"):
'''size is in pixels'''
self.rows = rows
self.columns = columns
self.size = size
self.color1 = color1
self.color2 = color2
self.pieces = {}
canvas_width = columns * size
canvas_height = rows * size
tk.Frame.__init__(self, parent)
self.canvas = tk.Canvas(self, borderwidth=0, highlightthickness=0,
width=canvas_width, height=canvas_height, background="white")
self.canvas.pack(side="top", fill="both", expand=True, padx=2, pady=2)
这是我的图像放置代码,我已经将图像放置在600×600,只是为了测试
self.canvas.WhiteKnight = tk.PhotoImage(file = 'E:\\Final Project +
Report\\Pieces\\WhiteKnight.png')
self.canvas.create_image(600,600, image = self.canvas.WhiteKnight, anchor = 'c')
任何帮助都将不胜感激 与大多数图形工具一样,放置在画布上的项目具有z索引(或者用特金特的说法,是堆叠顺序)。默认情况下,项目按创建顺序“堆叠” 看起来您首先创建的是图像,最后创建的是电路板。一个简单的解决方案是颠倒顺序,首先创建电路板 如果这是不切实际的,您可以使用画布的
lift
方法将一个或多个片段提升到其他片段之上
例如:
item_id = self.canvas.create_image(...)
<other canvas objects created here>
self.canvas.lift(item_id)
嗯,它是重叠的,因为你已经给出了导致它们重叠的坐标。你试过改变坐标吗?是它们重叠的问题,还是图像位于正方形下方而不是上方的问题?图像位于画布下方,如图所示,我尝试更改坐标并得到相同的结果。是的,问题是图像在正方形下方而不是上方。不同坐标下不可能得到相同的结果。至少,图像应该显示在不同的位置。或者你是说,即使使用不同的坐标,它仍然显示在相同的位置?当我更改坐标时,图像的位置确实发生了变化,但是当我将要添加图像的特定行和列的坐标放置到其中时,画布与图像重叠。我将600乘以600的原因是为了显示画布与图像重叠。@manlike:我应该更清楚:在画布上创建所有其他内容后,需要调用
lift
。
import tkinter as tk
image_data = '''
R0lGODlhEAAQAOYAAElJSU5OTlFRUVJSUlNTU1hYWFtbW2FhYWJiYmRkZGtra21t
bW5ubm9vb3FxcXl5eYCAgIGBgYKCgoODg4WFhYeHh4mJiYyMjI+Pj5ycnJ6enqCg
oKGhoaOjo6Wlpaampqenp6ioqKqqqqurq6ysrLCwsLGxsbKysrW1tbe3t7m5ubq6
ury8vL29vb6+vr+/v8DAwMHBwcLCwsPDw8TExMXFxcbGxsfHx8jIyMnJycrKysvL
y8zMzM3Nzc7Ozs/Pz9DQ0NHR0dLS0tTU1NXV1dbW1tjY2NnZ2dvb29zc3N3d3d7e
3uLi4uTk5OXl5efn5+np6e3t7QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAACH5BAkAAFIALAAAAAAQABAAAAfDgFKCgzs3NIOIiVI3Tk0k
ioJBPjpSMktKJ1IkIIhASVFIMi5FQyUkO08piDRJQ0dIpEdCOzgPDohDPDkrGRwy
NjEpFoI4NDBGPSwSghgzMj0XFRM0UEU5Ph6IJDQrNkoKL0xCNj0miCEyKTBCBx0Y
Gz82PBrMMSwqCQUEgiQ1MTU3RICI4QKFCEQjPhCpsSNIjhs8arTYwQARiyUfJlCg
IWMBgw9CIAxA1CCBlAmFEEgpEAAAJCkRWpww8DJRAQEjEwUCADs=
'''
def do_lift():
canvas.lift("piece")
root = tk.Tk()
canvas = tk.Canvas(root, width=400, height=400)
button = tk.Button(root, text="Lift", command=do_lift)
button.pack(side="top")
canvas.pack(side="top", fill="both", expand=True)
# create items before the board
image = tk.PhotoImage(data=image_data)
canvas.create_image(130, 130, image=image, anchor="center", tags=(("piece",)))
canvas.create_image(150, 150, image=image, anchor="center", tags=(("piece",)))
canvas.create_image(170, 170, image=image, anchor="center", tags=(("piece",)))
canvas.create_image(170, 130, image=image, anchor="center", tags=(("piece",)))
canvas.create_image(130, 170, image=image, anchor="center", tags=(("piece",)))
# create the board
color = "black"
for x in range(0, 300, 20):
for y in range(0, 300, 20):
canvas.create_rectangle(x,y,x+20, y+20, fill=color)
color = "bisque" if color == "black" else "black"
root.mainloop()