WiFi рдкрд╛рд░ рдХрд░рдирд╛ред рд╣рдо рд╡рд┐рдВрдбреЛрдЬ, рдореИрдХ рдФрд░ рд▓рд┐рдирдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╢реВрдЯ рдПрдВрдб рд╡реНрдпреВ рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд┐рдЦрддреЗ рд╣реИрдВ

рдПрдХ рд╣рдм рдкрд░ рдмрд╛рд░-рдмрд╛рд░ рдПрд╕рдбреАрдПрдЪрд╕реА рдкреНрд░рд╛рд░реВрдк рдХреЗ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд╛рдИрдлрд╛рдИ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рд╣реИред рдЗрд╕ рдХрд╛рд░реНрдб рдХреЛ рдЦрд░реАрджрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рднрдпрд╛рдирдХ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реЗ рдирд┐рд░рд╛рд╢ рдерд╛ред рдпрджрд┐ рдЖрдИрдУрдПрд╕ рдФрд░ рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдо рд╕реЗ рдХрдо рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдФрд░ рдореИрдХреЛрд╕ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдХрдореА рдкреЗрд╢реЗрд╡рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдХрд╛рд░реНрдб рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рддреА рд╣реИред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдкреАрд╕реА рдХрд╛ рдПрдХ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рднрдпрд╛рдирдХ рд░реВрдк рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╢реВрдЯ рдПрдВрдб рд╡реНрдпреВ рдлрд╝рдВрдХреНрд╢рди рдХреА рдХрдореА рд╕реЗ рдирд┐рд░рд╛рд╢ рдерд╛, рдЬреЛ рдлреЛрдЯреЛрдЧреНрд░рд╛рдлрд░реЛрдВ рдХреЗ рдмреАрдЪ рдорд╛рдВрдЧ рдореЗрдВ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рдмрдбрд╝реА рдХрдВрдкреНрдпреВрдЯрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рд╢реВрдЯрд┐рдВрдЧ рдкрд░рд┐рдгрд╛рдо рдХреЛ рд▓рдЧрднрдЧ рддреБрд░рдВрдд рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЧреАрдХ-рдкреЛрд░реНрдиреЛ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░рд╛рд╢ рд╣реЛрдВрдЧреЗ - рд╣рдо рдлрд░реНрдорд╡реЗрдпрд░ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕реЗ рд╣реИрдХ рдХрд░реЗрдВрдЧреЗ, рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЛ рд╕реНрд╡рдпрдВ рдЦреЛрд▓реЗрдВрдЧреЗред рд╣рдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдВрд╢реЛрдзрди рдХреЗ "рд╕реНрдЯреЙрдХ" рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред

рдЗрд╕рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЯреНрд░рд╛рдВрд╕реЗрдВрдб рд╡рд╛рдИрдлрд╛рдИ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рд╢реВрдЯ рдПрдВрдб рд╡реНрдпреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ рдФрд░ рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд▓рд┐рдЦреЗрдВрдЧреЗ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХрдУрдПрд╕ рдкрд░ рдЪрд▓реЗрдЧрд╛ред рдФрд░ рд╕рдмрд╕реЗ рдЕрдзреАрд░ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдкрд╛рдпрдерди рдореЙрдбреНрдпреВрд▓, рдПрдХ рдХрдВрд╕реЛрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ, рд╕рд╛рде рд╣реА рдПрдХ рдЬреАрдпреВрдЖрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдорд┐рд▓реЗрдЧреА рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХреЛрд╕ рдкрд░ рдХрд╛рдо рдХрд░рддреА рд╣реИред



рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдЦреЛрдЬреЗрдВред


рдПрдХ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рджреЛ рдореЛрдбреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ: рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдореЛрдб, рдЬрдм рдХрд╛рд░реНрдб рдЕрдкрдиреА рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдФрд░ рдХрдиреЗрдХреНрд╢рди рдореЛрдб рдХреЛ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдм рдХрд╛рд░реНрдб "рдХреНрд▓рд┐рдВрдЧреНрд╕" рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рдкреЙрдЗрдВрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрд╡реЗрджрди рдореЛрдб рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб рдпрд╛ рдЖрдИрдУрдПрд╕ рд╕реЗ рдХрдиреЗрдХреНрд╢рди рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдХрдиреЗрдХреНрд╢рди рдореЛрдб рдХреЛ рдПрдХреНрд╕реЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдиреЗрд╡рд░ рдХреЛ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░рдХреЗ "рдЯрд░реНрди рдСрдл рд╡рд╛рдИрдлрд╛рдИ" рд╕реЗрдЯ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рд╡рд╛рдИрдлрд╛рдИ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдХрд╛рд░реНрдб рд╕реЗ рдЬреБрдбрд╝рд╛ рдирд╣реАрдВ рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдХрд╛рд░реНрдб рдХреЛ рдХрд╛рд░реНрдб рд░реАрдбрд░ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ, рдпрд╛ рдХреИрдорд░рд╛ рд╕реЗрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдкрд░ рдмрдВрдж рди рд╣реЛред

рдЪрд▓реЛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдХрдВрд╕реЛрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдореЙрдбреНрдпреВрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдХреЗрд╡рд▓ "рдХрд┐рдЯ рдореЗрдВ рдмреИрдЯрд░реА"ред рдФрд░ рд╣рдо рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ:

import socket class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir #  ip  ,       self.ip=socket.gethostbyname(socket.gethostname()) #   ip  self.card_ip=None if __name__=='__main__': #      HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' sd=SDCard(home_dir=HOME_DIR) 


рдпрджрд┐ рдХрд╛рд░реНрдб рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рд╛рдЙрдЯрд░ рдХреЗ рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдб рд╕реЗ рд╕реАрдзрд╛ рд╕рдВрдмрдВрдз рд╣реИ, рддреЛ рдЗрд╕рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ 192.168.11.254 (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рдЕрдиреБрд╕рд╛рд░) рд╣реИред
рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдореИрдк рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдПрдХ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП:
  1. рдкреЛрд░реНрдЯ 58255 рдкрд░ рдПрдХ рд╕реЙрдХреЗрдЯ рдмрдирд╛рдПрдВ
  2. рдЗрд╕рдореЗрдВ рд╕реЗ 55777 рдкреЛрд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦрд╛рд▓реА рдкреНрд░рд╕рд╛рд░рдг рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ
  3. рдПрдХ рдЪрдорддреНрдХрд╛рд░ рдХрд╛рд░реНрдб рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░реЗрдВ

рдпрджрд┐ рд╣рдо рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдЬрд╡рд╛рдм рдореЗрдВ рд╣рдореЗрдВ рдпрд╣ рдкрд╛рда рдорд┐рд▓рддрд╛ рд╣реИ:
 Transcend WiFiSD - interface=mlan0 ip=192.168.0.16 netmask=255.255.255.0 router=192.168.0.1 mode=client essid=WiFiSDCard apmac=CE:5D:4E:5B:70:48 

рдЗрд╕ рд╕рдм рд╕реЗ, рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдЖрдИрдкреА рдкрддреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЕрдм рдпрд╣ рдкреВрд░реА рдмрд╛рдд рдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдмрдирд╛ рд╣реБрдЖ рд╣реИ:
 import os import socket import thread import time class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir self.ip=socket.gethostbyname(socket.gethostname()) self.card_ip=None def find_card(self,callback=None): """    """ thread.start_new_thread(self.find_card_thread,(callback,)) def find_card_thread(self,callback=None): while not self.card_ip: """ UDP  """ s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) """      """ try:s.bind((self.ip, 58255)) except socket.error: s.close() time.sleep(1) continue """      55777""" s.sendto('', ('<broadcast>', 55777)) try: resp=s.recv(400) s.close() try: """    """ self.card_ip=resp.split('ip=')[1].split('\n')[0] except IndexError: """     """ if callback:callback(None) """   ip""" if callback:callback(self.card_ip) except socket.timeout: callback(self.card_ip) finally: time.sleep(2) def monitor(ip): if not ip:return print 'Find card on ip:',ip if __name__=='__main__': HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' if options.dir:HOME_DIR=options.dir sd=SDCard(home_dir=HOME_DIR) #      "", #    GUI    sd.find_card(callback=monitor) #       , #     while 1: time.sleep(1) 


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдмрд╕реЗ рдХрдард┐рди рд╣рд┐рд╕реНрд╕рд╛ рдЦрддреНрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдирдИ рдлрд╝реЛрдЯреЛ рдХреА "рд░рд╕реАрдж" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирдИ рддрд╕реНрд╡реАрд░реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред


рдлрд╝реЛрдЯреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рд╣рдореЗрдВ рдирдХреНрд╢рд╛ рдорд┐рд▓ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдмрд╕ рдкреЛрд░реНрдЯ 5566 рдкрд░ рдореИрдк рд╕реЗ рдЬреБрдбрд╝реЗрдВред
рдЕрдм, рдЬреИрд╕реЗ рд╣реА рдХреИрдорд░рд╛ рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рд▓реЗрддрд╛ рд╣реИ, 7-8 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж, рдирдХреНрд╢реЗ рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдПрдХ рдЦреБрд▓реЗ рд╕реЙрдХреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрдПрдЧреА, рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
>/mnt/DCIM/101CANON/IMG_1754.JPG

рдпрджрд┐ рдЖрдкрдиреЗ рдХрдИ рдлрд╝реЛрдЯреЛ рд▓рд┐рдП рд╣реИрдВ, рддреЛ рдПрдХ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рд╢реВрдиреНрдп рдмрд╛рдЗрдЯ (0x00) рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ

рдореИрдВ рдЬреЛрд░ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдпрд╣ 7-8 рд╕реЗрдХрдВрдб рдореЗрдВ рд╣реИред рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, jpeg рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдХреЗрд╡рд▓ рдирдИ рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдорд┐рд▓рддреА рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдХрд╛рд░реНрдб рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рдореЗрдВ RAW рдлрд╝рд╛рдЗрд▓ рд╕реЗ рд╡рд╛рдпрд░реНрдб jpg рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ (рдиреАрдЪреЗ рдЗрд╕ рдкрд░), рд▓реЗрдХрд┐рди рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдиреЗ рд╣рдореЗрдВ jpg рдореЗрдВ рд╢реВрдЯ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╕реЗ рд╡рдВрдЪрд┐рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛, RAW + jpg, рдпрд╛ рдореЗрдВ рд╢реВрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ред рдПрдХ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП рд░реЙ рд▓рд┐рдЦреЗрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ jpgред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдХрд╛рд░реНрдб рд░реАрдбрд░ рд╕реЗ рдлрд╝реЛрдЯреЛ рдХреЙрдкреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛, рд╢реВрдЯ рдПрдВрдб рд╡реНрдпреВ рдХреЗрд╡рд▓ рдХреИрдорд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓реА рдЧрдИ рдирдИ рддрд╕реНрд╡реАрд░реЛрдВ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИред

рдЗрд╕ рдкреВрд░реА рдЪреАрдЬрд╝ рдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЖрд╕рд╛рди рд╣реИред рдореИрдВ рд╢рд╛рдпрдж рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рджрд┐рдЦрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛, рдФрд░ рдкреВрд░реНрдг рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
  def listener_thread(self,callback): sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #     sock.connect((self.card_ip, 5566)) while self.listen_flag: message=sock.recv(1024) #      (   ) new_files=message.split('\00') for x in new_files: if x: #       self.all_files.append(x[1:]) # x[1:] -   ">",     #       self.download_list.put(self.all_files[-1]) if callback:callback(self.all_files[-1]) 


рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рд╕реЗ рдлреЛрдЯреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ


рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдирдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ, рдЕрдВрддрд┐рдо рдЪрд░рдг рдХреЛ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдлрд╝реЛрдЯреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИред рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ, рдбрд╛рдЙрдирд▓реЛрдб рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣реИрд░рд╛рдиреА рдХреА рдмрд╛рдд рд╣реИ, рддрдереНрдп - рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рдпрд╛ рдерд╛, рд╕рд╛рде рд╣реА рдлреЛрдЯреЛ рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛, рдЬреИрд╕реЗ рдХрд┐ рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдЖрджрд┐, рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рди рдХрд░реЗрдВред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдХрд╛рд░реНрдб рдХреЛ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╡рд╛рдИрдлрд╛рдИ рдкрд╛рд╕рд╡рд░реНрдб рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рдореМрдЬреВрдж рд╣рд░ рдЪреАрдЬ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рдкрд░реНрдпрдЯрдХ рд╕реНрдерд╛рдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдФрд░ рдХреИрдорд░реЛрдВ рдХреЗ рд╕рд╛рде рдкрд░реНрдпрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╡рд╛рдИрдлрд╛рдИ рдиреЗрдЯрд╡рд░реНрдХ рдХреА рддрд▓рд╛рд╢ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдк cgi-bin рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдмрд╣реБрдд рд╕реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдорд┐рд▓реЗрдВрдЧреА рдЬреЛ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╕рд░рд▓ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЯреЗрд▓рдиреЗрдЯ рдХрд╛рд░реНрдб рдкрд░ рдЗрд╕реЗ рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдЗрд╕реЗ рджреЗрдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИред рдФрд░ рд╣рдорд╛рд░реЗ рдЕрдВрджрд░:


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, wifi_filelist рдмрд╛рдЗрдирд░реА рд╣рдореЗрдВ рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА (XML рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ) рдлрд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рджреЗрдЧрд╛, рдмрд╕ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ: CARD_IP / cgi-bin / wifi_filelist? Fn = IR, рдЬрд╣рд╛рдБ CARD_IP рдЙрд╕ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХрд╛ рдЖрдИрдкреА рдкрддрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдорд┐рд▓рд╛ рд╣реИ, рдФрд░ DIR рд╣реИ? рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (рдЬреИрд╕реЗ / mnt / DCIM)ред рдердВрдмрдиреИрд▓ рдмрд╛рдЗрдирд░реА рд╣рдореЗрдВ рдлреЛрдЯреЛ рдХрд╛ рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрдЧрд╛, рдмрд╕ рдЗрд╕реЗ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкрде рдлрд╝реАрдб рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд░реНрд╡рд░ рд╕рд╛рдЗрдб рдкрд░, рдПрдХ рд╕рдВрд╕рд╛рдзрди-рдЧрд╣рди рдлреЛрдЯреЛ рдХрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди jpg рдпрд╛ рдХрдЪреНрдЪреЗ рдореЗрдВ рд╡рд╛рдпрд░реНрдб рд╣реЛрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рд╣рдо рдлрд╝реЛрдЯреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рд╡рд╛рдВрдЫрд┐рдд рдлрд╝реЛрдЯреЛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкрддрд╛ CARD_IP / cgi-bin / wgi_download; Fn = IMAGE_PATH , рдЬрд╣рд╛рдВ IMAGE_PATH рдЙрди рддрд╕реНрд╡реАрд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕реЙрдХреЗрдЯ рд╕реЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкрде рд╣реИред рдЕрдЬрдЧрд░ рдореЗрдВ, urlib рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ urlretrieve рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рддреБрд░рдВрдд рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдбрд╛рдЙрдирд▓реЛрдб рдкреНрд░рдЧрддрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЬреЛ рддрдм GUI рдореЗрдВ рдХрд╛рдо рдЖрддрд╛ рд╣реИред
рдбрд╛рдЙрдирд▓реЛрдб рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
  def download_thread(self,download_callback,download_complete): while self.listen_flag: #       if not self.download_list.empty(): #     fl=self.download_list.get(block=0) #        urllib.urlretrieve('http://%s/cgi-bin/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('/')[-1],download_callback if download_callback else None) if download_complete:download_complete(self.download_now) time.sleep(0.1) 


рдЕрдм рд╣рдо рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдПрдХ рддреИрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг, рдЙрд╕реА рд╕рдордп рдПрдХ рдХрдВрд╕реЛрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рд╡рд┐рдВрдбреЛрдЬрд╝, рд▓рд┐рдирдХреНрд╕ рдФрд░ рдореИрдХреЛрд╕ рдкрд░ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

sdwificard.py
 #coding:utf-8 """ Copyright (C) 2010 Igor zalomskij <igor.kaist@gmail.com> This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. """ import os import socket import thread import time import ping import Queue import urllib import sys class SDCard: def __init__(self,home_dir=''): self.home_dir=home_dir #  ip     self.ip=socket.gethostbyname(socket.gethostname()) self.card_ip=None #  ip    self.all_files=[] #    self.download_list=Queue.Queue() #     self.in_queue=[] #     ,   GUI def find_card(self,callback=None): #       thread.start_new_thread(self.find_card_thread,(callback,)) def find_card_thread(self,callback=None): """     """ while not self.card_ip: #  UDP  s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.settimeout(5) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) try:s.bind((self.ip, 58255)) #     except socket.error: s.close() time.sleep(1) continue #      55777 s.sendto('', ('<broadcast>', 55777)) try: resp=s.recv(400) s.close() try: #    self.card_ip=resp.split('ip=')[1].split('\n')[0] except IndexError: #     if callback:callback(None) if callback:callback(self.card_ip) except socket.timeout: callback(None) finally: time.sleep(2) def start_listen(self,callback=None,download_callback=None,download_complete=None): """    .    """ self.listen_flag=True #  ,        thread.start_new_thread(self.listener_thread,(callback,)) #      ,    . thread.start_new_thread(self.ping_card,()) #     thread.start_new_thread(self.download_thread,(download_callback,download_complete)) def ping_card(self): #     20 . while self.listen_flag: try: resp=ping.do_one(self.card_ip) except socket.error: #          ,   pass time.sleep(20) def listener_thread(self,callback): #       sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) #      5566 sock.connect((self.card_ip, 5566)) while self.listen_flag: message=sock.recv(1024) new_files=message.split('\00') #      (   ) for x in new_files: if x: #        ;) self.all_files.append(x[1:]) # x[1:]    ">",     self.download_list.put(self.all_files[-1]) #        self.in_queue.append(self.all_files[-1]) #      ,    GUI if callback:callback(self.all_files[-1]) def download_thread(self,download_callback,download_complete): #    while self.listen_flag: if not self.download_list.empty(): #     fl=self.download_list.get(block=0) self.download_now=fl #     ,   GUI #  urllib.urlretrieve('http://%s/cgi-bin/wifi_download?fn=%s'%(self.card_ip,fl),self.home_dir+fl.split('/')[-1],download_callback if download_callback else None) if download_complete:download_complete(self.download_now) time.sleep(0.1) def find_callback(ip): if not ip:return print 'Find card on ip:',ip #   IP  ,     sd.start_listen(download_complete=download_complete) def download_complete(fname): print 'New image: %s'%(HOME_DIR+fname.split('/')[-1]) if __name__=='__main__': """   ,  .        ,  ip    """ from optparse import OptionParser parser = OptionParser() parser.add_option("-d", "--dir", dest="dir",default=None,help="directory for storing images") parser.add_option("-i", "--ip", dest="ip",default=None,help="ip address of the computer (default %s)"%(socket.gethostbyname(socket.gethostname()))) (options, args) = parser.parse_args() #       . HOME_DIR=os.path.expanduser('~') if not os.path.exists(HOME_DIR+'/'+'ShootAndView'): os.mkdir(HOME_DIR+'/'+'ShootAndView') HOME_DIR=HOME_DIR+'/ShootAndView/' if options.dir:HOME_DIR=options.dir sd=SDCard(home_dir=HOME_DIR) if options.ip:sd.ip=options.ip print 'Finding sd card...' #     sd.find_card(callback=find_callback) while 1: time.sleep(1) 




рдореИрдВ рдЖрдкрд╕реЗ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореБрдЭреЗ pep-8 рд╕реЗ рд╕рдВрднрд╛рд╡рд┐рдд рд╡рд┐рдЪрд▓рди рдХреЗ рд▓рд┐рдП рдбрд╛рдВрдЯрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рдЕрдм рдореИрдВ рдмрд╣реБрдд рдХрдо рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХрд╛ рдЕрднреНрдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЦреБрдж рд╕реЗ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: "рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ pep-8 рдирд╣реАрдВ рдкрдврд╝рддрд╛, рдореИрдВрдиреЗ pep-8 рдирд╣реАрдВ рдкрдврд╝рд╛, рд╣рд╛рдБ "ред
рдЖрдк рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб github.com/kaist/shoot-and-view рдкрд░ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ

рдореИрдВ рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЗрд╕реЗ рд╕рдордп-рд╕рдордп рдкрд░ рдкрд┐рдВрдЧ рдХрд░рдирд╛ рдЙрдЪрд┐рдд рд╣реИред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ, рдореИрдВрдиреЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдкрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХреА, рдЦрд╛рд╕рдХрд░ рдЬрдм рд╕реЗ рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдХрдВрд╕реЛрд▓ рдкрд┐рдВрдЧ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкреНрд░рд╢рд╛рд╕рдХ рдХреЗ рд╡рд┐рд╢реЗрд╖рд╛рдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рд╢реБрджреНрдз рдЕрдЬрдЧрд░ рдкрд░ рдкрд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬреАрдпреВрдЖрдИ


рдЬреАрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдЬрдЧрд░ рдореЗрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдпрд╣ рдЯрд┐рдВрдХрд░ рд╣реИред рдпрд╣ рд╡рд┐рдВрдбреЛрдЬрд╝ рдФрд░ рдореИрдХрдУрдПрд╕ рдореЗрдВ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдмрд╣реБрдд рдХрдо рдЬрдЧрд╣ рд▓реЗрддрд╛ рд╣реИред рдореИрдВ рд╢рд╛рдпрдж GUI рд▓рд┐рдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдБрдЧрд╛, рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рд┐рд░реНрдл рдПрдХ рдЫреЛрдЯреЗ рдирд┐рд░реНрджреЗрд╢ рддрдХ рд╕реАрдорд┐рдд рдХрд░реВрдБрдЧрд╛:

  1. рдЖрдпрд╛рдд рдХрд░реЗрдВ
     from Tkinter import * 

  2. рдПрдХ GUI рд▓рд┐рдЦреЗрдВ



рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЬреАрдпреВрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдЪреНрдЫрд╛рдЗрдпреЛрдВ рдХреЛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХреНрдЬрд┐рдлрд╝ рдкрдврд╝рдирд╛, рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛, рдЖрджрд┐ред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд░реЛрдд рд╕реЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдХреНрд╖рдорд╛ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд▓рд┐рдирдХреНрд╕ рдкрд░ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ), рддреЛ рдЖрдкрдХреЛ рдЬрд╝рд░реВрд░рдд рд╣реИ:
sudo apt-get install python-tk python-imagetk python-imaging libimage-exiftool-perl
рдФрд░ рднреА, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдХреЛ рдПрдХреНрд╕рдлрд╝реЛрд▓рдЯреВрд▓ ( sudo python setup.py install ) рдореЗрдВ sudo python setup.py install
рдЦрд┐рдбрд╝рдХрд┐рдпреЛрдВ рдкрд░, рдкрд╛рдпрдерди 2.7 рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдПрдХреНрд╕рдлрд╝рд┐рд▓реНрдЯреБрд▓ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреАрдЖрдИрдПрд▓ рдФрд░ рдПрдХреНрд╕рдлрд╝рд┐рд▓реНрдЯреБрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХреНрд╕рдлрд╝реЙрд▓реНрдЯреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдпрдХрд╛рд░реА рдореИрдХрдУрдПрд╕ рдкрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдКрдкрд░ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рджреЗрдЦреЗрдВред

рдореИрдХ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рдФрд░ py2app рдкрд░ py2exe рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рд╕реВрддреНрд░реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рднреА рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдо


рдЬреИрд╕рд╛ рдХрд┐ рд╡рд╛рджрд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдореИрдХрдУрдПрд╕ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдирд┐рд░реНрдорд┐рдд рд▓реЙрдЬрд╝рд┐рдПрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:


рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреА рдПрдХ рдЬреЛрдбрд╝реА:







PS рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ MacOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рдерд╛, рдХреГрдкрдпрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рдЕрдЬрдЧрд░ рдорд╢реАрди рдкрд░)

рдпрд╣ рд▓реЗрдЦ рдХреНрд░рд┐рдПрдЯрд┐рд╡ рдХреЙрдордиреНрд╕ рдПрдЯреНрд░рд┐рдмреНрдпреВрд╢рди 3.0 рдЕрдирдкреЛрд░реНрдЯреЗрдб (CC рдмрд╛рдп 3.0) рдХреЗ рддрд╣рдд рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реИ

Source: https://habr.com/ru/post/In216039/


All Articles