fork download
  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. import gtk
  4. import subprocess
  5. import sys
  6. import os
  7. import Image
  8.  
  9. class PyApp(gtk.Window):
  10. def __init__(self):
  11. super(PyApp,self).__init__()
  12.  
  13. self.args = sys.argv
  14. if(len(self.args)>1):
  15. path = self.args[1]
  16. num = path.rfind("/")
  17. self.filename = path[num+1:]
  18. self.filepath = path[:num+1]
  19.  
  20. #画面状態のフラグ
  21. self.screenFlag = True
  22. #画像の回転方向のフラグ
  23. self.mouseRotateFlag = False
  24. self.fixFlag = True
  25. #シフトを押しているかどうかのフラグ
  26. self.shift_Flag = False
  27. self.rotate = 0
  28. #画像の水平反転のフラグ
  29. self.flip_n = False
  30.  
  31. #-------------window---------------------
  32. #バックカラー
  33. self.color = gtk.gdk.color_parse('#000000')
  34. self.modify_bg(gtk.STATE_NORMAL, self.color)
  35.  
  36. self.set_title(self.filename)
  37. self.connect("destroy",gtk.main_quit)
  38. self.connect("realize",self.hide_mouse)
  39. #ウインドウイベント
  40. self.connect("window_state_event",self.window_change)
  41.  
  42. #イベント処理
  43. self.add_events(gtk.gdk.KEY_PRESS_MASK|gtk.gdk.BUTTON_PRESS_MASK|gtk.gdk.SCROLL_MASK|gtk.gdk.WINDOW_STATE_ICONIFIED)
  44. self.connect("key-press-event",self.key_event)
  45. self.connect("key-release-event",self.key_release_event)
  46. self.connect("button-press-event", self.mouse_button_event)
  47. self.connect("scroll-event",self.mouse_scroll_event)
  48.  
  49. self.set_size_request(250,150)
  50. self.set_position(gtk.WIN_POS_CENTER)
  51.  
  52. #filelist:ディレクトリ内の画像ファイルの一覧
  53. self.filelist = self.get_dirimage(self.filepath)
  54. self.filelist.sort()
  55. #self.number:現在の画像ファイルの番号
  56. self.number = self.filelist.index(self.filename)
  57. for i in self.filelist:
  58. print i
  59.  
  60. self.fix = gtk.Fixed()
  61. tmp = self.load_image( self.filepath + self.filename )
  62. self.set_image(tmp)
  63. self.show_all()
  64.  
  65. self.fullscreen()
  66.  
  67. #マウス非表示
  68. def hide_mouse(self,widget):
  69. pixmap = gtk.gdk.Pixmap(None, 1, 1, 1)
  70. color = gtk.gdk.Color()
  71. cursor = gtk.gdk.Cursor(pixmap, pixmap, color, color, 0, 0)
  72. widget.window.set_cursor(cursor)
  73.  
  74. def window_change(self,widget,event):
  75. pass
  76. #print event.new_window_state
  77.  
  78. #ショートカットキー入力で呼ばれる関数
  79. def key_event(self,widget,event):
  80. keyname = gtk.gdk.keyval_name(event.keyval)
  81. #print event.type
  82. #print keyname
  83. if(keyname=="F11" or keyname=="f"):
  84. #画面表示の切り替え
  85. if(self.screenFlag == True):
  86. self.screenFlag = not(self.screenFlag)
  87. self.unfullscreen()
  88. self.maximize()
  89. elif(self.screenFlag == False):
  90. self.screenFlag = not(self.screenFlag)
  91. self.fullscreen()
  92. if(keyname=="Home"):
  93. self.update("home")
  94. if(keyname=="End"):
  95. pass
  96. if(keyname=="Delete"):
  97. #もしShiftキーを押していれば
  98. if( self.shift_Flag == True ):
  99. #ファイルを削除する
  100. hoge = self.filepath + self.filelist[self.number]
  101. os.remove(hoge)
  102. print "削除:",hoge
  103. #ディレクトリリスト更新
  104. self.filelist = self.get_dirimage(self.filepath)
  105. self.filelist.sort()
  106. #画像を消したので画像のリストの番号を一つ後ろにする
  107. if(self.number == 0):
  108. self.number = len(self.filelist) - 1
  109. else:
  110. self.number -= 1
  111. #そして次の画像表示
  112. self.update("down")
  113. if(keyname=="h"):
  114. #画像を水平に反転する
  115. self.flip_n = not(self.flip_n)
  116. self.image_ch()
  117. if(keyname=="H"):
  118. try:
  119. im = Image.open( self.filepath + self.filelist[self.number] )
  120. im = im.transpose(Image.FLIP_LEFT_RIGHT)
  121. im.save( self.filepath + self.filelist[self.number], quality = 100 )
  122. print "画像反転完了",self.filepath + self.filelist[self.number]
  123. self.image_ch()
  124. except:
  125. print "画像反転失敗"
  126. if(keyname=="Up"):
  127. self.update("up")
  128. if(keyname=="Down"):
  129. self.update("down")
  130. if(keyname=="space"):
  131. self.update("up")
  132. if(keyname=="Left" or keyname=="l"):
  133. self.mouseRotateFlag = False
  134. self.rotate_update(2)
  135. if(keyname=="Right" or keyname=="r"):
  136. self.mouseRotateFlag = True
  137. self.rotate_update(1)
  138. if(keyname=="Escape"):
  139. self.flip_n = False
  140. self.rotate_update(0)
  141. if(keyname=="Shift_L" or keyname=="Shift_R"):
  142. self.shift_Flag = True
  143. print "Shift",self.shift_Flag
  144.  
  145.  
  146. #キーボードを離した時の処理
  147. def key_release_event(self,widget,event):
  148. keyname = gtk.gdk.keyval_name(event.keyval)
  149. #print keyname
  150. if(keyname == "Shift_L" or keyname == "Shift_R"):
  151. self.shift_Flag = False
  152. print "Shift",self.shift_Flag
  153.  
  154. #マウス入力
  155. def mouse_scroll_event(self,widget,event):
  156. if(event.direction == gtk.gdk.SCROLL_UP):
  157. self.update("up")
  158. if(event.direction == gtk.gdk.SCROLL_DOWN):
  159. self.update("down")
  160.  
  161. #マウスボタン入力
  162. def mouse_button_event(self,widget,event):
  163. #print event.button
  164. #左クリックかつダブルクリックじゃない場合
  165. if(event.button == 1 and event.type == gtk.gdk.BUTTON_PRESS):
  166. self.update("down")
  167. #右クリックかつダブルクリックで終了
  168. if(event.button == 3 and event.type == gtk.gdk._2BUTTON_PRESS):
  169. sys.exit(0)
  170. #上サイドクリック(回転)
  171. if(event.button == 9 and event.type == gtk.gdk.BUTTON_PRESS):
  172. if(self.mouseRotateFlag == False):
  173. self.mouseRotateFlag = not(self.mouseRotateFlag)
  174. self.rotate_update(1)
  175. elif(self.mouseRotateFlag == True):
  176. self.mouseRotateFlag = not(self.mouseRotateFlag)
  177. self.rotate_update(2)
  178. #下サイドクリック
  179. if(event.button == 8):
  180. if(self.fixFlag == True and event.type == gtk.gdk.BUTTON_PRESS):
  181. self.fix.hide()
  182. self.fixFlag = not(self.fixFlag)
  183. elif(self.fixFlag == False and event.type == gtk.gdk.BUTTON_PRESS):
  184. self.fix.show()
  185. self.fixFlag = not(self.fixFlag)
  186.  
  187. #ロードした画像オブジェクトtmpを加工して画面に表示する
  188. def set_image(self,tmp):
  189. #画像変数
  190. width = tmp.get_width()
  191. height = tmp.get_height()
  192. screenx = gtk.gdk.screen_width()
  193. screeny = gtk.gdk.screen_height()
  194.  
  195. image = gtk.Image()
  196. new_width = int(height*float(screeny)/width)
  197. if(self.rotate>0 and height>=width):
  198. if(new_width<=screenx):
  199. tmp = self.set_rotation(self.rotate,tmp)
  200. tmp = tmp.scale_simple(new_width,screeny,gtk.gdk.INTERP_HYPER)
  201. image.set_from_pixbuf(tmp)
  202. self.fix.put(image,(screenx-new_width)/2,0)
  203. elif(new_width>screenx):
  204. new_height = int(width*float(screenx)/height)
  205. tmp = self.set_rotation(self.rotate,tmp)
  206. tmp = tmp.scale_simple(screenx,new_height,gtk.gdk.INTERP_HYPER)
  207. image.set_from_pixbuf(tmp)
  208. self.fix.put(image,0,(screeny-new_height)/2)
  209. elif(self.rotate==0 or height<width):
  210. new_width = int(width*float(screeny)/height)
  211. if(new_width<=screenx):
  212. tmp = self.set_flip(self.flip_n,tmp)
  213. tmp = tmp.scale_simple(new_width,screeny,gtk.gdk.INTERP_HYPER)
  214. image.set_from_pixbuf(tmp)
  215. self.fix.put(image,(screenx-new_width)/2,0)
  216. else:
  217. tmp = self.set_flip(self.flip_n,tmp)
  218. new_height = int(height*float(screenx)/width)
  219. tmp = tmp.scale_simple(screenx,new_height,gtk.gdk.INTERP_HYPER)
  220. image.set_from_pixbuf(tmp)
  221. self.fix.put(image,0,(screeny-new_height)/2)
  222. self.add(self.fix)
  223.  
  224. #アイコン設定
  225. def set_icon(self,path):
  226. try:
  227. self.set_icon_from_file(path)
  228. except Exception,e:
  229. print e.message
  230. sys.exit(1)
  231.  
  232. #画像を回転させる
  233. def set_rotation(self,rotate,tmp):
  234. if(rotate==0):
  235. pass
  236. if(rotate==1):
  237. tmp = tmp.rotate_simple(270)
  238. if(rotate==2):
  239. tmp = tmp.rotate_simple(90)
  240. return tmp
  241.  
  242. #画像を左右反転させる
  243. def set_flip(self,flip_n,tmp):
  244. if(flip_n==True):
  245. tmp = tmp.flip(True)
  246. return tmp
  247.  
  248. #画像ファイルをロードする
  249. def load_image(self,path):
  250. try:
  251. tmp = gtk.gdk.pixbuf_new_from_file(path)
  252. except Exception,e:
  253. #もしロードできなければ
  254. #ディレクトリ内の画像リストをもう一度更新する
  255. self.filelist = self.get_dirimage(self.filepath)
  256. self.filelist.sort()
  257. #画像を消したので画像のリストの番号を一つ後ろにする
  258. if(self.number == 0):
  259. self.number = len(self.filelist) - 1
  260. else:
  261. self.number -= 1
  262. #もう一度再帰呼出し
  263. load_image(path)
  264.  
  265. return tmp
  266.  
  267. #ディレクトリ内の画像をリストに取得
  268. def get_dirimage(self,path):
  269. files = os.listdir(path)
  270. list = []
  271. for i in files:
  272. if((".jpg"in i) == True or (".jpeg"in i) == True or (".png"in i) == True or (".JPG"in i) == True or (".bmp"in i) == True):
  273. list.append(i)
  274.  
  275. return list
  276.  
  277. #回転命令時に呼ばれる関数
  278. def rotate_update(self,a):
  279. self.rotate = a
  280. self.image_ch()
  281.  
  282. #表示画面を次の画像に変える関数
  283. def update(self,a):
  284. if(a=="up"):
  285. if(self.number == 0):
  286. self.number = len(self.filelist)-1
  287. else:
  288. self.number -= 1
  289. self.image_ch()
  290.  
  291. elif(a=="down"):
  292. if(self.number>=(len(self.filelist)-1)):
  293. self.number = 0
  294. else:
  295. self.number += 1
  296. self.image_ch()
  297.  
  298. elif(a=="home"):
  299. self.number = 0
  300. self.image_ch()
  301. else:
  302. print "self.update():エラー"
  303.  
  304. self.set_title(self.filelist[self.number])
  305.  
  306. #self.update()から呼ばれる画像を表示する関数
  307. def image_ch(self):
  308. self.remove(self.fix)
  309. self.fix = None
  310. self.fix = gtk.Fixed()
  311. try:
  312. tmp = self.load_image( self.filepath + self.filelist[self.number] )
  313. self.set_image(tmp)
  314. except:
  315. pass
  316. self.show_all()
  317.  
  318.  
  319. #多重起動防止関数
  320. def prevent_multi_process():
  321. cmd = "ps ax | grep 'python /home/martin/python/gazowa_flip.py'"
  322. ret = subprocess.check_output( cmd , shell=True)
  323. #print ret
  324. script_name = 'python /home/martin/python/gazowa_flip.py'
  325. number = ret.count(script_name)
  326. #上のpsコマンドとgrepの数を減らす
  327. number -= 2
  328. print "がぞわーの起動数:",number,"個"
  329. if( number >= 3 ):
  330. print "多重起動禁止(3つ以上の起動は禁止しています)"
  331. sys.exit()
  332.  
  333.  
  334. prevent_multi_process()
  335. PyApp()
  336. gtk.main()
  337.  
Runtime error #stdin #stdout #stderr 0.09s 32928KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
(process:19690): Gtk-WARNING **: Locale not supported by C library.
	Using the fallback 'C' locale.
/usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display
  warnings.warn(str(e), _gtk.Warning)
Error, do this: mount -t proc proc /proc
Traceback (most recent call last):
  File "prog.py", line 334, in <module>
  File "prog.py", line 322, in prevent_multi_process
  File "/usr/lib/python2.7/subprocess.py", line 573, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'ps ax | grep 'python /home/martin/python/gazowa_flip.py'' returned non-zero exit status 1