python - 在 tkinter 中通过 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:‘list’对象没有属性‘shape’”
我怎样才能正确修复它?
或者我可能需要从 python 中的其他 GUI 库开始执行此类任务?
解决方案
您使用 list 来创建情节,但它需要np.array
.
build_graph
你必须从数组中获取并table
转换Example
为数组
def build_graph():
#global table
matrix = table.table.get()
matrix = np.array(matrix)
table
(例如,您使用Example
具有属性表的名称,因此您会得到table.table
它,这可能会产生误导)
还有其他问题
table
increate_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"
最后我得到了这张图。
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()
推荐阅读
- c - 为什么当 recvfrom() 来自多播组地址时我得到 -1?
- python - (pymysql.err.OperationalError) (1045, u"Access denied for user 'cmr378'@'localhost' (using password: YES)")
- c# - 更新行时编辑文本文件
- powershell - 尝试从互联网机器运行 ps1 文件时,unblock-file 可以摆脱提示警告
- vba - 为什么我的 Dlookup 中有语法错误
- python - 数组是(800, )维,每个元素都是(240, )维,怎么改成(800, 240)
- php - 如果mysql不返回结果或为空,我将如何显示消息
- javascript - 脚本在 ExtendScript Toolkit 中正确执行,但在 Illustrator 中不正确
- coldfusion - 将数据传递给使用函数的成员函数
- javascript - 复选框状态的更改无法识别 ReactJS