2016-03-10 62 views
2

打印表中的符號此問題與:How to imitate this table using Tkinter?我該如何擺脫],[和'在ttk

我試過了第一個例子,但是我在打印的表格中獲得了數組的邊界[]和字符串的'標記。我怎樣才能擺脫它們?

下面是源代碼,基於前面的示例:

# -*- coding: utf-8 -*- 
""" 
Created on Thu Mar 10 14:26:37 2016 

@author: peterk 
""" 

from tkinter import * 
from tkinter.ttk import * 
import numpy as np 
class App(Frame): 



    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.CreateUI() 
     self.LoadTable() 
     self.grid(sticky = (N,S,W,E)) 
     parent.grid_rowconfigure(0, weight = 1) 
     parent.grid_columnconfigure(0, weight = 1) 

    def CreateUI(self): 
     tv = Treeview(self) 
     tv['columns'] = ('Parameter A', 'Parameter m', 'Parameter n') 
     tv.heading("#0", text='Based on fit', anchor='w') 
     tv.column("#0", anchor="w") 
     tv.heading('Parameter A', text='Parameter A') 
     tv.column('Parameter A', anchor='center', width=100) 
     tv.heading('Parameter m', text='Parameter m') 
     tv.column('Parameter m', anchor='center', width=100) 
     tv.heading('Parameter n', text='Parameter n') 
     tv.column('Parameter n', anchor='center', width=100) 
     tv.grid(sticky = (N,S,W,E)) 
     self.treeview = tv 
     self.grid_rowconfigure(0, weight = 1) 
     self.grid_columnconfigure(0, weight = 1) 

    def LoadTable(self): 
     table1=np.reshape(np.array([10.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.]), (6,3)) 
#  self.treeview.insert('', 'end', text="First", values=('10:00', 
#       '10:10', 'Ok')) 

     table2 = numpy.array(["%.8e" % w for w in table1.reshape(table1.size)]) 
     table2 = table2.reshape(table1.shape) 
     print(table2) 

     for i in range(6): 
      self.treeview.insert('', 'end', text="based_on_line_"+str(i), values=(table2[i,:]))      

def main(): 
    root = Tk() 
    App(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

回答

1

你numpy的陣列table2爲字符串類型:

>>> import numpy as np 
>>> table1=np.reshape(np.array([10.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.]), (6,3)) 
>>> table2 = np.array(["%.8e" % w for w in table1.reshape(table1.size)]) 
>>> table2.dtype 
dtype('S14') 
>>> 

而在你LoadTable()方法,要插入字符串:

self.treeview.insert('', 'end', text="based_on_line_"+str(i), values=(table2[i,:]))      

所以有這樣的結果是正常的表2是一個字符串僅僅表:

>>> table2 
array(['1.00000000e+01', '2.00000000e+00', '3.00000000e+00', 
     '4.00000000e+00', '5.00000000e+00', '6.00000000e+00', 
     '7.00000000e+00', '8.00000000e+00', '9.00000000e+00', 
     '1.00000000e+01', '1.10000000e+01', '1.20000000e+01', 
     '1.30000000e+01', '1.40000000e+01', '1.50000000e+01', 
     '1.60000000e+01', '1.70000000e+01', '1.80000000e+01'], 
     dtype='|S14') 
>>> 

等都可能是該解決方案將包括在numpy的陣列table2轉換字符串到浮點數numpy的數組:

>>> table3 = table2.astype(np.float) 

然而,這是沒有結果的你預計:

>>> table3 
array([ 10., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 
     12., 13., 14., 15., 16., 17., 18.]) 
>>> 

第一種方法:

那麼可能是你剩下的唯一的解決辦法是使用Python正則表達式re模塊的:

>>> import re 
>>> begueradj = "['1.00000000e+01']" 
>>> print begueradj 
['1.00000000e+01'] 
>>> begueradj = re.sub("[\['\]]","",begueradj) 
>>> print begueradj 
1.00000000e+01 
>>> 

因此,可以可以編程上的table2[i,:]每個值循環的方法如圖所示在上面的例子以除去遠的那些不希望的字符。

第二種方法:

然而,爲什麼用正則表達式方法,通過一個小的修改,以您的LoadTable()方法添加更多的代碼,而你可以解決你的問題,在一個不太複雜的方式?

# -*- coding: utf-8 -*- 
""" 
Created on Thu Mar 16 13:07:36 2016 

@author: Bill BEGUERADJ 
"""  
from Tkinter import * 
from ttk import * 
import numpy as np 


class App(Frame):  
    def __init__(self, parent): 
     Frame.__init__(self, parent) 
     self.CreateUI() 
     self.LoadTable() 
     self.grid(sticky = (N,S,W,E)) 
     parent.title("Bill Begueradj Python ttk.Treeview Demo Solution") 
     parent.grid_rowconfigure(0, weight = 1) 
     parent.grid_columnconfigure(0, weight = 1) 

    def CreateUI(self): 
     tv = Treeview(self) 
     tv['columns'] = ('Parameter A', 'Parameter m', 'Parameter n') 
     tv.heading("#0", text='Based on fit', anchor='c') 
     tv.column("#0", anchor="c") 
     tv.heading('Parameter A', text='Parameter A') 
     tv.column('Parameter A', anchor='center', width=100) 
     tv.heading('Parameter m', text='Parameter m') 
     tv.column('Parameter m', anchor='center', width=100) 
     tv.heading('Parameter n', text='Parameter n') 
     tv.column('Parameter n', anchor='center', width=100) 
     tv.grid(sticky = (N,S,W,E)) 
     self.treeview = tv 
     self.grid_rowconfigure(0, weight = 1) 
     self.grid_columnconfigure(0, weight = 1) 

    def LoadTable(self): 
     table1=np.reshape(np.array([10.,2.,3.,4.,5.,6.,7.,8.,9.,10.,11.,12.,13.,14.,15.,16.,17.,18.]), (6,3)) 
     table2 = np.array(["%.8e" % w for w in table1.reshape(table1.size)]) 
     table2 = table2.reshape(table1.shape) 


     for i in range(6): 
      self.treeview.insert('', 'end', text="based_on_line_"+str(i), values=(table2[i,0], table2[i,1],table2[i,2])) 
      # print table2[i,:] 


def main(): 
    root = Tk() 
    App(root) 
    root.mainloop() 

if __name__ == '__main__': 
    main() 

演示:

上述程序輸出這個演示,你在找什麼:

enter image description here

注:

我編寫這個使用Python 2.7,所以如果你想使用Python 3。X代替,那麼你只有兩個進口進行調整:

  • from tkinter import *而不是from Tkinter import *
  • from tkinter.ttk import *而不是from ttk import *