2016-03-10 64 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 *