簡體   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