python - 是什么让我的 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 矩阵,并且绘制可能需要大量时间。
有谁知道如何改进这段代码?
解决方案
您不应该为此目的使用 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()
推荐阅读
- python - 用 Python 解释 <<
- machine-learning - 为什么 Bert 格式需要一次性列?
- c - 如何使用我的计数排序代码实现基数排序以处理负数
- python - 当我尝试运行我的 python 程序时,我遇到了一个 Django 导入模块错误
- java - 以相同的方法读取 SQLite 数据或以相同的方法从两个表中读取数据
- reactjs - 创建 PrivateRoute 时路由器不渲染
- java - 有没有办法追溯调试执行?
- python - {} 作为 Python 新式格式中的替换键?
- xcode - ionic4 app生成没有www文件夹的iOS文件
- c - 无法在新文本框中显示文本输入