Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复Tkinter画布重叠图像?_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 如何修复Tkinter画布重叠图像?

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'''

嘿,伙计们,我有一个用Tkinter用python制作的简单棋盘,我试图在棋盘上的特定行和列添加棋子的图像,但画布一直与图像重叠。请帮忙

这是我的董事会代码:

    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()