From d55946a895e7eebdaa3f91edd21cd9781bffc9b9 Mon Sep 17 00:00:00 2001 From: stephanb15 Date: Sun, 1 Sep 2019 19:47:25 +0200 Subject: [PATCH] changed file path eto be managed by >import os< libary so errors >file not found< wont occure anymore --- Source/2019-09-01-013917_800x480_scrot.png | Bin 0 -> 92623 bytes Source/BasicControls.py | 856 +++++++++++---------- Source/PiCameraApp.py | 29 +- Source/Tooltip.py | 7 +- 4 files changed, 450 insertions(+), 442 deletions(-) create mode 100644 Source/2019-09-01-013917_800x480_scrot.png mode change 100644 => 100755 Source/PiCameraApp.py diff --git a/Source/2019-09-01-013917_800x480_scrot.png b/Source/2019-09-01-013917_800x480_scrot.png new file mode 100644 index 0000000000000000000000000000000000000000..4f23ef1c269f9f7016bf6981cec55d38605c0095 GIT binary patch literal 92623 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�yjtnYp91ORzT(s&UWW2ap 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', - self.FixedResolutionChanged) - self.FixedResolutionsCombo.grid(row=0,column=1,columnspan=3,sticky='W') - ToolTip(self.FixedResolutionsCombo,121) - #------------ Capture Width and Height ---------------- - # OrderedDict is used to ensure the keys stay in the same order as - # entered. I want the combobox to display in this order - #### TODO: Must check resolution and framerate and disable the Video - # button if we exceed limits of the modes - # Framerate 1-30 fps up to 1920x1080 16:9 aspect ratio - # Framerate 1-15 fps up to 2592 x 1944 4:3 aspect ratio - # Framerate 0.1666 to 1 fps up to 2592 x 1944 4:3 aspect ratio - # Framerate 1-42 fps up t0 1296 x 972 4:3 aspect ratio - # Framerate 1-49 fps up to 1296 x 730 16:9 aspect ratio - # Framerate 42.1 - 60 fps to 640 x 480 4:3 aspect ratio - # Framerate 60.1 - 90 fps to 640 x 480 4:3 aspect ratio - self.StandardResolutions = OrderedDict([ \ - ('CGA', (320,200)), ('QVGA', (320,240)), - ('VGA', (640,480)), ('PAL', (768,576)), - ('480p', (720,480)), ('576p', (720,576)), - ('WVGA', (800,480)), ('SVGA', (800,600)), - ('FWVGA', (854,480)), ('WSVGA', (1024,600)), - ('XGA', (1024,768)), ('HD 720', (1280,720)), - ('WXGA_1', (1280,768)), ('WXGA_2', (1280,800)), - ('SXGA', (1280,1024)), ('SXGA+', (1400,1050)), - ('UXGA', (1600,1200)), ('WSXGA+', (1680,1050)), - ('HD 1080', (1920,1080)), ('WUXGA', (1920,1200)), - ('2K', (2048,1080)), ('QXGA', (2048, 1536)), - ('WQXGA', (2560,1600)), ('MAX Resolution', (2592,1944)), - ]) - vals = [] - for key in self.StandardResolutions.keys(): - vals.append('%s: (%dx%d)' % (key, # Tabs not working?!! - self.StandardResolutions[key][0], - self.StandardResolutions[key][1])) - self.FixedResolutionsCombo['values'] = vals - self.FixedResolutionsCombo.current(10) + #--------------- Picture/Video Capture Size --------------- + f = MyLabelFrame(self,'Picture/Video capture size in pixels',1,0) + #f.columnconfigure(0,weight=1) + f1 = ttk.Frame(f) # Sub frames to frame f + f1.grid(row=1,column=0,sticky='NSEW') + f1.columnconfigure(1,weight=1) + self.UseFixedResolutions = BooleanVar() + self.UseFixedResolutions.set(True) + self.UseFixedResRadio = ttk.Radiobutton(f1,text='Use fixed:', + variable=self.UseFixedResolutions, + value=True,command=self.UseFixedResRadios,padding=(5,5,5,5)) + ToolTip(self.UseFixedResRadio,120) + self.UseFixedResRadio.grid(row=0,column=0,sticky='NW') + self.FixedResolutionsCombo = Combobox(f1,state='readonly',width=25) + self.FixedResolutionsCombo.bind('<>', + self.FixedResolutionChanged) + self.FixedResolutionsCombo.grid(row=0,column=1,columnspan=3,sticky='W') + ToolTip(self.FixedResolutionsCombo,121) + #------------ Capture Width and Height ---------------- + # OrderedDict is used to ensure the keys stay in the same order as + # entered. I want the combobox to display in this order + #### TODO: Must check resolution and framerate and disable the Video + # button if we exceed limits of the modes + # Framerate 1-30 fps up to 1920x1080 16:9 aspect ratio + # Framerate 1-15 fps up to 2592 x 1944 4:3 aspect ratio + # Framerate 0.1666 to 1 fps up to 2592 x 1944 4:3 aspect ratio + # Framerate 1-42 fps up t0 1296 x 972 4:3 aspect ratio + # Framerate 1-49 fps up to 1296 x 730 16:9 aspect ratio + # Framerate 42.1 - 60 fps to 640 x 480 4:3 aspect ratio + # Framerate 60.1 - 90 fps to 640 x 480 4:3 aspect ratio + self.StandardResolutions = OrderedDict([ \ + ('CGA', (320,200)), ('QVGA', (320,240)), + ('VGA', (640,480)), ('PAL', (768,576)), + ('480p', (720,480)), ('576p', (720,576)), + ('WVGA', (800,480)), ('SVGA', (800,600)), + ('FWVGA', (854,480)), ('WSVGA', (1024,600)), + ('XGA', (1024,768)), ('HD 720', (1280,720)), + ('WXGA_1', (1280,768)), ('WXGA_2', (1280,800)), + ('SXGA', (1280,1024)), ('SXGA+', (1400,1050)), + ('UXGA', (1600,1200)), ('WSXGA+', (1680,1050)), + ('HD 1080', (1920,1080)), ('WUXGA', (1920,1200)), + ('2K', (2048,1080)), ('QXGA', (2048, 1536)), + ('WQXGA', (2560,1600)), ('MAX Resolution', (2592,1944)), + ]) + vals = [] + for key in self.StandardResolutions.keys(): + vals.append('%s: (%dx%d)' % (key, # Tabs not working?!! + self.StandardResolutions[key][0], + self.StandardResolutions[key][1])) + self.FixedResolutionsCombo['values'] = vals + self.FixedResolutionsCombo.current(10) - f2 = ttk.Frame(f) # subframe to frame f - f2.grid(row=2,column=0,sticky='NSEW') - f2.columnconfigure(2,weight=1) - f2.columnconfigure(4,weight=1) - b2 = ttk.Radiobutton(f2,text='Roll your own:', - variable=self.UseFixedResolutions, - value=False,command=self.UseFixedResRadios,padding=(5,5,5,5)) - b2.grid(row=1,column=0,sticky='NW') - ToolTip(b2,122) + f2 = ttk.Frame(f) # subframe to frame f + f2.grid(row=2,column=0,sticky='NSEW') + f2.columnconfigure(2,weight=1) + f2.columnconfigure(4,weight=1) + b2 = ttk.Radiobutton(f2,text='Roll your own:', + variable=self.UseFixedResolutions, + value=False,command=self.UseFixedResRadios,padding=(5,5,5,5)) + b2.grid(row=1,column=0,sticky='NW') + ToolTip(b2,122) - Label(f2,text="Width:",anchor=E).grid(column=1,row=1,sticky='E',ipadx=3,ipady=3) - Widths = [] - for i in range(1,82): - Widths.append(32 * i) # Widths can be in 32 byte increments - self.cb = MyComboBox ( f2, Widths, current=10, - callback=self.ResolutionChanged, width=5, row=1, col=2, - sticky='W', state='disabled', tip=123) + Label(f2,text="Width:",anchor=E).grid(column=1,row=1,sticky='E',ipadx=3,ipady=3) + Widths = [] + for i in range(1,82): + Widths.append(32 * i) # Widths can be in 32 byte increments + self.cb = MyComboBox ( f2, Widths, current=10, + callback=self.ResolutionChanged, width=5, row=1, col=2, + sticky='W', state='disabled', tip=123) - Label(f2,text="Height:",anchor=E).grid(column=3,row=1,sticky='W',ipadx=5,ipady=3) - Heights = [] - for i in range(1,123): - Heights.append(16 * i) # heights in 16 byte increments - self.cb1 = MyComboBox ( f2, Heights, current=10, - callback=self.ResolutionChanged, width=5, row=1, col=4, - sticky='W', state='disabled', tip=124) + Label(f2,text="Height:",anchor=E).grid(column=3,row=1,sticky='W',ipadx=5,ipady=3) + Heights = [] + for i in range(1,123): + Heights.append(16 * i) # heights in 16 byte increments + self.cb1 = MyComboBox ( f2, Heights, current=10, + callback=self.ResolutionChanged, width=5, row=1, col=4, + sticky='W', state='disabled', tip=124) - ttk.Label(f2,text='Actual:').grid(row=2,column=1,sticky='E') - self.WidthLabel = ttk.Label(f2,style='DataLabel.TLabel') - self.WidthLabel.grid(row=2,column=2,sticky='W') - ToolTip(self.WidthLabel,125) - ttk.Label(f2,text='Actual:').grid(row=2,column=3,sticky='E') - self.HeightLabel = ttk.Label(f2,style='DataLabel.TLabel') - self.HeightLabel.grid(row=2,column=4,sticky='W') - ToolTip(self.HeightLabel,126) + ttk.Label(f2,text='Actual:').grid(row=2,column=1,sticky='E') + self.WidthLabel = ttk.Label(f2,style='DataLabel.TLabel') + self.WidthLabel.grid(row=2,column=2,sticky='W') + ToolTip(self.WidthLabel,125) + ttk.Label(f2,text='Actual:').grid(row=2,column=3,sticky='E') + self.HeightLabel = ttk.Label(f2,style='DataLabel.TLabel') + self.HeightLabel.grid(row=2,column=4,sticky='W') + ToolTip(self.HeightLabel,126) - Separator(f,orient=HORIZONTAL).grid(pady=5,row=3,column=0, - columnspan=4,sticky='EW') + Separator(f,orient=HORIZONTAL).grid(pady=5,row=3,column=0, + columnspan=4,sticky='EW') - #--------------- Zoom Region Before ---------------- - f4 = MyLabelFrame(f,'Zoom region of interest before taking '+ - 'picture/video',4,0) - #f4.columnconfigure(1,weight=1) - #f4.columnconfigure(3,weight=1) - Label(f4,text='X:').grid(row=0,column=0,sticky='E') - self.Xzoom = ttk.Scale(f4,from_=0.0,to=0.94,orient='horizontal') - self.Xzoom.grid(row=0,column=1,sticky='W',padx=5,pady=3) - self.Xzoom.set(0.0) - ToolTip(self.Xzoom,130) - Label(f4,text='Y:').grid(row=0,column=2,sticky='E') - self.Yzoom = ttk.Scale(f4,from_=0.0,to=0.94,orient='horizontal') - self.Yzoom.grid(row=0,column=3,sticky='W',padx=5,pady=3) - self.Yzoom.set(0.0) - ToolTip(self.Yzoom,131) - Label(f4,text='Width:').grid(row=1,column=0,sticky='E') - self.Widthzoom = ttk.Scale(f4,from_=0.05,to=1.0,orient='horizontal') - self.Widthzoom.grid(row=1,column=1,sticky='W',padx=5,pady=3) - self.Widthzoom.set(1.0) - ToolTip(self.Widthzoom,132) - Label(f4,text='Height:').grid(row=1,column=2,sticky='E') - self.Heightzoom = ttk.Scale(f4,from_=0.05,to=1.0,orient='horizontal') - self.Heightzoom.grid(row=1,column=3,sticky='W',padx=5,pady=3) - self.Heightzoom.set(1.0) - ToolTip(self.Heightzoom,133) - # WLW THIS IS A PROBLEM - image = PIL.Image.open('Assets/reset.png') #.resize((16,16)) - self.resetImage = GetPhotoImage(image.resize((16,16))) - self.ResetZoomButton = ttk.Button(f4,image=self.resetImage, - command=self.ZoomReset) - self.ResetZoomButton.grid(row=0,column=4,rowspan=2,sticky='W') - ToolTip(self.ResetZoomButton,134) + #--------------- Zoom Region Before ---------------- + f4 = MyLabelFrame(f,'Zoom region of interest before taking '+ + 'picture/video',4,0) + #f4.columnconfigure(1,weight=1) + #f4.columnconfigure(3,weight=1) + Label(f4,text='X:').grid(row=0,column=0,sticky='E') + self.Xzoom = ttk.Scale(f4,from_=0.0,to=0.94,orient='horizontal') + self.Xzoom.grid(row=0,column=1,sticky='W',padx=5,pady=3) + self.Xzoom.set(0.0) + ToolTip(self.Xzoom,130) + Label(f4,text='Y:').grid(row=0,column=2,sticky='E') + self.Yzoom = ttk.Scale(f4,from_=0.0,to=0.94,orient='horizontal') + self.Yzoom.grid(row=0,column=3,sticky='W',padx=5,pady=3) + self.Yzoom.set(0.0) + ToolTip(self.Yzoom,131) + Label(f4,text='Width:').grid(row=1,column=0,sticky='E') + self.Widthzoom = ttk.Scale(f4,from_=0.05,to=1.0,orient='horizontal') + self.Widthzoom.grid(row=1,column=1,sticky='W',padx=5,pady=3) + self.Widthzoom.set(1.0) + ToolTip(self.Widthzoom,132) + Label(f4,text='Height:').grid(row=1,column=2,sticky='E') + self.Heightzoom = ttk.Scale(f4,from_=0.05,to=1.0,orient='horizontal') + self.Heightzoom.grid(row=1,column=3,sticky='W',padx=5,pady=3) + self.Heightzoom.set(1.0) + ToolTip(self.Heightzoom,133) + # WLW THIS IS A PROBLEM + image = PIL.Image.open(os.path.join(wrkdir,"Assets","reset.png")) #.resize((16,16)) + self.resetImage = GetPhotoImage(image.resize((16,16))) + self.ResetZoomButton = ttk.Button(f4,image=self.resetImage, + command=self.ZoomReset) + self.ResetZoomButton.grid(row=0,column=4,rowspan=2,sticky='W') + ToolTip(self.ResetZoomButton,134) - self.Xzoom.config(command=lambda newval, - widget=self.Xzoom:self.Zoom(newval,widget)) - self.Yzoom.config(command=lambda newval, - widget=self.Yzoom:self.Zoom(newval,widget)) - self.Widthzoom.config(command=lambda newval, - widget=self.Widthzoom:self.Zoom(newval,widget)) - self.Heightzoom.config(command=lambda newval, - widget=self.Heightzoom:self.Zoom(newval,widget)) + self.Xzoom.config(command=lambda newval, + widget=self.Xzoom:self.Zoom(newval,widget)) + self.Yzoom.config(command=lambda newval, + widget=self.Yzoom:self.Zoom(newval,widget)) + self.Widthzoom.config(command=lambda newval, + widget=self.Widthzoom:self.Zoom(newval,widget)) + self.Heightzoom.config(command=lambda newval, + widget=self.Heightzoom:self.Zoom(newval,widget)) - Separator(f,orient=HORIZONTAL).grid(pady=5,row=5,column=0, - columnspan=3,sticky='EW') + Separator(f,orient=HORIZONTAL).grid(pady=5,row=5,column=0, + columnspan=3,sticky='EW') - #--------------- Resize Image After ---------------- - f4 = MyLabelFrame(f,'Resize image after taking picture/video',6,0) - #f4.columnconfigure(3,weight=1) - #f4.columnconfigure(5,weight=1) + #--------------- Resize Image After ---------------- + f4 = MyLabelFrame(f,'Resize image after taking picture/video',6,0) + #f4.columnconfigure(3,weight=1) + #f4.columnconfigure(5,weight=1) - b = MyBooleanVar(False) - self.ResizeAfterNone = MyRadio(f4,'None (Default)',False,b, - self.AllowImageResizeAfter,0,0,'W',pad=(0,5,0,5), tip=140) - MyRadio(f4,'Resize',True,b,self.AllowImageResizeAfter, - 0,1,'W',pad=(5,5,0,5),tip=141) + b = MyBooleanVar(False) + self.ResizeAfterNone = MyRadio(f4,'None (Default)',False,b, + self.AllowImageResizeAfter,0,0,'W',pad=(0,5,0,5), tip=140) + MyRadio(f4,'Resize',True,b,self.AllowImageResizeAfter, + 0,1,'W',pad=(5,5,0,5),tip=141) - Label(f4,text="Width:",anchor=E).grid(column=2,row=0,sticky='E',ipadx=3,ipady=3) - self.resizeWidthAfterCombo = MyComboBox ( f4, Widths, current=10, - callback=self.ResizeAfterChanged, width=5, row=0, col=3, - sticky='W', state='disabled', tip=142) + Label(f4,text="Width:",anchor=E).grid(column=2,row=0,sticky='E',ipadx=3,ipady=3) + self.resizeWidthAfterCombo = MyComboBox ( f4, Widths, current=10, + callback=self.ResizeAfterChanged, width=5, row=0, col=3, + sticky='W', state='disabled', tip=142) - Label(f4,text="Height:",anchor=E).grid(column=4,row=0,sticky='W',ipadx=5,ipady=3) - self.resizeHeightAfterCombo = MyComboBox ( f4, Heights, current=10, - callback=self.ResizeAfterChanged, width=5, row=0, col=5, - sticky='W', state='disabled', tip=143) + Label(f4,text="Height:",anchor=E).grid(column=4,row=0,sticky='W',ipadx=5,ipady=3) + self.resizeHeightAfterCombo = MyComboBox ( f4, Heights, current=10, + callback=self.ResizeAfterChanged, width=5, row=0, col=5, + sticky='W', state='disabled', tip=143) - self.resizeAfter = None + self.resizeAfter = None - #--------------- Quick Adjustments ---------------- - f = MyLabelFrame(self,'Quick adjustments',2,0) - #f.columnconfigure(2,weight=1) - #-Brightness - self.brightLabel, self.brightness, val = \ - self.SetupLabelCombo(f,'Brightness:',0,0,0, 100, - self.CameraBrightnessChanged, self.camera.brightness ) - self.CameraBrightnessChanged(val) - ToolTip(self.brightness,msg=150) - #-Contrast - self.contrastLabel, self.contrast, val = \ - self.SetupLabelCombo(f,'Contrast:',0,3,-100, 100, - self.ContrastChanged, self.camera.contrast ) - self.ContrastChanged(val) - ToolTip(self.contrast,msg=151) - #-Saturation - self.saturationLabel, self.saturation, val = \ - self.SetupLabelCombo(f,'Saturation:',1,0,-100, 100, - self.SaturationChanged, self.camera.saturation, label='Sat' ) - self.SaturationChanged(val) - ToolTip(self.saturation,msg=152) - #-Sharpness - self.sharpnessLabel, self.sharpness, val = \ - self.SetupLabelCombo(f,'Sharpness:',1,3,-100, 100, - self.SharpnessChanged, self.camera.sharpness ) - self.SharpnessChanged(val) - ToolTip(self.sharpness,msg=153) - #-Reset - #self.ResetGeneralButton = Button(f,image=self.resetImage,width=5, - #command=self.ResetGeneralSliders) - #self.ResetGeneralButton.grid(row=4,column=2,sticky='W',padx=5) - #ToolTip(self.ResetGeneralButton,msg=154) + #--------------- Quick Adjustments ---------------- + f = MyLabelFrame(self,'Quick adjustments',2,0) + #f.columnconfigure(2,weight=1) + #-Brightness + self.brightLabel, self.brightness, val = \ + self.SetupLabelCombo(f,'Brightness:',0,0,0, 100, + self.CameraBrightnessChanged, self.camera.brightness ) + self.CameraBrightnessChanged(val) + ToolTip(self.brightness,msg=150) + #-Contrast + self.contrastLabel, self.contrast, val = \ + self.SetupLabelCombo(f,'Contrast:',0,3,-100, 100, + self.ContrastChanged, self.camera.contrast ) + self.ContrastChanged(val) + ToolTip(self.contrast,msg=151) + #-Saturation + self.saturationLabel, self.saturation, val = \ + self.SetupLabelCombo(f,'Saturation:',1,0,-100, 100, + self.SaturationChanged, self.camera.saturation, label='Sat' ) + self.SaturationChanged(val) + ToolTip(self.saturation,msg=152) + #-Sharpness + self.sharpnessLabel, self.sharpness, val = \ + self.SetupLabelCombo(f,'Sharpness:',1,3,-100, 100, + self.SharpnessChanged, self.camera.sharpness ) + self.SharpnessChanged(val) + ToolTip(self.sharpness,msg=153) + #-Reset + #self.ResetGeneralButton = Button(f,image=self.resetImage,width=5, + #command=self.ResetGeneralSliders) + #self.ResetGeneralButton.grid(row=4,column=2,sticky='W',padx=5) + #ToolTip(self.ResetGeneralButton,msg=154) - #--------------- Image Effects ---------------- - f = MyLabelFrame(self,'Preprogrammed image effects',3,0) - #f.columnconfigure(2,weight=1) + #--------------- Image Effects ---------------- + f = MyLabelFrame(self,'Preprogrammed image effects',3,0) + #f.columnconfigure(2,weight=1) - v = MyBooleanVar(False) - self.NoEffectsRadio = MyRadio(f,'None (Default)',False,v, - self.EffectsChecked,0,0,'W',tip=160) - MyRadio(f,'Select effect:',True,v,self.EffectsChecked,0,1,'W', - tip=161) + v = MyBooleanVar(False) + self.NoEffectsRadio = MyRadio(f,'None (Default)',False,v, + self.EffectsChecked,0,0,'W',tip=160) + MyRadio(f,'Select effect:',True,v,self.EffectsChecked,0,1,'W', + tip=161) - self.effects = Combobox(f,height=15,width=10,state='readonly')#,width=15) - self.effects.grid(row=0,column=2,sticky='W') - effects = list(self.camera.IMAGE_EFFECTS.keys()) # python 3 workaround - effects.remove('none') - effects.sort() #cmp=lambda x,y: cmp(x.lower(),y.lower())) # not python 3 - self.effects['values'] = effects - self.effects.current(0) - self.effects.bind('<>',self.EffectsChanged) - ToolTip(self.effects, msg=162) + self.effects = Combobox(f,height=15,width=10,state='readonly')#,width=15) + self.effects.grid(row=0,column=2,sticky='W') + effects = list(self.camera.IMAGE_EFFECTS.keys()) # python 3 workaround + effects.remove('none') + effects.sort() #cmp=lambda x,y: cmp(x.lower(),y.lower())) # not python 3 + self.effects['values'] = effects + self.effects.current(0) + self.effects.bind('<>',self.EffectsChanged) + ToolTip(self.effects, msg=162) - self.ModParams = ttk.Button(f,text='Params...', - command=self.ModifyEffectsParamsPressed,underline=0,padding=(5,3,5,3),width=8) - self.ModParams.grid(row=0,column=3,sticky=EW,padx=5) - ToolTip(self.ModParams, msg=163) - self.EffectsChecked(False) - ''' - Add additional controls if JPG is selected - Certain file formats accept additional options which can be specified as keyword - arguments. Currently, only the 'jpeg' encoder accepts additional options, which are: + self.ModParams = ttk.Button(f,text='Params...', + command=self.ModifyEffectsParamsPressed,underline=0,padding=(5,3,5,3),width=8) + self.ModParams.grid(row=0,column=3,sticky=EW,padx=5) + ToolTip(self.ModParams, msg=163) + self.EffectsChecked(False) + ''' + Add additional controls if JPG is selected + Certain file formats accept additional options which can be specified as keyword + arguments. Currently, only the 'jpeg' encoder accepts additional options, which are: - quality - Defines the quality of the JPEG encoder as an integer ranging from 1 to 100. - Defaults to 85. Please note that JPEG quality is not a percentage and - definitions of quality vary widely. - restart - Defines the restart interval for the JPEG encoder as a number of JPEG MCUs. - The actual restart interval used will be a multiple of the number of MCUs per row in the resulting image. - thumbnail - Defines the size and quality of the thumbnail to embed in the Exif - metadata. Specifying None disables thumbnail generation. Otherwise, - specify a tuple of (width, height, quality). Defaults to (64, 48, 35). - bayer - If True, the raw bayer data from the camera’s sensor is included in the - Exif metadata. - ''' - #--------------- Flash Mode --------------- - f = MyLabelFrame(self,'LED and Flash mode',4,0,span=4) - #f.columnconfigure(3,weight=1) - self.LedOn = MyBooleanVar(True) - self.LedButton = ttk.Checkbutton(f,text='Led On (via GPIO pins)', - variable=self.LedOn, command=self.LedOnChecked) - self.LedButton.grid(row=0,column=0,sticky='NW',pady=5, columnspan=2) - ToolTip(self.LedButton,msg=102) - Label(f,text='Flash Mode:').grid(row=1,column=0,sticky='W') - b = MyStringVar('off') - self.FlashModeOffRadio = MyRadio(f,'Off (Default)','off',b, - self.FlashModeButton,1,1,'W',tip=180) - MyRadio(f,'Auto','auto',b,self.FlashModeButton,1,2,'W',tip=181) - MyRadio(f,'Select:','set',b,self.FlashModeButton,1,3,'W',tip=182) - # Use invoke() on radio button to force a command - self.FlashModeCombo = Combobox(f,state='readonly',width=10) - self.FlashModeCombo.grid(row=1,column=4,sticky='W') - self.FlashModeCombo.bind('<>',self.FlashModeChanged) - modes = list(self.camera.FLASH_MODES.keys()) - modes.remove('off') # these two are handled by radio buttons - modes.remove('auto') - modes.sort() #cmp=lambda x,y: cmp(x.lower(),y.lower())) - self.FlashModeCombo['values'] = modes - self.FlashModeCombo.current(0) - self.FlashModeCombo.config(state='disabled') - ToolTip(self.FlashModeCombo,183) + quality - Defines the quality of the JPEG encoder as an integer ranging from 1 to 100. + Defaults to 85. Please note that JPEG quality is not a percentage and + definitions of quality vary widely. + restart - Defines the restart interval for the JPEG encoder as a number of JPEG MCUs. + The actual restart interval used will be a multiple of the number of MCUs per row in the resulting image. + thumbnail - Defines the size and quality of the thumbnail to embed in the Exif + metadata. Specifying None disables thumbnail generation. Otherwise, + specify a tuple of (width, height, quality). Defaults to (64, 48, 35). + bayer - If True, the raw bayer data from the camera’s sensor is included in the + Exif metadata. + ''' + #--------------- Flash Mode --------------- + f = MyLabelFrame(self,'LED and Flash mode',4,0,span=4) + #f.columnconfigure(3,weight=1) + self.LedOn = MyBooleanVar(True) + self.LedButton = ttk.Checkbutton(f,text='Led On (via GPIO pins)', + variable=self.LedOn, command=self.LedOnChecked) + self.LedButton.grid(row=0,column=0,sticky='NW',pady=5, columnspan=2) + ToolTip(self.LedButton,msg=102) + Label(f,text='Flash Mode:').grid(row=1,column=0,sticky='W') + b = MyStringVar('off') + self.FlashModeOffRadio = MyRadio(f,'Off (Default)','off',b, + self.FlashModeButton,1,1,'W',tip=180) + MyRadio(f,'Auto','auto',b,self.FlashModeButton,1,2,'W',tip=181) + MyRadio(f,'Select:','set',b,self.FlashModeButton,1,3,'W',tip=182) + # Use invoke() on radio button to force a command + self.FlashModeCombo = Combobox(f,state='readonly',width=10) + self.FlashModeCombo.grid(row=1,column=4,sticky='W') + self.FlashModeCombo.bind('<>',self.FlashModeChanged) + modes = list(self.camera.FLASH_MODES.keys()) + modes.remove('off') # these two are handled by radio buttons + modes.remove('auto') + modes.sort() #cmp=lambda x,y: cmp(x.lower(),y.lower())) + self.FlashModeCombo['values'] = modes + self.FlashModeCombo.current(0) + self.FlashModeCombo.config(state='disabled') + ToolTip(self.FlashModeCombo,183) - self.FixedResolutionChanged(None) + self.FixedResolutionChanged(None) - def Reset ( self ): - # Use widget.invoke() to simulate a button/radiobutton press - self.UseRadio.invoke() - self.LedOn.set(True) - self.VideoStab.set(False) # Doesn't call the function! - self.VideoDenoise.set(True) - self.ImageDenoise.set(True) - self.ResetGeneralSliders() - self.UseFixedResRadio.invoke() - self.FixedResolutionsCombo.current(10) # Set to 1280 x 1024 - self.ResetZoomButton.invoke() - self.ResizeAfterNone.invoke() - self.NoEffectsRadio.invoke() - self.effects.current(0) - self.UseRadio.focus_set() - self.FlashModeOffRadio.invoke() - def UseVideoPort ( self , val): - pass #self.camera.use_video_port = val - def LedOnChecked ( self ): - self.camera.led = self.LedOn.get() - def SetupLabelCombo ( self, parent, textname, rownum, colnum, - minto, maxto, callback, cameraVal, label=''): - l = Label(parent,text=textname) - l.grid(row=rownum,column=colnum*3,sticky='E',pady=2)#,padx=2) - label = Label(parent,width=4,anchor=E)#,relief=SUNKEN, background='#f0f0ff') - label.grid(row=rownum,column=colnum*3+1) - #label.config(font=('Helvetica',12)) - # create the scale WITHOUT a callback. Then set the scale. - scale = ttk.Scale(parent,from_=minto,to=maxto,orient='horizontal') - scale.grid(row=rownum,column=colnum*3+2,sticky='W',padx=5,pady=3) - val = cameraVal - scale.set(val) # this would attempt to call any callback - scale.config(command=callback) # now supply the callback - return label, scale, val - def UpdateMe( self, newVal, label ): - val = int(float(newVal)) - label.config(text='%d' % val, - foreground='red' if val < 0 else 'blue' if val > 0 else 'black' ) - return val - def CameraBrightnessChanged ( self, newVal ): - self.brightness.focus_set() - self.camera.brightness = self.UpdateMe(newVal,self.brightLabel) - def ContrastChanged ( self, newVal ): - self.contrast.focus_set() - self.camera.contrast = self.UpdateMe(newVal,self.contrastLabel) - def SaturationChanged ( self, newVal ): - self.saturation.focus_set() - self.camera.saturation = self.UpdateMe(newVal,self.saturationLabel) - def SharpnessChanged ( self, newVal ): - self.sharpness.focus_set() - self.camera.sharpness = self.UpdateMe(newVal,self.sharpnessLabel) - def ResetGeneralSliders ( self ): - self.brightness.set(50) - self.contrast.set(0) - self.saturation.set(0) - self.sharpness.set(0) - #self.ResetGeneralButton.focus_set() - def UpdateWidthHeightLabels ( self ): - res = self.camera.resolution # in case a different default value - self.WidthLabel.config(text='%d' % int(res[0])) - self.HeightLabel.config(text='%d' % int(res[1])) - def ResolutionChanged(self,event): - self.camera.resolution = (int(self.cb.get()),int(self.cb1.get())) - self.UpdateWidthHeightLabels() - def FixedResolutionChanged ( self, event ): - key = self.FixedResolutionsCombo.get().split(':')[0] - self.camera.resolution = self.StandardResolutions[key] - self.UpdateWidthHeightLabels() - def UseFixedResRadios ( self ): - states = {False:'disabled', True:'readonly'} - useFixedRes = self.UseFixedResolutions.get() - if useFixedRes: - self.FixedResolutionChanged(None) - self.FixedResolutionsCombo.focus_set() - else: - self.ResolutionChanged(None) - self.cb.focus_set() - self.FixedResolutionsCombo.config(state=states[useFixedRes]) - self.cb.config(state=states[not useFixedRes]) - self.cb1.config(state=states[not useFixedRes]) - def Zoom ( self, newVal, scale ): - self.camera.zoom = (float(self.Xzoom.get()),float(self.Yzoom.get()), - float(self.Widthzoom.get()),float(self.Heightzoom.get())) - scale.focus_set() - def SetZoom ( self, x, y, w, h ): - self.Xzoom.set(x) - self.Yzoom.set(y) - self.Widthzoom.set(w) - self.Heightzoom.set(h) - def ZoomReset ( self ): - self.Xzoom.set(0.0) - self.Yzoom.set(0.0) - self.Widthzoom.set(1.0) - self.Heightzoom.set(1.0) - def AllowImageResizeAfter ( self, allowResizeAfter ): - if allowResizeAfter: - state = 'readonly' - self.ResizeAfterChanged(None) - self.resizeWidthAfterCombo.focus_set() - else: - self.resizeAfter = None - state = 'disabled' - self.resizeWidthAfterCombo.config(state=state) - self.resizeHeightAfterCombo.config(state=state) - def ResizeAfterChanged ( self, event ): - self.resizeAfter = ( int(self.resizeWidthAfterCombo.get()), - int(self.resizeHeightAfterCombo.get()) ) - def GetResizeAfter ( self ): - return self.resizeAfter - def EffectsChecked ( self, EffectsEnabled ): - if EffectsEnabled == True: - self.effects.config(state='readonly') - self.EffectsChanged(None) - self.effects.focus_set() - else: - self.effects.config(state='disabled') - self.ModParams.config(state='disabled') - self.camera.image_effect = 'none' - def EffectsChanged ( self, event ): - self.camera.image_effect = self.effects.get() - if self.camera.image_effect in ['solarize', 'colorpoint', - 'colorbalance', 'colorswap', 'posterise', 'blur', 'film', - 'watercolor']: - self.ModParams.config(state='!disabled') - params = Effects1Page.EffectParam[self.camera.image_effect] - if params != -1: # We have something to program - self.camera.image_effect_params = \ - Effects1Page.EffectParam[self.camera.image_effect] - else: - self.ModParams.config(state='disabled') - def ModifyEffectsParamsPressed ( self ): - ImageEffectsDialog(self,title='Image Effects Parameters', - camera=self.camera,okonly=False) - def ImageDenoiseChecked ( self ): - self.camera.image_denoise = self.ImageDenoise.get() - def VideoDenoiseChecked ( self ): - self.camera.video_denoise = self.VideoDenoise.get() - def VideoStabChecked ( self ): - self.camera.video_stabilization = self.VideoStab.get() - def FlashModeButton ( self, FlashMode ): - if FlashMode == 'set': - self.FlashModeCombo.config(state='readonly') - self.FlashModeCombo.focus_set() - self.FlashModeChanged(None) - else: - self.FlashModeCombo.config(state='disabled') - self.camera.flash_mode = FlashMode - def FlashModeChanged ( self, event ): - self.camera.flash_mode = self.FlashModeCombo.get() + def Reset ( self ): + # Use widget.invoke() to simulate a button/radiobutton press + self.UseRadio.invoke() + self.LedOn.set(True) + self.VideoStab.set(False) # Doesn't call the function! + self.VideoDenoise.set(True) + self.ImageDenoise.set(True) + self.ResetGeneralSliders() + self.UseFixedResRadio.invoke() + self.FixedResolutionsCombo.current(10) # Set to 1280 x 1024 + self.ResetZoomButton.invoke() + self.ResizeAfterNone.invoke() + self.NoEffectsRadio.invoke() + self.effects.current(0) + self.UseRadio.focus_set() + self.FlashModeOffRadio.invoke() + def UseVideoPort ( self , val): + pass #self.camera.use_video_port = val + def LedOnChecked ( self ): + self.camera.led = self.LedOn.get() + def SetupLabelCombo ( self, parent, textname, rownum, colnum, + minto, maxto, callback, cameraVal, label=''): + l = Label(parent,text=textname) + l.grid(row=rownum,column=colnum*3,sticky='E',pady=2)#,padx=2) + label = Label(parent,width=4,anchor=E)#,relief=SUNKEN, background='#f0f0ff') + label.grid(row=rownum,column=colnum*3+1) + #label.config(font=('Helvetica',12)) + # create the scale WITHOUT a callback. Then set the scale. + scale = ttk.Scale(parent,from_=minto,to=maxto,orient='horizontal') + scale.grid(row=rownum,column=colnum*3+2,sticky='W',padx=5,pady=3) + val = cameraVal + scale.set(val) # this would attempt to call any callback + scale.config(command=callback) # now supply the callback + return label, scale, val + def UpdateMe( self, newVal, label ): + val = int(float(newVal)) + label.config(text='%d' % val, + foreground='red' if val < 0 else 'blue' if val > 0 else 'black' ) + return val + def CameraBrightnessChanged ( self, newVal ): + self.brightness.focus_set() + self.camera.brightness = self.UpdateMe(newVal,self.brightLabel) + def ContrastChanged ( self, newVal ): + self.contrast.focus_set() + self.camera.contrast = self.UpdateMe(newVal,self.contrastLabel) + def SaturationChanged ( self, newVal ): + self.saturation.focus_set() + self.camera.saturation = self.UpdateMe(newVal,self.saturationLabel) + def SharpnessChanged ( self, newVal ): + self.sharpness.focus_set() + self.camera.sharpness = self.UpdateMe(newVal,self.sharpnessLabel) + def ResetGeneralSliders ( self ): + self.brightness.set(50) + self.contrast.set(0) + self.saturation.set(0) + self.sharpness.set(0) + #self.ResetGeneralButton.focus_set() + def UpdateWidthHeightLabels ( self ): + res = self.camera.resolution # in case a different default value + self.WidthLabel.config(text='%d' % int(res[0])) + self.HeightLabel.config(text='%d' % int(res[1])) + def ResolutionChanged(self,event): + self.camera.resolution = (int(self.cb.get()),int(self.cb1.get())) + self.UpdateWidthHeightLabels() + def FixedResolutionChanged ( self, event ): + key = self.FixedResolutionsCombo.get().split(':')[0] + self.camera.resolution = self.StandardResolutions[key] + self.UpdateWidthHeightLabels() + def UseFixedResRadios ( self ): + states = {False:'disabled', True:'readonly'} + useFixedRes = self.UseFixedResolutions.get() + if useFixedRes: + self.FixedResolutionChanged(None) + self.FixedResolutionsCombo.focus_set() + else: + self.ResolutionChanged(None) + self.cb.focus_set() + self.FixedResolutionsCombo.config(state=states[useFixedRes]) + self.cb.config(state=states[not useFixedRes]) + self.cb1.config(state=states[not useFixedRes]) + def Zoom ( self, newVal, scale ): + self.camera.zoom = (float(self.Xzoom.get()),float(self.Yzoom.get()), + float(self.Widthzoom.get()),float(self.Heightzoom.get())) + scale.focus_set() + def SetZoom ( self, x, y, w, h ): + self.Xzoom.set(x) + self.Yzoom.set(y) + self.Widthzoom.set(w) + self.Heightzoom.set(h) + def ZoomReset ( self ): + self.Xzoom.set(0.0) + self.Yzoom.set(0.0) + self.Widthzoom.set(1.0) + self.Heightzoom.set(1.0) + def AllowImageResizeAfter ( self, allowResizeAfter ): + if allowResizeAfter: + state = 'readonly' + self.ResizeAfterChanged(None) + self.resizeWidthAfterCombo.focus_set() + else: + self.resizeAfter = None + state = 'disabled' + self.resizeWidthAfterCombo.config(state=state) + self.resizeHeightAfterCombo.config(state=state) + def ResizeAfterChanged ( self, event ): + self.resizeAfter = ( int(self.resizeWidthAfterCombo.get()), + int(self.resizeHeightAfterCombo.get()) ) + def GetResizeAfter ( self ): + return self.resizeAfter + def EffectsChecked ( self, EffectsEnabled ): + if EffectsEnabled == True: + self.effects.config(state='readonly') + self.EffectsChanged(None) + self.effects.focus_set() + else: + self.effects.config(state='disabled') + self.ModParams.config(state='disabled') + self.camera.image_effect = 'none' + def EffectsChanged ( self, event ): + self.camera.image_effect = self.effects.get() + if self.camera.image_effect in ['solarize', 'colorpoint', + 'colorbalance', 'colorswap', 'posterise', 'blur', 'film', + 'watercolor']: + self.ModParams.config(state='!disabled') + params = Effects1Page.EffectParam[self.camera.image_effect] + if params != -1: # We have something to program + self.camera.image_effect_params = \ + Effects1Page.EffectParam[self.camera.image_effect] + else: + self.ModParams.config(state='disabled') + def ModifyEffectsParamsPressed ( self ): + ImageEffectsDialog(self,title='Image Effects Parameters', + camera=self.camera,okonly=False) + def ImageDenoiseChecked ( self ): + self.camera.image_denoise = self.ImageDenoise.get() + def VideoDenoiseChecked ( self ): + self.camera.video_denoise = self.VideoDenoise.get() + def VideoStabChecked ( self ): + self.camera.video_stabilization = self.VideoStab.get() + def FlashModeButton ( self, FlashMode ): + if FlashMode == 'set': + self.FlashModeCombo.config(state='readonly') + self.FlashModeCombo.focus_set() + self.FlashModeChanged(None) + else: + self.FlashModeCombo.config(state='disabled') + self.camera.flash_mode = FlashMode + def FlashModeChanged ( self, event ): + self.camera.flash_mode = self.FlashModeCombo.get() diff --git a/Source/PiCameraApp.py b/Source/PiCameraApp.py old mode 100644 new mode 100755 index 299d214..5602179 --- a/Source/PiCameraApp.py +++ b/Source/PiCameraApp.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # -*- coding: utf-8 -*- ''' @@ -49,7 +49,7 @@ warnings with GPIO.setwarnings(False). The LED cannot be controlled when the library is in BOARD mode. ''' - +import os try: import picamera from picamera import * @@ -106,6 +106,9 @@ from Timelapse import * from Utils import * +wrkdir = os.path.dirname(__file__) + + # # Main PiCameraApp Window # @@ -136,14 +139,14 @@ def __init__(self, root, camera, title): ToolTip.LoadToolTips() #----------- Icons for Menu and Buttons ------------------------ - self.iconClose = GetPhotoImage("Assets/window-close.png") + self.iconClose = GetPhotoImage(os.path.join(wrkdir,"Assets","window-close.png")) #self.iconClose = ImageTk.PhotoImage(PIL.Image.open("Assets/window-close.png")) - self.iconPrefs = GetPhotoImage('Assets/prefs1_16x16.png') - self.iconWeb = GetPhotoImage('Assets/web_16x16.png') - image = PIL.Image.open('Assets/camera-icon.png') + self.iconPrefs = GetPhotoImage(os.path.join(wrkdir,"Assets","prefs1_16x16.png")) + self.iconWeb = GetPhotoImage(os.path.join(wrkdir,"Assets","web_16x16.png")) + image = PIL.Image.open(os.path.join(wrkdir,"Assets","camera-icon.png")) self.iconCameraBig = GetPhotoImage(image.resize((22,22))) self.iconCamera = GetPhotoImage(image.resize((16,16))) - image = PIL.Image.open('Assets/video-icon-b.png') + image = PIL.Image.open(os.path.join(wrkdir,"Assets","video-icon-b.png")) self.iconVideoBig = GetPhotoImage(image.resize((22,22))) self.iconVideo = GetPhotoImage(image.resize((16,16))) @@ -229,7 +232,7 @@ def __init__(self, root, camera, title): ToolTip(self.alpha, msg=2) self.VFlipState = False - image = PIL.Image.open('Assets/flip.png') + image = PIL.Image.open(os.path.join(wrkdir,"Assets","flip.png")) image1 = image.rotate(90) image1 = image1.resize((16,16)) self.flipVgif = ImageTk.PhotoImage(image1) @@ -245,7 +248,7 @@ def __init__(self, root, camera, title): self.Hflip.grid(row=0,column=4) ToolTip(self.Hflip, msg=4) - image = PIL.Image.open('Assets/rotate.png') + image = PIL.Image.open(os.path.join(wrkdir,"Assets","rotate.png")) self.RotateImg = ImageTk.PhotoImage(image.resize((16,16))) self.Rotate = ttk.Button(ButtonFrame,image=self.RotateImg,width=10, command=self.RotateCamera,padding=(2,2,2,2)) @@ -370,13 +373,13 @@ def __init__(self, root, camera, title): self.TakeVideo.grid(row=0,column=1,sticky='W') ToolTip(self.TakeVideo, msg=10) - self.clearImage = ImageTk.PhotoImage(file='Assets/cancel_22x22.png') + self.clearImage = ImageTk.PhotoImage(file=os.path.join(wrkdir,"Assets","cancel_22x22.png")) b = ttk.Button(ButtonFrame,command=lambda e=None:self.ClearPicture(e), image=self.clearImage,padding=(0,1,0,1)) b.grid(row=0,column=2,sticky='W',padx=5) ToolTip(b, msg=11) - image = PIL.Image.open('Assets/flip.png').resize((22,22)) + image = PIL.Image.open(os.path.join(wrkdir,"Assets","flip.png")).resize((22,22)) self.FlipHorzImage = ImageTk.PhotoImage(image) b = ttk.Button(ButtonFrame,command=lambda e=None:self.FlipPictureH(e), image=self.FlipHorzImage,padding=(0,1,0,1)) @@ -1124,8 +1127,8 @@ def Run (): win.mainloop() camera.close() + x=input("end") if __name__ == '__main__': print ( 'running....' ) - Run() - + Run() \ No newline at end of file diff --git a/Source/Tooltip.py b/Source/Tooltip.py index a86a470..9675fc8 100644 --- a/Source/Tooltip.py +++ b/Source/Tooltip.py @@ -24,6 +24,7 @@ # MA 02110-1301, USA. # # +import os from time import time, localtime, strftime try: from Tkinter import * @@ -61,7 +62,9 @@ class ToolTip( Toplevel ): TipLines = [] # All the tip text in lines @staticmethod def LoadToolTips ( ): # Perhaps allow a reload of tips? - tipsFile = open("Assets/Tooltips.txt", "r") + wrkdirtips = os.path.dirname(__file__) + tipspath=os.path.join(wrkdirtips,"Assets","Tooltips.txt") + tipsFile = open(tipspath, "r") if tipsFile: ToolTip.TipLines = tipsFile.read().split('\n') tipsFile.close() @@ -203,4 +206,4 @@ def hide( self, event=None ): event: The event that called this function """ self.visible = 0 - self.withdraw() + self.withdraw() \ No newline at end of file