wxpython 表格控件

# -*- coding: utf-8 -*-

import wx
import wx.xrc
import wx.grid
import pandas as pd
from docx import Document

class MyFrame1 ( wx.Frame ):

	def __init__( self, parent ):
		wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"费用系统", pos = wx.DefaultPosition, size = wx.Size( 665,806 ), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL )

		self.SetSizeHints( wx.DefaultSize, wx.DefaultSize )

		self.m_toolBar1 = self.CreateToolBar( wx.TB_HORIZONTAL, wx.ID_ANY )
		self.m_button1 = wx.Button( self.m_toolBar1, wx.ID_ANY, u"添加费用项", wx.DefaultPosition, wx.DefaultSize, 0 )
		self.m_toolBar1.AddControl( self.m_button1 )
		self.m_button2 = wx.Button(self.m_toolBar1, wx.ID_ANY, u"删除费用项", wx.DefaultPosition, wx.DefaultSize, 0)
		self.m_toolBar1.AddControl(self.m_button2)
		self.m_button3 = wx.Button(self.m_toolBar1, wx.ID_ANY, u"保存", wx.DefaultPosition, wx.DefaultSize, 0)
		self.m_toolBar1.AddControl(self.m_button3)
		m_comboBox3Choices = [row for row in list(self.datas()['费用项']) if type(row) != float]
		self.m_comboBox3 = wx.ComboBox(self.m_toolBar1, wx.ID_ANY, u"选择费用项", wx.DefaultPosition, wx.DefaultSize,
									   m_comboBox3Choices, 0)
		self.m_toolBar1.AddControl(self.m_comboBox3)
		m_choice1Choices = ["USD","CNY"]
		self.m_choice1 = wx.Choice(self.m_toolBar1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, m_choice1Choices, 0)
		self.m_choice1.SetSelection(0)
		self.m_toolBar1.AddControl(self.m_choice1)
		self.m_toolBar1.Realize()

		bSizer2 = wx.BoxSizer( wx.VERTICAL )

		self.m_grid2 = wx.grid.Grid( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, 0 )

		# Grid
		self.m_grid2.CreateGrid( 0, 5 )
		self.m_grid2.EnableEditing( True )
		self.m_grid2.EnableGridLines( True )
		self.m_grid2.EnableDragGridSize( False )
		self.m_grid2.SetMargins( 80, 806 )
		cols = ["费用项\n(Item)","单价\n(Unit Price)","数量\n(QTY)","币种\n(Currency)","金额\n(Amount)"]
		for i in range(5):
			self.m_grid2.SetColLabelValue(i,cols[i])
		# Columns
		self.m_grid2.SetColSize(0,300)
		self.m_grid2.SetLabelBackgroundColour("GOLDENROD")
		self.m_grid2.EnableDragColMove( False )
		self.m_grid2.EnableDragColSize( True )
		self.m_grid2.SetColLabelAlignment( wx.ALIGN_CENTER, wx.ALIGN_CENTER )
		self.m_grid2.SetColLabelSize(50)

		# Rows
		self.m_grid2.EnableDragRowSize( True )
		self.m_grid2.SetRowLabelAlignment( wx.ALIGN_CENTER, wx.ALIGN_CENTER )
		self.m_grid2.SetRowLabelSize(0)

		# Label Appearance
		# Cell Defaults
		self.m_grid2.SetDefaultCellAlignment( wx.ALIGN_LEFT, wx.ALIGN_TOP )
		bSizer2.Add( self.m_grid2, 0, wx.ALL, 5 )

		attr = wx.grid.GridCellAttr()
		attr.SetReadOnly(True)
		self.m_grid2.SetColAttr(0,attr)
		self.m_grid2.SetColAttr(3, attr)
		self.m_grid2.SetColAttr(4, attr)

		self.SetSizer( bSizer2 )
		self.Layout()

		self.Centre( wx.BOTH )

		# Connect Events
		self.m_button1.Bind( wx.EVT_BUTTON, self.add )
		self.m_button2.Bind(wx.EVT_BUTTON, self.delete)
		self.m_button3.Bind(wx.EVT_BUTTON, self.save)
		self.Bind(wx.grid.EVT_GRID_CELL_CHANGED, self.cellChanged)
		#self.m_grid2.SetCellValue()

	def __del__( self ):
		pass
	def datas(self):
		dt = pd.read_csv("Z:\\工作\\Database\\charges.csv")
		# print(reader)
		return dt
	def cellChanged(self, event):
		pos = self.m_grid2.GetGridCursorCoords()[0]
		# print(pos)
		total_amount = int(self.m_grid2.GetCellValue(pos,1))*int(self.m_grid2.GetCellValue(pos,2))
		self.m_grid2.SetCellValue(pos,4,str(total_amount))

	# Virtual event handlers, override them in your derived class
	def add( self, event ):
		self.m_grid2.AppendRows(1)
		aa = self.m_grid2.GetNumberRows()
		self.m_grid2.SetCellValue(aa-1,0,self.m_comboBox3.Value)
		self.m_grid2.SetCellValue(aa-1,3, self.m_choice1.GetStringSelection())


	def delete(self,event):
		#GetGridCursorCoords()
		pos = self.m_grid2.GetGridCursorCoords()[0]
		#print(pos)
		self.m_grid2.DeleteRows(pos,1)

	def save(self,evt):

		rows = self.m_grid2.GetNumberRows()
		cols = self.m_grid2.GetNumberCols()
		self.m_grid2.AppendRows(3)  # 添加2行
		data = []
		USD = []
		CNY = []
		for row in range(rows):
			data.append([self.m_grid2.GetCellValue(row,col) for col in range(cols)])
			if self.m_grid2.GetCellValue(row,3) == "USD":
				USD.append(self.m_grid2.GetCellValue(row,4))
			elif self.m_grid2.GetCellValue(row,3) == "CNY":
				CNY.append(self.m_grid2.GetCellValue(row,4))

		print(USD,CNY)
		# 汇总,保存
		t_USD = 0
		t_CNY =0
		for u in range(len(USD)):
			t_USD = t_USD + int(USD[u])
		for u in range(len(CNY)):
			t_CNY = t_CNY + int(CNY[u])
		data.append(["", "", "", "", ""])
		data.append(["","","Total:","USD",str(t_USD)])
		data.append(["", "", "Total:", "CNY", str(t_CNY)])
		self.m_grid2.SetCellValue(rows+1 , 2, "Total:")
		self.m_grid2.SetCellValue(rows+1 , 3, "USD:")
		self.m_grid2.SetCellValue(rows +1, 4, str(t_USD))
		self.m_grid2.SetCellValue(rows + 2, 3, "CNY:")
		self.m_grid2.SetCellValue(rows + 2, 4, str(t_CNY))

		print(tuple(data))
		# save to the word
		doc = Document(r'Z:\工作\Database\费用模版.docx')

		tables = doc.tables

		bl_table = tables[0]
		charge_table = tables[1]

		print(len(charge_table.rows))
		# charges = [["OCEAN FREIGHT", "18000", "2", "USD"], ["Local charge", "3212", "2", "CNY"]]
		charges = data
		for c in range(len(charges)-1):
			charge_table.add_row()
		print(len(charge_table.rows))
		for i, row in enumerate(charge_table.rows):
			if i > 0:
				for j in range(5):
					row.cells[j].text = charges[i - 1][j]

		doc.save(r'Z:\工作\Database\费用模版1.docx')





if __name__ == "__main__":
    app = wx.App()
    main = MyFrame1(None)
    main.Show()
    app.MainLoop()

上一篇:append vs appendChild 的差别


下一篇:python实现货币转换