首页 > 解决方案 > 是什么让我的 tkinter 图形如此缓慢?

问题描述

我正在尝试通过python实现GUI编辑工具。我实现了初步代码来测试如何工作。但是,即使是小样例,使用起来也太慢了。

我的代码如下:

import numpy as np
from tkinter import *

nx=10
ny=8
world=np.zeros((ny,nx))
world[:,3]=1
world[1,:]=1

# Tkinter ========                                                                                                   
root = Tk()
root.title("make Land/Sea mask")
root.resizable(0,0)

menu_ROOT = Menu(root)
root.configure(menu = menu_ROOT)

menu_GAME = Menu(menu_ROOT, tearoff = False)
menu_ROOT.add_cascade(label = 'Menu', under = 4, menu = menu_GAME)


###Frame objects###                                                                                                  
root_frame = Frame(root, relief = 'groove', borderwidth = 5, bg = 'LightGray')
game_frame = Frame(root_frame, relief = 'sunken', borderwidth = 3, bg = 'LightGray')
root_frame.pack()
game_frame.pack(pady = 5, padx = 5)

def create_map(world,nx,ny):
    c = 0
    frame_list = []
    for j in np.arange(ny):
        for i in np.arange(nx):

            if  world[j,i]==1:
                frame = Frame(game_frame, width = 20, height = 20, bd = 0.5, relief = 'groove', bg = 'yellow green')
            else:
                frame = Frame(game_frame, width = 20, height = 20, bd = 0.5, relief = 'ridge', bg = 'pale green')

            frame.num = c
            frame_list.append(frame)
            frame.grid(row=j, column=i)
            c += 1

create_map(world,nx,ny)
root.mainloop()

在这种情况下,我设置了 10x8 矩阵,但我最终将使用 360x180 矩阵,并且绘制可能需要大量时间。

有谁知道如何改进这段代码?

标签: pythontkinter

解决方案


您不应该为此目的使用 Tkinter。

这是PyGame中的一个示例,我认为这很容易学习:

import sys
import time
import pygame
import numpy as np

DISPLAY_SIZE = 840, 680

def generate_map(nx, ny):
    return np.rint(np.random.rand(ny, nx))

def render_map(world, display, selected_img, unselected_img, img_size):
    for j in np.arange(world.shape[0]):
        for i in np.arange(world.shape[1]):
            if world[j, i] == 1:
                display.blit(selected_img, (i * img_size[0], j * img_size[0]))
            else:
                display.blit(unselected_img, (i * img_size[0], j * img_size[0]))

display = pygame.display.set_mode(DISPLAY_SIZE, pygame.HWSURFACE | pygame.DOUBLEBUF)

selected = pygame.image.load("selected_cell.png")
unselected = pygame.image.load("unselected_cell.png")
img_size = selected.get_size()                          # Assuming both images are the same size
clock = pygame.time.Clock()

world = generate_map(26, 21)

fps_counter_time = time.perf_counter()
while True:
    clock.tick(60)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit(0)

    render_map(world, display, selected, unselected, img_size)
    pygame.display.flip()

    if (time.perf_counter() - fps_counter_time) > 0.1:
        pygame.display.set_caption("FPS: %.4f" % (clock.get_fps(),))
        fps_counter_time = time.perf_counter()

推荐阅读