1. 程式人生 > >用wxpython寫了個簡單的檔案轉碼工具

用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簡單檔案工具

最近換的電腦是英文的系統,以前的一些資料都是中文gbk編碼。導致一直亂碼,系統沒有管理員許可權也不能修改編碼 想想很久沒用wxpythonl。就寫了這樣的一個小工具 #! /usr/bin/python # -*- coding:utf-8 -*- ''' Created

Python 簡單的股票量化交易框架

因為行情的獲取用到了 `async / await` 所以暫時只支援 `Python3.5`交易支援 佣金寶 和 華泰 兩家券商的自動登入和買賣。行情使用的是新浪的免費行情,大概一秒鐘推送一次 所有的 3000 多隻股票的實時資料。也可以自己引入 tushare 這個免費的財經資訊獲取包 或者 引入 wind

2天的Python,自己簡單的爬蟲,可是爬蟲有什麼呢?

# -*- coding: UTF-8 -*- import requests import pandas import re import json from bs4 import BeautifulSoup import openpyxl def par

vue移動端車牌輸入鍵盤

mar ace max UNC btn 代碼 this 大神 nsf 話不多說,先看圖 初學vue,斷斷續續花了一天半才寫出來.... 寫樣式真的很麻煩 下面上代碼 html 1 <template> 2 <section class=

C#鍵盤記錄器

為了把自己充實起來,閒來沒事,寫了個鍵盤記錄器,主要功能如下:   1.獲取使用者的按鍵資訊,將記錄的資訊以文字的形式儲存起來; 2.讀取檔案內容,已郵件方式傳送到指定郵箱; 3.實現了定時傳送; 4.為了能夠隨系統啟動,所以把程式寫到了服務裡。  

Python色情文章檢測器!投放各大自媒體!就年薪百萬

  但是,有些作者發表的文章充斥著色情與暴力,一旦被青少年看到,會產生難以想象的後果。我們需要對網路上的文章進行檢測,以標記出其是否為色情文章,如果是,那麼我們就要將其過濾不予顯示。而人工檢測在資訊爆炸的今天幾乎不可能實現。所以,我們提出了基於神經網路的色情文章檢測。 具體的

Hibernate4BaseDao實現請多多指教

import java.io.Serializable; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.hibernate.Hiberna

JAVA一個簡單的JS程式碼格式化工具

/** * cn.newweapon.JsFormatter */package cn.newweapon;import java.io.File;import java.io.FileReader;import java.io.FileWriter;import java.io.FilenameFilter

受夠移動端的數字輸入,我vue模擬鍵盤

前言 在H5開發過程中,涉及到使用者輸入的表單時,有一個非常常見的場景:輸入數字,在此基礎上往往還會涉及到限定數字範圍等一系列邏輯處理。 這些限定倒還好說,我受不了的是裝置鍵盤,目前常見的處理方式是用type="tel"直接喚起手機號碼的鍵盤,如果想要輸入負號,就只能

閒來無事,將自己收集到的工具類封裝下,做一個lib,簡單的mvp,初學者可以看看

最近公司事務較少,自己將收集到的一些工具類,封裝了下,整理出一個lib 由於最近mvp模式盛行,寫了個簡單MVP的demo,提供大家學習 github地址:https://github.com/zhangxiang0316/MVPDEMO

pygame俄羅斯方塊

最近在學習pygame,就寫了個俄羅斯方塊玩玩,完成了基本的功能,後續在加入 需要安裝pygame,ubuntu使用者 sudo apt-get install python-pygame 程式碼入下 #-* coding:UTF-8 -* #!/usr/bin/env

Vue部落格園WebApp

使用了Node和Vue寫了個部落格園的移動端WebApp,想拿出來與大家分享下,也談談我遇到的坑。由於時間問題,目前還剩“快閃記憶體”,“博問”這兩塊還沒做完。先分享下截圖吧。 我呢,就從技術,部署,以及遇到的坑來講吧,當然啦,首

Python檢測文章抄襲,詳談去重演算法原理

在網際網路出現之前,“抄”很不方便,一是“源”少,而是釋出渠道少;而在網際網路出現之後,“抄”變得很簡單,鋪天蓋地的“源”源源不斷

曹工說mini-dubbo(1)--為了實踐動態代理,我簡單的rpc框架

#相關背景及資源: 之前本來一直在寫spring原始碼解析這塊,如下,aop部分剛好寫完。以前零散看過一些文章,知道rpc呼叫基本就是使用動態代理,比如rmi,dubbo,feign呼叫等。自己也就想著試一下,於是有了mini-dubbo這個東西,暫時也不能稱為一個框架,因為還不是生產級的,目前只是實現了一

「懶惰的美德」我 python 自動生成給文件生成索引的指令碼

我用 python 寫了一個自動生成索引的指令碼 簡介:為了刷演算法題,建了一個 GitHub倉庫:PiperLiu / ACMOI_Journey,記錄自己的刷題軌跡,並總結一下方法、心得。想到一個需求:能不能在我每新增一條題目的筆記後,利用程式自動地將其歸類、建立索引?用 Python 實現一個入門級的

WPF一個QQ空間相簿下載工具

我僅僅是添加了一部分下載相簿的程式碼。連made by darren都沒改動。 右邊是展示下載到的QQ相簿裡的圖片。是一個WPF的圖片瀏覽器改過的。 兩個exe通過發訊息實現程序通訊。左邊下了一張圖就給右邊的圖片瀏覽器發訊息,然後展示在介面上。 今天總算是完成了主要的

native2ascii檔案工具

問題:Source insight中文亂碼 這是由於Source insight預設是ANSI碼,將檔案通過native2ascii轉為UTF-8碼即可。指令碼內容如下: @echo off set DIR=xxx for /R %DIR% %%i in

python簡單購物車

暫時只懂識別輸入的是否為整數,但是浮點數就沒辦法了網上看了一下可以用正則來識別,暫時還沒學到,先放著了,這個比較簡單,主要是列表元素的刪除用了幾種方法,發現del比較理想''' 購物車小程式 要求: 1.可以輸入客戶的餘額 2.列出可選物品清單,包含價格 3.可以新增到購物車

一個簡單的Linux Shell來下載文件

logs -- spi http col 內容 style bre shell #!/bin/sh for (( i=0; i<30; i=i+1 )); do # 利用spider來探測請求的資源是否存在,並把請求的結果寫入到一個文件 wget -

簡單artTemplate的例子

ets lpar icheck security 支持 新版 render sts 手機號換綁 寫幾個簡單的artTemplate的例子,很多框架都有自己的模板(template),沒得時候,可以利用artTemplate.js完成 html文件是: <!DOCTY