Tkinter的不同写法产生拖影及解决办法

文章提供了两个Python代码片段,分别展示了一个存在拖影问题和已解决拖影问题的示例。代码使用tkinter库创建图形界面,通过Canvas对象绘制矩形并移动,第一个代码在移动图形时出现了拖影效果,而第二个代码通过更新和重绘所有图形成功消除了拖影。游戏循环用于控制图形的动态更新。
摘要由CSDN通过智能技术生成

一:出现拖影的代码:

import random
import tkinter as tk


def show_one(base_canvas, blocks, xy, move=[0, 0], colour="lightgreen"):
    # base_canvas是本体,blocks是细胞坐标[[1,2].......],xy组织坐标[m,n],move运动方向[a,b],colour颜色
    for block in blocks:
        block_x1 = (block[0] + xy[0] + move[0]) * SIZE
        block_y1 = (block[1] + xy[1] + move[1]) * SIZE 
        block_x2 = block_x1 + SIZE
        block_y2 = block_y1 + SIZE

        base_canvas.create_rectangle(block_x1, block_y1, block_x2, block_y2,
                                     fill=colour, outline="white", width=1)


def show_move(base_canvas, blocks, xxyy, move=[0, 0], colour="lightgreen"):
    # base_canvas是本体,blocks是细胞坐标[[1,2].......],xy组织坐标[m,n],move运动方向[a,b],colour颜色

    show_one(base_canvas, blocks, xxyy, [0, 0], )  # 默认地图色
    xxyy[0] = xxyy[0] + move[0]
    xxyy[1] = xxyy[1] + move[1]
    show_one(base_canvas, blocks, xxyy, move, shap_colour)


def maps():
    map_big = []
    for x in range(X_X):
        for y in range(Y_Y):
            map_big.append([x, y])
    return map_big


colour_list = ["blue", "red", "yellow",  "purple", "orange", "Cyan"]
SHAPES = [[[-1, -1], [0, -1], [-1, 0], [0, 0]],
          [[-1, 0], [0, 0], [0, -1], [1, -1]],
          [[-1, 0], [0, 0], [0, -1], [1, 0]],
          [[0, 1], [0, 0], [0, -1], [0, -2]],
          [[-1, 0], [0, 0], [-1, -1], [-1, -2]],
          [[-1, 0], [0, 0], [0, -1], [0, -2]],
          [[-1, -1], [0, -1], [0, 0], [1, 0]]]

shape_one = random.choice(SHAPES)
shap_colour=random.choice(colour_list)

base = tk.Tk()

FPS = 400
X_X = 10
Y_Y = 20
SIZE = 30
width = X_X * SIZE + 200
height = Y_Y * SIZE + 200
basement = tk.Canvas(base, width=width, height=height, )
basement.pack()

mn = [4, 4]  # 初始坐标在外面,可以变化,在函数内部,不会变化
movement = [0, 1]


def game_loop():
    show_move(basement, shape_one, mn, movement, )
    base.after(FPS, game_loop)


show_one(basement, maps(), [0, 0], [0, 0])

base.after(FPS, game_loop)
base.mainloop()

二:解决掉拖影的代码

import random
import tkinter as tk


def sh_one(base_canvas, block, xy, colour="lightgreen"):

    block_x1 = (block[0] + xy[0]) * SIZE
    block_y1 = (block[1] + xy[1]) * SIZE
    block_x2 = block_x1 + SIZE
    block_y2 = block_y1 + SIZE

    base_canvas.create_rectangle(block_x1, block_y1, block_x2, block_y2,
                                 fill=colour, outline="white", width=1)


def sh_move(base_canvas, blocks, xxyy, move=[0, 0], colour="lightgreen"):
    # base_canvas是本体,blocks是细胞坐标[[1,2].......],xy组织坐标[m,n],move运动方向[a,b],colour颜色
    for bb in blocks:
        sh_one(base_canvas, bb, xxyy, )  # 默认地图色

    xxyy[0] = xxyy[0] + move[0]
    xxyy[1] = xxyy[1] + move[1]

    for bbb in blocks:
        sh_one(base_canvas, bbb, xxyy, shap_colour)


def show_maps():
    map_big = []
    for x in range(X_X):
        for y in range(Y_Y):
            map_big.append([x, y])

    for bb in map_big:
        sh_one(basement, bb, [0, 0], colour="lightgreen")


colour_list = ["blue", "red", "yellow", "purple", "orange", "Cyan"]
SHAPES = [[[-1, -1], [0, -1], [-1, 0], [0, 0]],
          [[-1, 0], [0, 0], [0, -1], [1, -1]],
          [[-1, 0], [0, 0], [0, -1], [1, 0]],
          [[0, 1], [0, 0], [0, -1], [0, -2]],
          [[-1, 0], [0, 0], [-1, -1], [-1, -2]],
          [[-1, 0], [0, 0], [0, -1], [0, -2]],
          [[-1, -1], [0, -1], [0, 0], [1, 0]]]

shape_one = random.choice(SHAPES)
shap_colour = random.choice(colour_list)

base = tk.Tk()
FPS = 200
X_X = 10
Y_Y = 20
SIZE = 30
width = X_X * SIZE + 200
height = Y_Y * SIZE + 200
basement = tk.Canvas(base, width=width, height=height, )
basement.pack()

mn = [5, 1]  


def game_loop():
    sh_move(basement, shape_one, mn, [0, 1], )
    base.after(FPS, game_loop)


show_maps()
base.after(FPS, game_loop)
base.mainloop()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值