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()
添加回答
举报