通过Networkx在Tkinter中构建图并读取条目值

时间:2019-04-21 12:43:12

标签: python numpy tkinter graph networkx

我正在尝试让我的程序读取矩阵,用户可以输入该矩阵,并且 在根中的某个地方构建此图。因此,我们可以在图中设置点数,然后获得空矩阵以插入点之间的关系。之后,我可以提交我的值并且它们是正确的,但是当我尝试构建图形时,总会出现错误,对其进行修复会产生新的错误。

import matplotlib
matplotlib.use('TkAgg')
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import matplotlib.pyplot as plt
import tkinter as tk
import networkx as nx
import numpy as np


class SimpleTableInput(tk.Frame):
    def __init__(self, parent, rows, columns):
        tk.Frame.__init__(self, parent)
        self._entry = {}
        self.rows = rows
        self.columns = columns
        for row in range(self.rows):
            for column in range(self.columns):
                index = (row, column)
                e = tk.Entry(self)
                e.grid(row=row, column=column, stick="nsew")
                e.insert(0, '0')
                self._entry[index] = e
        for column in range(self.columns):
            self.grid_columnconfigure(column, weight=1)
        self.grid_rowconfigure(rows, weight=1)

    def get(self):
        result = []
        for row in range(self.rows):
            current_row = []
            for column in range(self.columns):
                index = (row, column)
                current_row.append(self._entry[index].get())
            result.append(current_row)
        self.matrix = np.array(result)
        return result


class Example(tk.Frame):
    def __init__(self, parent, n):
        tk.Frame.__init__(self, parent)
        self.table = SimpleTableInput(self, n, n)
        self.submit = tk.Button(self, text="Submit", command=self.on_submit)
        self.table.pack(side="top", fill="both", expand=True)
        self.submit.pack(side="bottom")

    def on_submit(self):
        print(self.table.get())
        matrix = self.table.get()
        matrix = np.array(matrix)


def build_graph():
    f = plt.figure(figsize=(5, 4))
    plt.axis('off')
    G = nx.from_numpy_array(matrix)
    pos = nx.circular_layout(G)
    nx.draw_networkx(G, pos=pos)
    canvas = FigureCanvasTkAgg(f, master=root)
    canvas.get_tk_widget().pack(side=Tk.bottom, fill=Tk.BOTH, expand=1)


def create_matrix():
    n = int(e1.get())
    table = Example(root, n).pack(side="left")
    b2 = tk.Button(root, text="build_graph", command=build_graph)
    b2.pack(side='bottom')


root = tk.Tk()
b1 = tk.Button(root, text="Number of points", command=create_matrix)
e1 = tk.Entry(root)
e1.insert(0, '0')
b1.pack(side='right')
e1.pack(side='right')
matrix = []
root.mainloop()

我是tkinter的新手,所以总是会出现错误,我无法解决问题,例如,现在我得到了:

“ AttributeError:'列表'对象没有属性'形状'”

我该如何解决?

或者也许我需要从python中的其他GUI库开始执行此类任务?

1 个答案:

答案 0 :(得分:1)

您使用列表创建图,但是它需要private int[,] matrix = new int[3, 3] { { 0, 1, 0 }, { 0, 1, 0 }, { 1, 1, 1 } };

np.array中,您必须从build_graph获得table并转换为数组

Example

(您将名称def build_graph(): #global table matrix = table.table.get() matrix = np.array(matrix) 用于具有属性表的table的实例,因此您得到Example并可能会误导人)

还有其他问题

table.table中的

table是局部变量,因此您不能在此函数之外访问它。您需要create_graph创建全局变量

global

接下来您会遇到常见错误

def create_matrix():
    global table 

table = Example().pack() 分配给变量None,因为table返回pack()

None

table = Example() table.pack() 有一个小错误,因为您需要side=Tk.bottom, fill=Tk.both而不是tk,也可以使用字符串Tk

最后我得到了这张图。

enter image description here

side="bottom", fill="both"