Построение графиков по networkx в tkinter с чтением значений записей - PullRequest
0 голосов
/ 21 апреля 2019

Я пытаюсь заставить мою программу читать матрицу, которую может ввести пользователь, и построить этот график где-нибудь в корне.Таким образом, мы можем установить количество точек в нашем графе, затем мы можем получить пустую матрицу для вставки наших отношений между точками.После этого я могу представить свои значения, и они верны, но когда я пытаюсь построить график, всегда есть ошибки, исправление которых создает новые ошибки.

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: у объекта списка нет атрибута" shape ""

Как я могуисправить это правильно?

Или, может быть, мне нужно начать с другой библиотеки графического интерфейса в Python для таких задач?

1 Ответ

1 голос
/ 21 апреля 2019

Вы используете список для создания графика, но для этого требуется 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 или вы можете использовать строки side="bottom", fill="both"

Наконец, я получаю этот график.

enter image description here

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):
        matrix = self.table.get()
        matrix = np.array(matrix)
        print(matrix)


def build_graph():
    #global table 
    matrix = table.table.get()
    matrix = np.array(matrix)

    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='bottom', fill='both', expand=1) # ERROR Tk.


def create_matrix():
    global table 

    n = int(e1.get())
    table = Example(root, n) # .pack(side="left") ERROR
    table.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()
...