2017-08-02 40 views
0

我試圖在tkinter中創建一個窗口來顯示我的計算結果。它應該有一個圖表和一些小表格。我無法按照我需要的方式安排他們。以下是示例代碼。在這種情況下,我只顯示一個圖表和一個表格。在tkinter的窗口中更改表格的位置

import matplotlib 
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg 
from matplotlib.figure import Figure 
import tkinter as tk 
from tkinter import ttk 
import numpy as np 
import pandas as pd 

df1 = pd.DataFrame(np.random.randint(0,30,size=(15, 3)), columns=list('ABC')) 
df1['index'] = df1.index 

l1 = [1,2,3,4,5] 
l2 = [6,7,8,9,10] 
l3 = [100,200,300,400,500] 

root = tk.Tk() 
lf = ttk.Labelframe(root, text='Results') 
lf.grid(row=0, column=0, sticky='nwes', padx=3, pady=3) 

fig = Figure(figsize=(10,5), dpi=70) 
ax = fig.add_subplot(111) 

df1.plot(x='index', y=['A', 'B', 'C'], ax=ax) 

canvas = FigureCanvasTkAgg(fig, master=lf) 
canvas.show() 
canvas.get_tk_widget().grid(row=0, column=0) 

label = ttk.Label(root, text= 'Res_values') 
label.config(font=("Courier", 20)) 
label.place(x = 810, y = 70) 

li1 = l1 
li2 = l2 
li3 = l3 
list1 = tk.Listbox(root)  
list2 = tk.Listbox(root) 
list3 = tk.Listbox(root) 
for item in li1:    
    list1.insert(0,item) 

for item in li2:    
    list2.insert(0,item) 

for item in li3: 
    list3.insert(0,item) 

list1.grid(row=0, column=1)      
list2.grid(row=0, column=2) 
list3.grid(row=0, column=3) 

root.mainloop() 

代碼執行的結果如下所示:

pic1

我想表被放置更高,更接近圖形和列變得更小。

就像那個

pic2

是否有可能做到這一點?

UPD我改變它表示代碼的部分在哪裏放置表

label = ttk.Label(root, text= 'Res_values') 
label.config(font=("Courier", 20)) 
label.grid(row=0, column = 1, columnspan=3, sticky='N') 

而且

list1.grid(row=1, column=1, sticky='E'+'W')      
list2.grid(row=1, column=2, sticky='E'+'W') 
list3.grid(row=1, column=3, sticky='E'+'W') 

結果看起來是這樣的:

pic3

任何人都可以請解釋我做錯了什麼?

+1

爲了響應您的編輯,您可以將'LabelFrame'的'rowspan'參數更改爲2,以便所有內容都可以重新排列。 – SneakyTurtle

回答

1

您應該只使用一個幾何管理器,即只有grid而不是place以及grid。這也可以確保,當改變箱子的佈局,比如你想要的,什麼都不會重疊。

要「提高」您列表框的頂部,您可以在呼籲他們grid添加sticky=N作爲參數。這看起來像list1.grid(row=0, column=1, sticky=tk.N)

爲了讓您的「Res_values」文本保持在列表框上方,您可以將它作爲第一行添加(並將列表框更改爲第二行),並將其列間距參數設置爲3,在中間(您可能需要在此添加sticky=tk.E+tk.W)。

+0

我不同意只使用一個幾何管理器的說法。粘性部分幾乎是正確的。請記住OP使用'import as tk',所以爲了使粘性正常工作,您需要執行'sticky = tk.N'或我的首選方法,因爲無論您如何導入tkinter'sticky = 「n」'。 –

+0

@SierraMountainTech,如果在這種情況下,OP只是改變了他的列表框的'sticky'屬性,那麼它們將與使用'place'的'Label'重疊。排除這種情況要比僅僅使用「網格」管理器更爲困難。關於導入Tk,你是對的,已更新。 – SneakyTurtle

+0

@SneakyTurtle謝謝你的回答!您能否看到有問題的更新?我有困難。 –