`
qiaoqinqie
  • 浏览: 60053 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

用wxpython写了个简单的文件转码工具

阅读更多

最近换的电脑是英文的系统,以前的一些资料都是中文gbk编码。导致一直乱码,系统没有管理员权限也不能修改编码

想想很久没用wxpythonl。就写了这样的一个小工具

 

#! /usr/bin/python
# -*- coding:utf-8 -*-
'''
Created on Jun 9, 2011

@author: eruan
'''

import wx
import sys
import os
import codecs
import shutil



_support_encoding = ['GBK', 'GB2312', 'UTF-8', 'Shift-JIS']

_system_encoding = sys.stdin.encoding

_support_wildcard = "txt(*.txt)|*.txt|sql(*.sql)|*.sql|cue(*.cue)|*.cue|All files (*.*)|*.*"


class MainFrame(wx.Frame):
    
    def __init__(self, parent, id, title, pos, size, style):
        
        wx.Frame.__init__(self, parent, id, title, pos=pos, size=size, style=style)
        
        self.DoLayout()
        self.file_list = set()
        self.file_success_list = set()


        # Event Bound
        self.choose_path.Bind(wx.EVT_BUTTON, self.OnChoosePath)
        self.begin_convert.Bind(wx.EVT_BUTTON, self.OnBeginConvert)
        self.deleteBackup.Bind(wx.EVT_BUTTON, self.OnDeleteBackup)
        
        
    def DoLayout(self):
        self.panel_up = wx.Panel(self)
        self.panel_down = wx.Panel(self)
        self.panel_up.SetBackgroundColour('#8f5049')
        
        
        grid = wx.GridBagSizer(vgap=10, hgap=10)
        
        
        self.choose_path = wx.Button(self.panel_up, label=u"选择文件", size=(200, 50))
        grid.Add(self.choose_path, (1, 1))
        
        
        self.is_backup = wx.CheckBox(self.panel_up, label=u'备份', size=(150, 50), style=wx.SHAPED)
        grid.Add(self.is_backup, (1, 2))
        
        source_encoding_text = wx.StaticText(self.panel_up, label=u'源文件编码:')
        self.source_encoding = wx.Choice(self.panel_up, choices=_support_encoding, size=(100, 30))
        source_encoding_vbox = wx.BoxSizer()
        source_encoding_vbox.Add(source_encoding_text, 1)
        source_encoding_vbox.Add(self.source_encoding, 1)
        grid.Add(source_encoding_vbox, (2, 1))
        
        dest_encoding_text = wx.StaticText(self.panel_up, label=u'目标文件编码:')
        self.dest_encoding = wx.Choice(self.panel_up, choices=_support_encoding, size=(100, 30))
        self.dest_encoding.SetStringSelection(_system_encoding)
        dest_encoding_vbox = wx.BoxSizer()
        dest_encoding_vbox.Add(dest_encoding_text, 1)
        dest_encoding_vbox.Add(self.dest_encoding, 1)
        grid.Add(dest_encoding_vbox, (2, 2))
        

        
        self.begin_convert = wx.Button(self.panel_up, label=u'开始转换', size=(200, 50))
        self.deleteBackup = wx.Button(self.panel_up, label=u'删除备份文件', size=(200, 50))
        self.deleteBackup.Disable()

        grid.Add(self.begin_convert, (3, 1))
        grid.Add(self.deleteBackup, (3, 2))
        self.panel_up.SetSizer(grid)
        
        
        self.file_list_info = wx.TextCtrl(self.panel_down, -1, '', size=(490, 200), style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_LEFT)
        self.convert_info = wx.TextCtrl(self.panel_down, -1, '', size=(490, 250), style=wx.TE_MULTILINE | wx.TE_READONLY | wx.TE_LEFT)
        self.convert_info.SetBackgroundColour('#4f5049')
        vbox_info = wx.BoxSizer(wx.VERTICAL)
        vbox_info.Add(self.file_list_info, 1, wx.EXPAND)
        vbox_info.Add(self.convert_info, 1, wx.EXPAND)
        self.panel_down.SetSizer(vbox_info)
        
        

        
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.Add(self.panel_up, 1, wx.EXPAND)
        vbox.Add(self.panel_down, 2, wx.EXPAND)
        
        
        self.SetSizer(vbox)
        
        
    def OnChoosePath(self, event):
        fileDialog = wx.FileDialog (self, u'选择文件夹', wildcard=_support_wildcard, style=wx.FD_OPEN | wx.FD_MULTIPLE)
        if fileDialog.ShowModal() == wx.ID_OK:
            self.file_list.clear()
            self.file_list_info.Clear()
            files = fileDialog.GetPaths()
            for file in files:
                self.file_list.add(file)
                self.file_list_info.AppendText(file + '\n')
            
                
    def OnBeginConvert(self, event):
        if not self.file_list:
            wx.MessageBox(u'请选择符合条件的文件',
                                  u'选择文件夹', style=wx.OK | wx.ICON_EXCLAMATION)
            self.OnChoosePath(event)
        elif self.source_encoding.GetSelection() == wx.NOT_FOUND:
            wx.MessageBox(u'请选择源文件编码',
                                  u'选择源文件编码', style=wx.OK | wx.ICON_EXCLAMATION)
            self.source_encoding.SetFocus()
        elif self.source_encoding.GetSelection() == wx.NOT_FOUND:
            wx.MessageBox(u'请选择目标文件编码',
                                  u'选择目标文件编码', style=wx.OK | wx.ICON_EXCLAMATION)
            self.source_encoding.SetFocus()
        else:
            source_encode = _support_encoding[self.source_encoding.GetSelection()].decode(_system_encoding)
            dest_encode = _support_encoding[self.dest_encoding.GetSelection()].decode(_system_encoding)
            self.convert_info.Clear()
            for file_name in self.file_list:
                try:
                    with codecs.open(file_name, 'r', source_encode) as source_file:
                        context = source_file.read()
                except UnicodeDecodeError , e:
                    self.convert_info.AppendText('文件 %s 转换失败!请尝试其他编码' % file_name + '\n')
                else:
                    #back up file
                    if self.is_backup.IsChecked():
                        shutil.copy(file_name, file_name + '.bak')
                    dest_file = open(file_name, 'w')
                    dest_file.write(context.decode(dest_encode))
                    dest_file.close()
                    self.convert_info.AppendText('文件 %s 转换成功!' % file_name + '\n')
                    self.file_success_list.add(file_name)
            if self.file_success_list and self.is_backup.IsChecked():
                self.deleteBackup.Enable() 
                    
                    
    def OnDeleteBackup(self, event):
            self.convert_info.Clear()
            for file_name in self.file_success_list:
                backup_file_name = file_name + '.bak'
                os.remove(backup_file_name)
                self.convert_info.AppendText('删除 %s 成功 \n' % backup_file_name)
            wx.MessageBox(u'删除备份文件成功',
                              u'信息', style=wx.OK | wx.ICON_EXCLAMATION)
            self.deleteBackup.Disable()
            self.file_success_list.clear()
            
            
class MainApp(wx.App):
    
    def OnInit(self):
        screen_x = (wx.DisplaySize()[0] - 500) / 2
        screen_y = (wx.DisplaySize()[1] - 600) / 2
        self.frame = MainFrame(None, -1, u'文件转换器', (screen_x, screen_y), (500, 600), wx.DEFAULT_FRAME_STYLE ^ wx.MAXIMIZE_BOX)
        font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
        self.frame.SetFont(font)
        self.frame.Show()
        return True
        
  

if __name__ == '__main__':
    app = MainApp(False)
    app.MainLoop()
    




    


 

 截图

 

 

现在只支持文件夹和符合条件的文件的检查,遍历方式 在只选根目录的情况下,性能很差,有卡住的情形,明天好好的看下,在加入文件选择的方式

 

 

 

 

 

分享到:
评论

相关推荐

    wxPython写的类似qq截图的小程序

    在标题中提到的“wxPython写的类似qq截图的小程序”指的是一个使用wxPython库开发的应用程序,它具有与腾讯QQ的截图功能相似的特性。wxPython是Python编程语言的一个GUI工具包,它基于C++的wxWidgets库,允许开发者...

    用wxpython写的一个聊天室程序,有客服端和服务器端

    【标题】中的“用wxpython写的一个聊天室程序”指的是使用wxPython库开发的一款聊天应用程序。wxPython是Python编程语言中一个流行的GUI(图形用户界面)工具包,它基于C++的wxWidgets库,提供了丰富的控件和组件,...

    wxPython in Action 活学活用wxPython

    《wxPython in Action 活学活用wxPython》是一本深入浅出的教程,旨在帮助读者掌握使用wxPython这一强大的GUI(图形用户界面)工具包进行Python编程的方法。wxPython是Python编程语言中用于创建桌面应用的一个流行库...

    wxPython写的拼图小游戏

    `wxPython`是一款流行的Python GUI工具包,它允许开发者使用Python语言构建原生、高性能的图形用户界面。基于`wxWidgets`库,`wxPython`为开发者提供了丰富的控件和组件,使得创建复杂的桌面应用程序变得简单易行。...

    python UI可视化设计工具(WxPython可视化编辑器)

    WxPython 是一个流行的 Python 库,它提供了原生的跨平台 GUI 工具包,使得开发者可以使用 Python 来创建具有美观外观的应用程序,而无需深入学习底层图形界面编程。 WxPython 可视化编辑器,如其名所示,允许用户...

    wxpython写的web摄像头

    自己用wxpython写的web摄像头界面,能显示与其相对应分辨率的rgb565格式的图像。

    wxPython图片水印制作工具

    这个“wxPython图片水印制作工具”利用了`wxPython`库,帮助用户快速且方便地为他们的图片添加自定义水印。 【核心知识点】 1. **wxPython库**:`wxPython`是Python中的一个跨平台GUI库,它实现了WXWidgets的接口...

    wxPython多个窗口的基本结构

    wxPython是一个Python库,它为开发者提供了在Python程序中使用图形用户界面(GUI)的功能。wxPython是基于wxWidgets C++库的Python封装,它允许开发者快速地创建跨平台的GUI应用程序。本文主要介绍了wxPython中如何...

    wxPython4.1文件下载Win64 For Python2.7/Python3.7/Python3.8

    wxPython是一款强大的GUI(图形用户界面)工具包,它将Python编程语言与wxWidgets库相结合,为开发者提供了一个在多种操作系统上构建桌面应用程序的平台。wxWidgets是用C++编写的,而wxPython则是它的Python绑定,...

    将前面写的决策树模型,用wxPython写一个可视化的界面.zip

    标题中的“将前面写的决策树模型,用wxPython写一个可视化的界面”表明这是一个关于将已有的决策树算法实现为图形用户界面(GUI)的应用项目,主要使用的编程语言是Python,并且利用了wxPython库来构建GUI。在这个...

    wxPython写的一个拼图游戏

    wxPython是Python编程语言中一个流行的图形用户界面(GUI)工具包,它提供了丰富的控件和组件,让开发者能够构建出美观且功能强大的桌面应用。wxPython是基于C++的wxWidgets库的Python绑定,因此,它允许Python开发者...

    wxPython-入门教程.pdf

    这段代码展示了如何使用wxPython构建一个简单的文本编辑器界面,它包含一个可以输入和查看文本的窗口。通过这样的基础示例,你可以开始理解如何利用wxPython构建更复杂的GUI应用。 总的来说,wxPython为Python...

    wxPython实战 高清 目录版本

    wxPython是Python编程语言中一个强大的工具,它允许开发者利用wxWidgets库的跨平台特性,用Python编写出与操作系统原生风格一致的应用程序。 在《wxPython实战 高清 目录版本》中,你可以期待学习到以下关键知识点...

    wxPython-demo-4.0.6_wxpython官方demo_wxPython-demo_wxpython_DEMO_w

    这个压缩包文件"wxPython-demo-4.0.6_wxpython官方demo_wxPython-demo_wxpython_DEMO_w"包含了wxPython的官方演示程序,是学习和探索wxPython功能的理想资源。 【wxPython Demo】是wxPython库附带的一系列示例和...

    wxPython2.8 安装文件 示例文档

    wxPython2.8.rar 包含有2个文件的压缩包,一个是安装文件,一个是示例和文档

    wxPython2.8-win64-unicode-2.8.12.1-py27安装文件

    wxPython是Python编程语言的一个GUI(图形用户界面)工具包,它允许开发者使用Python编写具有原生外观和感觉的应用程序。wxPython是基于C++的wxWidgets库构建的,提供了丰富的控件集和强大的功能,使得Python程序员...

    活学活用wxPython

    《活学活用wxPython》这本书旨在帮助读者全面掌握wxPython的使用方法,无论是新手还是有一定经验的开发者都能从中受益。书中的章节按功能组织,便于读者快速定位所需内容。 - **第一章:欢迎使用wxPython** - 介绍...

    wxpython3.9_py2.7

    1. **wxpython** - 这是主要的焦点,是一个用Python编写的GUI工具包,基于C++的wxWidgets库。 2. **gui** - 表明讨论的是图形用户界面,这是软件中用户与之交互的部分。 3. **python** - 提示我们这是关于Python编程...

    wxpython for py2.6

    wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。 和...

    wxpython教程

    2. **Chapter-18**: 可能讲解了对话框(Dialogs)的使用,包括消息对话框(MessageDialog)、文件选择对话框(FileDialog)等,这些都是与用户进行交互的重要元素。 3. **Chapter-16**: 可能涉及布局管理(Layout ...

Global site tag (gtag.js) - Google Analytics