繁体   English   中英

如何摆脱 ttk 打印表格中的 ]、[ 和 ' 符号

[英]How can I get rid of the ], [ and ' signs in a printed table in ttk

这个问题与: 如何使用Tkinter模仿这个表? .

我已经尝试了第一个例子,但我在打印的表格中得到了数组的边框[ , ]和字符串的'符号。 我怎样才能摆脱它们?

下面是源代码,基于前面的例子:

# -*- 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()

你的 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,:]))                     

所以得到这个结果是正常的,因为 table2 只是一个字符串表:

>>> 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 regex re模块:

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

因此,您可以table2[i,:]一个对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()

演示:

上面的程序输出了你正在寻找的这个演示:

在此处输入图片说明

笔记:

我使用 Python 2.7 对此进行了编码,因此如果您想改用 Python 3.x,那么您只需调整两个导入:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM