免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2439 | 回复: 1
打印 上一主题 下一主题

帮我解决个问题!谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-06 15:48 |只看该作者 |倒序浏览
代码如下:
from Tkinter import *
from FileDialog import *
from xml.dom import minidom,Node
import xlrd
from pyExcelerator import *

class app(Frame):
    def __init__(self):

        Frame.__init__(self)
        self.pack()
        self.master.title("Conversion System")
        self.master.geometry("500x390")

               
        self.frame1 = Frame(self)
        self.frame1.grid(row = 0,column = 0)
        #self.label1 = Label(self.frame1,text = "Source_Path :")
        #self.label1.grid(row = 0,column = 0)
        self.open1 = Button(self.frame1,text = "Excel_Path :",relief = FLAT,command = self.Openfile1)
        self.open1.grid(row = 0,column = 0)
        
        self.save1 = Button(self.frame1,text = "Xml_Path :",relief = FLAT,command = self.Savefile1)
        self.save1.grid(row = 0,column = 2)
        
        self.entry1 = Entry(self.frame1,name = "entry1")
        self.entry1.grid(row = 0,column = 1)
        
        self.entry2 = Entry(self.frame1,name = "entry2")
        self.entry2.grid(row = 0,column = 3)
        
        self.excel2xml = Button(self.frame1,text = "excel-->xml",command = self.x2e)
        self.excel2xml.grid(row = 0,column = 4)
        
        self.excel2xml.bind("<Enter>", self.rolloverEnter) #鼠标事件:进入
        self.excel2xml.bind("<Leave>", self.rolloverLeave) #鼠标事件:离开
        
        self.prbt = Button(self.frame1,text = "Print")
        self.prbt.grid(row = 0,column = 5)

        #frame2        
        self.frame2 = Frame(self)
        self.frame2.grid(row = 1,column = 0)

        self.info = Label(self.frame2,text = "Here is the generated Xml File :")
        self.info.pack(side = TOP)

        self.text_ = Text(self.frame2)
        self.text_.pack(side = LEFT)
      
        self.scl = Scrollbar(self.frame2)
        self.scl.pack(side = LEFT,fill = Y)

        #frame3        
        self.frame3 = Frame(self)
        self.frame3.grid(row = 2,column = 0)
        #self.label2 = Label(self.frame3,text = "Target_Path :")
        #self.label2.grid(row = 0,column = 0)
        self.open2 = Button(self.frame3,text = "Xml_Path :",relief = FLAT,command = self.Openfile2)
        self.open2.grid(row = 0,column = 0)

        self.entry3 = Entry(self.frame3,name = "entry3")
        self.entry3.grid(row = 0,column = 1)

        self.save2 = Button(self.frame3,text = "Excel_Path :",relief = FLAT,command = self.Savefile2)
        self.save2.grid(row = 0,column = 2)

        self.entry4 = Entry(self.frame3,name = "entry4")
        self.entry4.grid(row = 0,column = 3)

        self.xml2excel = Button(self.frame3,text = "xml-->excel",command = self.x2e)
        self.xml2excel.grid(row = 0,column = 4)

        self.xml2excel.bind("<Enter>", self.rolloverEnter) #鼠标事件:进入
        self.xml2excel.bind("<Leave>", self.rolloverLeave) #鼠标事件:离开


        
    def rolloverEnter(self,event):
        event.widget.config(relief=GROOVE)
        
    def rolloverLeave(self,event):
        event.widget.config(relief=RAISED)
        
    def Openfile1(self):
        fd = LoadFileDialog(self.master)
        source_path = fd.go()
        print source_path
        self.entry1.insert(0,source_path)

    def Savefile1(self):
        fd = SaveFileDialog(self.master)
        target_path = fd.go()
        self.entry2.insert(0,target_path)
    def Openfile2(self):
        fd = LoadFileDialog(self.master)
        source_path = fd.go()
        print source_path
        self.entry3.insert(0,source_path)

    def Savefile2(self):
        fd = SaveFileDialog(self.master)
        target_path = fd.go()
        self.entry4.insert(0,target_path)
   
   
        
    def xml2excel(self,source,target):
        #都是全名,包括xml,xls后缀
        xmldoc = minidom.parse(source)
        root = xmldoc.documentElement
        # here root is 'book'--->test.xml
        
        #使用pyExcelerator模块
        w = Workbook()#生成工作簿
        ws = w.add_sheet('sheet1')#加入一个工作表
   
        #父标签和子标签之间有空格或回车
        #空格和回车会被认为是父标签的一个子节点
        node = root.childNodes[1]
        # here node is 'title'--->test.xml

        #所以,在xml的源代码中 应该看父子间有无空格
        #正常人书写xml文件应该有空格或换行
   
        #这里仅仅得到了子标签的名字,excel中第一排问题解决
        j = 0
        if node.nodeType == node.ELEMENT_NODE:
            for node in node.childNodes:
                if node.nodeType == Node.ELEMENT_NODE:
                    ws.write(0,j,node.nodeName)
                    j+= 1

               
        #输出xml文档中的所有内容信息
        row = 0
        col = 0
        # root is 'book'
        for node in root.childNodes:
            #因为空格也算子节点,所以需要加条限制语句
            if node.nodeType==node.ELEMENT_NODE:#这条判断语句是后来调试加上去的,因为空格也算子节点
                col = 0
                row+= 1  
            for x in node.childNodes:
                if x.nodeType == x.TEXT_NODE:
                    continue
                else:
                    ws.write(row,col,x.firstChild.data)
                    col+=1
                   #print row
            #保存
            w.save(target)
    def x2e(self):
        self.xml2excel(self.Openfile1,self.Savefile1)

    def excel2xml(self,source_path,target_path):
        book = xlrd.open_workbook(source_path)
        sh = book.sheet_by_index(0)
        #保存工作表的行列的数量
        r,c = sh.nrows,sh.ncols
        #写xml
        #create the minidom document
        doc = minidom.Document()
        
        # Create the  base element
        root = doc.createElement('root')
        doc.appendChild(root)
        # Create the main  element
        #注意:标签不能有空格或特殊字符 比如'#' 否则浏览器不能解析xml
        #默认标题都是英文,中文处理还存在问题

        CODEC = 'utf-8'
        for i in range(1,r):
            #create the first title
            firsttitle = doc.createElement('god')
            root.appendChild(firsttitle)
            for j in range(c):
                ww = doc.createElement(sh.cell_value(0,j))
                firsttitle.appendChild(ww)
                ww.appendChild(doc.createTextNode('%s' % sh.cell_value(i,j)))
            
        str = doc.toprettyxml()
        #print str
        unicodeStr = str.encode(CODEC)
        self.text.insert(1.0,unicodeStr)
        xmlfile = open(target_path,'w')
        xmlfile.write(unicodeStr)
        xmlfile.close()
    def e2x(self):
        self.excel2xml(self.Openfile2,self.Savefile2)


def main():
     app().mainloop()
if __name__=="__main__":
    main()

作用是点击按钮xml-->excel或者按钮excel-->xml时,出现错误提示为:AttributeError: Button instance has no __call__ method
,不知道如何解决?谁能花点时间99我,谢谢了大虾们。。。。。

论坛徽章:
0
2 [报告]
发表于 2009-05-06 15:50 |只看该作者
声明:本人是初学者
用的是Tkinter,为了实现xml文件和excel文件互相转换的前台界面,就是行不通,谁有好的意见或者建议都给我说说,谢谢了
万分·!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP