为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我不能在 tkinter 画布中绘制 numpy 矩阵?

为什么我不能在 tkinter 画布中绘制 numpy 矩阵?

宝慕林4294392 2023-05-09 15:11:38
我正在尝试使用 numpy、matplotlib 和 tkinter 创建生命游戏。我打算首先询问用户游戏板上的行数和列数,以及一个单元格存活的概率。输入这些信息后,用户将按下“生成”按钮开始游戏。但是,无论何时按下按钮,都会弹出错误:“AttributeError: 'numpy.ndarray' object has no attribute 'set_canvas'”。我不知道为什么 FigureCanvasTkAgg 不能绘制一个 numpy 矩阵。有没有什么方法可以在 tkinter 窗口中绘制一个 numpy 矩阵?这是我的代码:from tkinter import *import numpy as npimport matplotlib.pyplot as pltfrom board import Boardfrom PIL import Image, ImageTkfrom 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()
查看完整描述

1 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

您的代码中至少有两个问题:


您没有使用FigureCanvasTkAgg正确的方法,此类创建了一个包含 matplotlib 图的画布,您可以将其集成到您的 tkinter 应用程序中。然而,这不是用这个类来绘制你的情节,而是用类AxesSubplot(即 中的子图Figure)。以下是如何创建 matplotlib 图并将其集成到 tkinter 应用程序中:


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.plot(...)(或任何其他绘图函数)。在你的例子中,因为你想显示一个二维数组,所以你可能想使用ax.imshow(initBoard).


你退出root,num()这也会破坏包含你的图形的窗口。我宁愿做的是创建一个Toplevel向用户询问参数的问题,并关闭这个顶层,而不是num().


完整代码:


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()



查看完整回答
反对 回复 2023-05-09
  • 1 回答
  • 0 关注
  • 118 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信