Created
May 21, 2018 05:05
-
-
Save pythonsuezo/b75e92a6f152c09b0162951c2013e60f to your computer and use it in GitHub Desktop.
クリップ画像保存器その6 完成コード
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import clipframe # wxFormBuilderのソース | |
| import wx | |
| import os, sys, re | |
| import subprocess | |
| import datetime | |
| import configparser | |
| from PIL import ImageGrab, Image | |
| from threading import Event, Thread | |
| from time import sleep | |
| import copy | |
| import winsound | |
| """---------------------------------------------- | |
| クリップ画像保存器 | |
| グローバル定数 | |
| path : 実行ファイルのディレクトリ | |
| today : 今日の日付 | |
| now : 今の時間 | |
| INI : 設定ファイルの場所 | |
| 設定ファイルに最後に保存したディレクトリの情報を記載する | |
| ----------------------------------------------""" | |
| path = os.path.dirname( sys.argv[0] ) | |
| INI = path + "/INI.conf" | |
| conf = configparser.SafeConfigParser() | |
| now = datetime.datetime.now() | |
| today = now.strftime( "%Y/%m/%d" ) # 日付 YYYY/MM/DD | |
| now = now.strftime( "%H:%M:%S" ) # 時刻 HH:MM:SS | |
| class Mainframe( clipframe.MyFrame1 ): | |
| def __init__( self, parent ): | |
| clipframe.MyFrame1.__init__( self, parent ) | |
| try: | |
| conf.read(INI) # 設定ファイルをロードする | |
| if conf.has_option("save","folder"): | |
| print("設定読み込み成功") | |
| m_folder = conf.get("save","folder") | |
| s_folder = conf.get("save","s_folder") | |
| name = conf.get("save","name") | |
| if os.path.exists( m_folder ): | |
| self.m_textCtrl2.SetValue(m_folder) | |
| self.SetCombo(m_folder) | |
| self.m_textCtrl1.SetValue(name) | |
| if os.path.exists(os.path.join(m_folder,s_folder)): | |
| self.m_comboBox1.SetValue(s_folder) | |
| else: # ディレクトリが無いならボタンを無効にする | |
| print(m_folda,"\nディレクトリが存在しません") | |
| self.m_textCtrl2.SetValue("親フォルダを選択してください") | |
| self.m_button4.Disable() | |
| self.m_button5.Disable() | |
| self.m_toggleBtn2.Disable() | |
| self.m_toggleBtn2.SetValue(False) | |
| else: | |
| print("設定がありません") | |
| conf.add_section("save") | |
| self.m_textCtrl2.SetValue("親フォルダを選択してください") | |
| self.m_button4.Disable() | |
| self.m_button5.Disable() | |
| self.m_toggleBtn2.Disable() | |
| self.m_toggleBtn2.SetValue(False) | |
| except: | |
| print("設定ファイルがありません") | |
| def Dirset( self, event ): # ディレクトリ選択した時 | |
| dir = self.m_dirPicker1.GetPath() | |
| print(dir) | |
| self.m_textCtrl2.SetValue(dir) # 保存先をテキストコントロールにセット | |
| self.m_button4.Enable() | |
| self.m_button5.Enable() | |
| self.m_toggleBtn2.Enable() | |
| # INIに書き込み | |
| conf.set("save","folder",dir) | |
| f = open(INI,"w") | |
| conf.write(f) | |
| f.close() | |
| self.SetCombo(dir) | |
| return | |
| def Opendir( self, event ): | |
| dir = os.path.join(self.m_textCtrl2.GetValue(),self.m_comboBox1.GetValue()) # テキストコントロールから保存先を取得する | |
| if os.path.exists( dir ): # ディレクトリが存在するか? | |
| subprocess.Popen(["explorer", dir]) | |
| else: | |
| subprocess.Popen(["explorer", path]) | |
| return | |
| def Clipsave( self, event ): | |
| im = ImageGrab.grabclipboard() # クリップボードの画像を取得 | |
| dir = self.m_textCtrl2.GetValue() | |
| manual_save = dir + "/manual" # 手動保存のディレクトリ | |
| file_name = "pic_" | |
| if im == None: # クリップボード内に画像が無ければ何もしない | |
| return print("クリップボードに画像がありません") | |
| if os.path.exists( dir ): # ディレクトリが存在するか? | |
| if not os.path.exists(manual_save): # 手動保存のディレクトリが存在するか? | |
| os.mkdir(manual_save) # 無いなら作る | |
| else: | |
| return print("存在しないディレクトリ:",dir) | |
| save_file = self.New_file(manual_save, file_name)[0] | |
| im.save( save_file,"JPEG",quality=99,optimize=True ) # 画像を保存 | |
| winsound.PlaySound('SystemAsterisk', winsound.SND_ASYNC) | |
| print(save_file) # パスを表示 | |
| return | |
| def Monitoring_set( self, event ): | |
| m_set = self.m_toggleBtn2.GetValue() # トグルスイッチの状態を取得 | |
| print(m_set) | |
| if m_set: | |
| thread = Thread(target=self.ssloop,name="loop",args=()) | |
| thread.start() # ssloopを別スレッドで処理 | |
| else: | |
| threadevent.set() # ssloopのイベントをセット | |
| self.m_dirPicker1.Enable() # 監視終了でボタン類を有効に戻す | |
| # self.m_button1.Enable() | |
| def ssloop(self): # クリップボード監視ループ | |
| imdelta = Image.new("RGB", (512, 512), (128, 128, 128)) # imdelta=Noneにならないように適当なimageを設定 | |
| print("監視開始") | |
| self.m_dirPicker1.Disable() # ボタン類を無効にしておく | |
| # self.m_button1.Disable() | |
| while not threadevent.wait(0.5): | |
| im = ImageGrab.grabclipboard() | |
| dir = self.m_textCtrl2.GetValue() + "/" + self.m_comboBox1.GetValue() | |
| name = self.m_textCtrl1.GetValue() | |
| if im == None: | |
| continue | |
| else: | |
| if imdelta.histogram() != im.histogram() or imdelta == None: | |
| if isinstance( im, Image.Image ): | |
| save_file = self.New_file(dir,name)[0] | |
| im.save(save_file,"JPEG",quality=99,optimize=True) | |
| winsound.PlaySound('SystemAsterisk', winsound.SND_ASYNC) | |
| print("saved") | |
| print(save_file) | |
| imdelta = im | |
| else: | |
| pass | |
| elif imdelta.histogram() == im.histogram() or im == None: | |
| pass | |
| else: | |
| pass | |
| print("監視終了") | |
| threadevent.clear() | |
| def New_file( self, dir, file_name ): | |
| # ディレクトリのパスを受け取って最高値+1のファイル名を返す | |
| # 同名ファイルのナンバリング最高値を求める | |
| dir_list = os.listdir(dir) # フォルダの中身をリスト化 | |
| if len(dir_list) == 0: # ディレクトリ内にファイルがない場合は00000 | |
| return dir + "/" + file_name + "00000" + ".jpg", "00000" | |
| if [s for s in dir_list if s.startswith(file_name)]: | |
| max_num = max([s for s in dir_list if s.startswith(file_name)]).split(".")[0] | |
| max_num = re.sub(file_name, r"", max_num) # ファイル名を削除 | |
| new_file = "{0:05d}".format(int(max_num)+1) # ファイル名に+1して5ケタでゼロサプレスする | |
| else: | |
| new_file = "00000" | |
| return dir + "/" + file_name + new_file + ".jpg", new_file | |
| def Make_Dir(self, event): | |
| m_folder = self.m_textCtrl2.GetValue() | |
| new_folder = self.m_comboBox1.GetValue() | |
| new_path = os.path.join(m_folder,new_folder) | |
| print(new_path) | |
| # 1文字でも入力していて入力したフォルダが存在しない時にフォルダを作成 | |
| if not os.path.isdir(new_path) or not len(new_folder): | |
| os.mkdir(new_path) | |
| self.SetCombo(m_folder) | |
| self.m_comboBox1.SetValue(new_folder) | |
| def SetCombo(self, dir): | |
| files = os.listdir(dir) | |
| s_folder = [f for f in files if os.path.isdir(os.path.join(dir, f))] | |
| print(s_folder) | |
| self.m_comboBox1.SetItems(s_folder) # 対象.SetItems(リスト)で項目を与える | |
| return | |
| def ExitHandler( self, event ): | |
| dlg = wx.MessageDialog( None, 'クリップ画像保存器を終了します。\nよろしいですか?', | |
| "クリップ画像保存器", style = wx.YES_NO ) | |
| result = dlg.ShowModal() #ダイアログの表示 | |
| if result == wx.ID_YES: #はいを押した時終了 | |
| threadevent.set() | |
| conf.set("save","name",self.m_textCtrl1.GetValue()) | |
| conf.set("save","s_folder",self.m_comboBox1.GetValue()) | |
| conf.set("save","toggle",str(self.m_toggleBtn2.GetValue())) | |
| f = open(INI,"w") | |
| conf.write(f) | |
| f.close() | |
| sys.exit() #プログラム終了 | |
| else: #いいえの時は何もしない | |
| return | |
| thread = Thread(target=Mainframe) | |
| threadevent = Event() | |
| app = wx.App( False ) | |
| frame = Mainframe( None ) | |
| frame.Show( True ) | |
| app.MainLoop() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # -*- coding: utf-8 -*- | |
| ########################################################################### | |
| ## Python code generated with wxFormBuilder (version Nov 6 2017) | |
| ## http://www.wxformbuilder.org/ | |
| ## | |
| ## PLEASE DO *NOT* EDIT THIS FILE! | |
| ########################################################################### | |
| import wx | |
| import wx.xrc | |
| ########################################################################### | |
| ## Class MyFrame1 | |
| ########################################################################### | |
| 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( 500,331 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.MINIMIZE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL ) | |
| self.SetSizeHints( wx.DefaultSize, wx.DefaultSize ) | |
| bSizer1 = wx.BoxSizer( wx.VERTICAL ) | |
| self.m_panel1 = wx.Panel( self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL ) | |
| self.m_panel1.SetBackgroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_ACTIVEBORDER ) ) | |
| bSizer2 = wx.BoxSizer( wx.VERTICAL ) | |
| bSizer4 = wx.BoxSizer( wx.VERTICAL ) | |
| bSizer7 = wx.BoxSizer( wx.HORIZONTAL ) | |
| self.m_dirPicker1 = wx.DirPickerCtrl( self.m_panel1, wx.ID_ANY, wx.EmptyString, u"親フォルダを選択", wx.DefaultPosition, wx.DefaultSize, wx.DIRP_SMALL ) | |
| bSizer7.Add( self.m_dirPicker1, 0, wx.ALL, 5 ) | |
| self.m_staticText1 = wx.StaticText( self.m_panel1, wx.ID_ANY, u"サブフォルダ:", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| self.m_staticText1.Wrap( -1 ) | |
| bSizer7.Add( self.m_staticText1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 ) | |
| m_comboBox1Choices = [] | |
| self.m_comboBox1 = wx.ComboBox( self.m_panel1, wx.ID_ANY, u"Combo!", wx.DefaultPosition, wx.DefaultSize, m_comboBox1Choices, 0 ) | |
| bSizer7.Add( self.m_comboBox1, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 ) | |
| self.m_button01 = wx.Button( self.m_panel1, wx.ID_ANY, u"作成", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| bSizer7.Add( self.m_button01, 0, wx.ALL, 5 ) | |
| self.m_textCtrl1 = wx.TextCtrl( self.m_panel1, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| self.m_textCtrl1.SetToolTip( u"ファイル名" ) | |
| bSizer7.Add( self.m_textCtrl1, 0, wx.ALL|wx.ALIGN_CENTER_VERTICAL, 5 ) | |
| bSizer4.Add( bSizer7, 1, wx.EXPAND, 5 ) | |
| bSizer8 = wx.BoxSizer( wx.HORIZONTAL ) | |
| self.m_staticText3 = wx.StaticText( self.m_panel1, wx.ID_ANY, u"保存先:", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| self.m_staticText3.Wrap( -1 ) | |
| bSizer8.Add( self.m_staticText3, 0, wx.ALL|wx.EXPAND|wx.ALIGN_CENTER_VERTICAL, 5 ) | |
| self.m_textCtrl2 = wx.TextCtrl( self.m_panel1, wx.ID_ANY, u"保存先フォルダ", wx.DefaultPosition, wx.DefaultSize, wx.TE_READONLY ) | |
| bSizer8.Add( self.m_textCtrl2, 1, wx.ALL|wx.ALIGN_CENTER_VERTICAL|wx.EXPAND, 5 ) | |
| bSizer4.Add( bSizer8, 0, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 5 ) | |
| bSizer2.Add( bSizer4, 0, wx.EXPAND, 5 ) | |
| self.m_staticline1 = wx.StaticLine( self.m_panel1, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL ) | |
| bSizer2.Add( self.m_staticline1, 0, wx.EXPAND |wx.ALL, 5 ) | |
| bSizer5 = wx.BoxSizer( wx.VERTICAL ) | |
| bSizer9 = wx.BoxSizer( wx.HORIZONTAL ) | |
| bSizer10 = wx.BoxSizer( wx.VERTICAL ) | |
| self.m_button4 = wx.Button( self.m_panel1, wx.ID_ANY, u"フォルダを開く", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| bSizer10.Add( self.m_button4, 1, wx.ALL|wx.EXPAND, 5 ) | |
| self.m_button5 = wx.Button( self.m_panel1, wx.ID_ANY, u"クリップボードの画像を保存", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| bSizer10.Add( self.m_button5, 1, wx.ALL|wx.EXPAND, 5 ) | |
| bSizer9.Add( bSizer10, 1, wx.EXPAND, 5 ) | |
| bSizer6 = wx.BoxSizer( wx.VERTICAL ) | |
| self.m_toggleBtn2 = wx.ToggleButton( self.m_panel1, wx.ID_ANY, u"クリップボード監視", wx.DefaultPosition, wx.DefaultSize, 0 ) | |
| self.m_toggleBtn2.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_WINDOWTEXT ) ) | |
| bSizer6.Add( self.m_toggleBtn2, 1, wx.ALL|wx.EXPAND, 5 ) | |
| bSizer9.Add( bSizer6, 1, wx.EXPAND, 5 ) | |
| bSizer5.Add( bSizer9, 1, wx.EXPAND, 5 ) | |
| bSizer2.Add( bSizer5, 1, wx.EXPAND, 5 ) | |
| self.m_panel1.SetSizer( bSizer2 ) | |
| self.m_panel1.Layout() | |
| bSizer2.Fit( self.m_panel1 ) | |
| bSizer1.Add( self.m_panel1, 1, wx.EXPAND|wx.ALIGN_CENTER_HORIZONTAL, 5 ) | |
| self.SetSizer( bSizer1 ) | |
| self.Layout() | |
| self.Centre( wx.BOTH ) | |
| # Connect Events | |
| self.Bind( wx.EVT_CLOSE, self.ExitHandler ) | |
| self.m_dirPicker1.Bind( wx.EVT_DIRPICKER_CHANGED, self.Dirset ) | |
| self.m_button01.Bind( wx.EVT_BUTTON, self.Make_Dir ) | |
| self.m_button4.Bind( wx.EVT_BUTTON, self.Opendir ) | |
| self.m_button5.Bind( wx.EVT_BUTTON, self.Clipsave ) | |
| self.m_toggleBtn2.Bind( wx.EVT_TOGGLEBUTTON, self.Monitoring_set ) | |
| def __del__( self ): | |
| pass | |
| # Virtual event handlers, overide them in your derived class | |
| def ExitHandler( self, event ): | |
| event.Skip() | |
| def Dirset( self, event ): | |
| event.Skip() | |
| def Make_Dir( self, event ): | |
| event.Skip() | |
| def Opendir( self, event ): | |
| event.Skip() | |
| def Clipsave( self, event ): | |
| event.Skip() | |
| def Monitoring_set( self, event ): | |
| event.Skip() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment