我正在尝试用numpy、matplotlib和tkinter创建生活游戏。我计划首先询问用户游戏板上有多少行和列,以及一个单元格活产卵的概率。输入这些信息后,用户将按“生成”按钮开始游戏。但是,只要按下按钮,就会弹出错误:“AttributeError:‘numpy.ndarray’object has no attribute‘set\u canvas’”。我不知道为什么FigureCanvasTkAgg不能绘制numpy矩阵。有没有办法在tkinter窗口中绘制numpy矩阵?这是我的代码:
from tkinter import *
import numpy as np
import matplotlib.pyplot as plt
from board import Board
from PIL import Image, ImageTk
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
def num():
n1 = int(t1.get())
n2 = int(t2.get())
n3 = int(t3.get()) / 100.00
initBoard = np.zeros((n1, n2))
for row in range(0,n1):
for column in range(0,n2):
initBoard[row][column] = np.random.choice(np.arange(0, 2), p = [1 - n3, n3])
#game_board = Board(n1, n2, initBoard)
canvas = FigureCanvasTkAgg(initBoard, master=root) # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().grid(row = 4, column = 0)
root.quit()
root = Tk()
root.title('Game of Life')
root.geometry('800x600')
Label(root, text="How many rows?: ").grid(row = 0)
Label(root, text="How many columns?: ").grid(row = 1)
Label(root, text="Probability of spawn (between 0 and 100): ").grid(row = 2)
t1 = Entry(root)
t2 = Entry(root)
t3 = Entry(root)
t1.grid(row = 0, column = 1)
t2.grid(row = 1, column = 1)
t3.grid(row = 2, column = 1)
Button(root, text = 'Generate', command = num).grid(row = 3, column = 1, sticky = W, pady = 4)
fig= plt.figure()
canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
canvas.draw()
canvas.get_tk_widget().grid(row = 4, column = 0)
mainloop()
代码中至少有两个问题:
>
fig = plt.figure() # matplotlib figure
ax = fig.subplot_add(111) # subplot inside figure
canvas = FigureCanvasTkAgg(fig, master=root) # integrate the figure in a tkinter widget
canvas.get_tk_widget().grid(row = 4, column = 0) # display figure in tkinter app
现在,如果您想在图中绘制一些东西,只需使用ax。绘图(…) (或任何其他打印功能)。在您的情况下,由于要显示2D数组,因此可能需要使用ax。imshow(初始化板)。
您在num()
中退出了root,这也会破坏包含您的图形的窗口。我更愿意创建一个Toplevel来询问用户有关参数的信息,然后关闭这个Toplevel,而不是num()
中的root窗口。
完整代码:
from tkinter import * # not a good idea in my opinion, can lead to accidental
# naming conflicts, "import tkinter as tk" is a better alternative
import numpy as np
import matplotlib.pyplot as plt
#~from board import Board
from PIL import Image, ImageTk
from matplotlib.backends.backend_tkagg import (
FigureCanvasTkAgg, NavigationToolbar2Tk)
def num():
n1 = int(t1.get())
n2 = int(t2.get())
n3 = int(t3.get()) / 100.00
top.destroy() # close dialog
initBoard = np.zeros((n1, n2))
for row in range(0, n1):
for column in range(0, n2):
initBoard[row][column] = np.random.choice(np.arange(0, 2), p=[1 - n3, n3])
#game_board = Board(n1, n2, initBoard)
ax.imshow(initBoard) # draw board
canvas.draw_idle() # update matplotlib figure
root = Tk()
root.title('Game of Life')
root.geometry('800x600')
# create matplotlib figure
fig = plt.figure()
ax = fig.add_subplot(111) # create axis
ax.axis('off')
canvas = FigureCanvasTkAgg(fig, master=root) # A tk.DrawingArea.
canvas.get_tk_widget().grid(row=4, column=0)
# toplevel to choose parameters
top = Toplevel(root)
Label(top, text="How many rows?: ").grid(row=0)
Label(top, text="How many columns?: ").grid(row=1)
Label(top, text="Probability of spawn (between 0 and 100): ").grid(row=2)
t1 = Entry(top)
t2 = Entry(top)
t3 = Entry(top)
t1.grid(row=0, column=1)
t2.grid(row=1, column=1)
t3.grid(row=2, column=1)
Button(top, text='Generate', command=num).grid(row=3, column=1, sticky=W, pady=4)
mainloop()
我试着在画布里放一幅画。但就是没有出现。我谷歌了一下,看看哪里出了问题。不幸的是,我还是解决不了。这是我的代码 这是css文件
我的任务是在画布上绘制许多矩形,但所有矩形都有一个旋转角度,它们必须在画布上旋转。我在寻找这个问题的解决方案时遇到的许多建议都指出了绘制一个矩形并旋转画布的方法(canvas.rotate(angle)),但它会旋转所有画布,并且只能使用一个矩形。在画布上绘制许多旋转矩形的最佳方法是什么?我想画矩形(单色,带颜料),但不是位图,因为时间效率和内存。 目前我主要的方法是创建一堆画布,在每个画布上绘制
实际上,我可以使用函数来完成。我从“HTML5画布-如何在图像背景上画一条线?”中得到的东西。但是我需要在不使用from函数的情况下绘制图像,如下所示:
当我运行这个代码时,我看不到椭圆形,我只能看到一个空白的框架。我知道我可以使用方法,但我很想知道为什么我的代码不能工作。
问题内容: 我发现只能填充矩形,而没有圆角,该怎么办? 问题答案: HTML5画布没有提供绘制带有圆角的矩形的方法。 如何使用和方法? 您也可以使用方法代替方法。