2016-06-21 147 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

很高興幫助:)如果您沒有其他問題需要解答,您可以點擊答案旁邊的複選標記以將問題標記爲「已回答」 –

相關問題