2016-06-21 4 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.

Когда дело доходит до того, чтобы сидеть рядом друг с другом, я предполагаю, что вы считаете, что серая граница вокруг фигуры пиплета является частью самой диаграммы (другими словами, вы не пытаетесь поместить Таблицу непосредственно в серой области или на холсте сюжета). Для этого я перестроил то, как вы заселяли 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 

Если по каким-то причинам, вам нужно к диаграмме и таблице в независимой раме (в отличие от рамы TopLevel в), то вы можете просто обернуть view_nets и tableframe в раме (измените родительский элемент на фрейм).

Еще одна вещь, о которой я расскажу, это то, что для всех легче, если вы, по крайней мере, включите импорт; Я на самом деле только начал изучать matplotlib сегодня, и это было единственной причиной, по которой я мог предположить, что вы использовали эту библиотеку (и даже тогда мне пришлось немного потрудиться, чтобы выяснить, как импортировать виджеты TkAgg). По моему опыту, есть только преимущества для хранения ссылок на модули (например, как вы импортировали Numpy), где могут возникнуть проблемы с непосредственным импортом содержимого модуля (т. Е. Из matplotlib.backends.backend_tkagg import FigureCanvasTkAgg или, что еще хуже, import *).

Что касается строки "canvas.get_tk_widget(). Grid (column = 0, row = 0)", я получал от нее ошибку геометрии. Заглядывая в источник, виджеты TkAgg на самом деле, буквально pack сами родителям. Это означает, что они не создают собственный фрейм (который является привычкой, в котором я нахожусь), что приведет к ошибкам геометрии, если пользователь определит менеджера геометрии для этого фрейма (хотя я скажу, что ребята, которые писали matplotlib/pyplot почти наверняка более умны, чем я, поэтому, вероятно, есть причина, почему они это сделали).

В любом случае, надеюсь, что это поможет вам; Дайте знать, если у вас появятся вопросы!

+0

Большое спасибо за помощь! Это абсолютно идеально. Очень признателен! –

+0

Рад помочь :) Если вам ничего не нужно для этого вопроса, вы можете нажать галочку рядом с ответом, чтобы отметить вопрос как «Ответ», –

Смежные вопросы