2016-06-21 137 views
1

我想要一个顶层窗口,它显示一个图像和一张关于它旁边图像的信息表。在tkinter的同一个窗口中绘制一个图形和一个表格

我已经成功地使用imshow()显示图像。我想知道两件事:

  • 如何在tkinter中创建表?我找不到这个小部件。
  • 如何在同一个框架中显示两个并排?

如果有帮助,我至今对这个顶层窗口的代码如下:

top = Toplevel() 
view_nets = Frame(top) 
view_nets.grid() 

# Widgets 
f = Figure(figsize=(10,8),dpi=100) 
F = f.add_subplot(111) 

# Read data 
net = np.genfromtxt(file_path) 
# Plot the network. 
im = F.imshow(net) 

canvas = FigureCanvasTkAgg(f,master = top) 
canvas.show() 
canvas.get_tk_widget().grid(column = 0, row = 0) 

toolbar = NavigationToolbar2TkAgg(canvas, top) 
toolbar.update() 
canvas._tkcanvas.pack(side=TOP, fill=BOTH, expand=1) 

正如我所说的,这显示了图像。理想情况下,我希望有一张关于图片旁边的图片的信息表。

感谢您的帮助!

回答

1

对于表,我假设你想要记录的值的行。为此,我会推荐Treeview Widget out of tkinter.ttk

当谈到坐在彼此相邻的两个时,我假设你认为pyplot图形周围的灰色边框是图表本身的一部分(换句话说,你并没有试图放置表格直接进入灰色区域或剧情画布)。为此,我重新安排了如何填充tk.Toplevel,因为您没有使用view_nets来开始任何事情。

import tkinter as tk, tkinter.ttk as ttk 
import matplotlib.pyplot as plt 
import matplotlib.backends.backend_tkagg as TkAgg 
import numpy as np 

top=tk.Toplevel() 

view_nets = tk.Frame(top) 
view_nets.pack(side='left',fill='both',expand=True) ## Packing Left in order to place 
                ## another Frame next to it 

# Widgets 
f = plt.Figure(figsize=(10,8),dpi=100) 
F = f.add_subplot(111) 

canvas = TkAgg.FigureCanvasTkAgg(f,master = view_nets) ## Moved Chart to view_nets Frame 
canvas.show() 
## canvas.get_tk_widget().grid(column = 0, row = 0) I'll explain commenting this out below 

toolbar = TkAgg.NavigationToolbar2TkAgg(canvas, view_nets) 
toolbar.update() 
canvas._tkcanvas.pack(fill='both',expand=True) 

## Adding Frame to bundle Treeview with Scrollbar (same idea as Plot+Navbar in same Frame) 
tableframe = tk.Frame(top) 
tableframe.pack(side='left',fill='y') ## Packing against view_nets Frame 

COLUMNS=['name','value'] ## Column Headers for Data 

## See Documentation for more info on Treeview 
table=ttk.Treeview(tableframe, columns=COLUMNS, show='headings') 
table.pack(side='left',fill='y') 

for column in COLUMNS: ## Setting Column Header 
    table.heading(column,text=column) 

scroll=tk.Scrollbar(tableframe,command=table.yview) ## Adding Vertical Scrollbar 
scroll.pack(side='left',fill='y') 
table.configure(yscrollcommand=scroll.set) ## Attach Scrollbar 

如果出于某些原因,你需要的图表和一个独立的帧(相对于顶层的帧)的表,那么你可以简单地包裹view_netstableframe在一个框架(将他们的父母更改为框架)。

我会提到的另一件事是,如果你 - 至少包括进口产品对每个人来说都更容易 - 我其实只是今天才开始学习matplotlib,这是我可以推断出你正在使用该库的唯一原因(即使这样我也必须仔细研究如何导入TkAgg Widgets)。根据我的经验,保留模块引用(比如如何导入Numpy)只有好处,因为直接导入模块内容可能会有问题(例如,从matplotlib.backends.backend_tkagg导入FigureCanvasTkAgg;或者更糟糕的是导入*)。

至于行“canvas.get_tk_widget()。grid(column = 0,row = 0)”,我得到几何错误。从源头上看,TkAgg小部件实际上,字面上包装自己的父母。这意味着它们不会实际创建自己的框架(这是我的习惯),如果用户为该框架定义几何管理器,将导致几何错误(尽管我会说写matplotlib的人/ pyplot几乎肯定比我聪明,所以他们为什么这样做可能是有原因的)。

无论如何,希望这可以帮助你;让我知道你是否有任何问题!

+0

谢谢你的帮助!这绝对是完美的。非常感激! –

+0

很高兴帮助:)如果您没有其他问题需要解答,您可以点击答案旁边的复选标记以将问题标记为“已回答” –

相关问题