這個問題在這里已經有了答案: 如何使用 Tkinter 移動 Canvas 影像? (1 個回答) 2天前關閉。
這是我用來在視窗中顯示棋盤的一段代碼:
import tkinter as tk
from PIL import Image, ImageTk
def render():
window = tk.Tk()
window.geometry("1920x1080")
window.title("Chess 2")
frame = tk.Frame(window)
frame.pack()
canvas = tk.Canvas(frame, width=800, height=800)
canvas.pack()
boardImg = ImageTk.PhotoImage(file = r"successful projects\imgs\board.png")
canvas.create_image(400,400,image=boardImg)
whitePawnImg = ImageTk.PhotoImage(file = r"successful projects\imgs\whitePawn.png")
# ...
for y in range(len(board)):
for x in range(len(board[y])):
match board[y][x]:
case "p":
canvas.create_image(50 (x*100),50 (y*100),image=blackPawnImg)
# ...
case _:
pass
window.mainloop()
在代碼中,“棋盤”是棋盤的表示形式,如下所示(縮短):
[[' ', ' '],
[' ', 'p']]
當我打電話時render(),一切正常。麻煩的是,當我將串列更改為例如。
[[' ', 'p'],
[' ', ' ']]
,然后render()再次呼叫,視窗保持不變。我想要的是讓董事會再次渲染一切。關于如何解決的任何想法?
uj5u.com熱心網友回復:
當您向Canvas小部件添加內容時,使用它的一種create_xxx()方法,如create_image(),回傳一個整數id,您可以稍后通過它的move()方法使用它來移動物件。這就是更新顯示內容所需要做的一切,不需要明確的“重繪 ”步驟。
例如,如果您最初使用以下命令在某處放置了 pawn 影像:
pawn_id = canvas.create_image(50 (x*100), 50 (y*100), image=blackPawnImg)
您可以將 pawn 影像向右移動 10 個像素,向下移動 20 個像素(請注意,移動量是相對于其當前位置指定的):
canvas.move(pawn_id, 10, 20)
您還可以使用更通用的itemconfigure()方法來更改與專案相關聯的其他選項Canvas(例如使用 創建的線條的顏色create_line())。
uj5u.com熱心網友回復:
除了在畫布上繪制、重畫、洗掉或移動物件之外,您不需要任何更新畫布的操作。每當您向畫布添加內容時,畫布都會向事件佇列添加一個事件,告訴 tkinter 小部件需要重繪 。下次控制回傳 時mainloop,畫布將自動重繪 。
您的代碼有一個基本缺陷,每次呼叫refresh都會創建一個全新的視窗、全新的畫布等。相反,您refresh應該使用現有的視窗和畫布,它需要做的就是移動專案。一旦函式回傳,視窗本身將自動重繪 。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/497225.html
標籤:Python tkinter tkinter-canvas
