Python Forum
align frame inside canvas
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
align frame inside canvas
#1
hello guys, i have experimented with PAGE gui builder and i-m a little stuck, the scenario is this i run the code, the app starts, it has a canvas for displaying the camera feed and a button, press the button it takes a snapshot.
after two days of experimenting and reading forums i have made it to work but ... the pictures are too small because they take the canvas size which is to small so before resolving the size ... i want to align the camera frame in the center of canvas Wall Wall

img 1
img 2
img 3


#! /usr/bin/env python
#  -*- coding: utf-8 -*-
#
# GUI module generated by PAGE version 5.4
#  in conjunction with Tcl version 8.6
#    Sep 04, 2020 04:46:23 PM +0200  platform: Windows NT

import sys

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

try:
    import ttk
    py3 = False
except ImportError:
    import tkinter.ttk as ttk
    py3 = True

import snapshot_support

##################tutorial################
import cv2
import PIL.Image, PIL.ImageTk
import time



def vp_start_gui():
    '''Starting point when module is the main routine.'''
    global val, w, root
    root = tk.Tk()
    top = scannerApp (root)
    snapshot_support.init(root, top)
    root.mainloop()

w = None
def create_scannerApp(rt, *args, **kwargs):
    '''Starting point when module is imported by another module.
       Correct form of call: 'create_scannerApp(root, *args, **kwargs)' .'''
    global w, w_win, root
    #rt = root
    root = rt
    w = tk.Toplevel (root)
    top = scannerApp (w)
    snapshot_support.init(w, top, *args, **kwargs)
    return (w, top)

def destroy_scannerApp():
    global w
    w.destroy()
    w = None

class scannerApp:
    def __init__(self, top=None, video_source=1):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9' # X11 color: 'gray85'
        _ana1color = '#d9d9d9' # X11 color: 'gray85'
        _ana2color = '#ececec' # Closest X11 color: 'gray92'

        top.geometry("600x450+420+128")
        top.minsize(120, 1)
        top.maxsize(1370, 749)
        top.resizable(1, 1)
        top.title("scaner")
        top.configure(background="#d9d9d9")
        
        self.video_source = video_source

        # open video source (by default this will try to open the computer webcam)
        self.vid = MyVideoCapture(self.video_source)

        # Create a canvas 
        self.Canvas1 = tk.Canvas(top) 
         
        self.Canvas1.place(relx=0.05, rely=0.244, relheight=0.533
                , relwidth=0.533)
        self.Canvas1.configure(background="#d9d9d9")
        self.Canvas1.configure(borderwidth="2")
        self.Canvas1.configure(insertbackground="black")
        self.Canvas1.configure(relief="ridge")
        self.Canvas1.configure(selectbackground="blue")
        self.Canvas1.configure(selectforeground="white")
      

        self.startFeedButton = tk.Button(top)
        self.startFeedButton.place(relx=0.05, rely=0.022, height=34, width=207)
        self.startFeedButton.configure(activebackground="#ececec")
        self.startFeedButton.configure(activeforeground="#000000")
        self.startFeedButton.configure(background="#d9d9d9")
        self.startFeedButton.configure(disabledforeground="#a3a3a3")
        self.startFeedButton.configure(foreground="#000000")
        self.startFeedButton.configure(highlightbackground="#d9d9d9")
        self.startFeedButton.configure(highlightcolor="black")
        self.startFeedButton.configure(pady="0")
        self.startFeedButton.configure(text='''start''')

        self.snapshotButton = tk.Button(top)
        self.snapshotButton.place(relx=0.05, rely=0.133, height=34, width=207)
        self.snapshotButton.configure(activebackground="#ececec")
        self.snapshotButton.configure(activeforeground="#000000")
        self.snapshotButton.configure(background="#d9d9d9")
        self.snapshotButton.configure(disabledforeground="#a3a3a3")
        self.snapshotButton.configure(foreground="#000000")
        self.snapshotButton.configure(highlightbackground="#d9d9d9")
        self.snapshotButton.configure(highlightcolor="black")
        self.snapshotButton.configure(pady="0")
        self.snapshotButton.configure(text='''snapshot''', command=self.snapshot)

        # After it is called once, the update method will be automatically called every delay milliseconds
        self.delay = 15
        self.update()

        self.Canvas1.mainloop()

    def snapshot(self):
         # Get a frame from the video source
          ret, frame = self.vid.get_frame()

          if ret:
            cv2.imwrite("frame-" + time.strftime("%d-%m-%Y-%H-%M-%S") + ".jpg", cv2.cvtColor(frame, cv2.COLOR_RGB2BGR))
    
    def update(self):
         # Get a frame from the video source
          ret, frame = self.vid.get_frame()
 
          if ret:
             self.photo = PIL.ImageTk.PhotoImage(image = PIL.Image.fromarray(frame))
             self.Canvas1.create_image(0, 0, image = self.photo, anchor = tk.NW)
 
          self.Canvas1.after(self.delay, self.update)

class MyVideoCapture:
      def __init__(self, video_source=1):
         # Open the video source
          self.vid = cv2.VideoCapture(video_source)
          if not self.vid.isOpened():
             raise ValueError("Unable to open video source", video_source)
          
         # Get video source width and height
          self.width = self.vid.get(cv2.CAP_PROP_FRAME_WIDTH)
          self.height = self.vid.get(cv2.CAP_PROP_FRAME_HEIGHT)

        #  # set video with 
        #   self.width = self.vid.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
        #   self.height = self.vid.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)
 
      def get_frame(self):
          if self.vid.isOpened():
             ret, frame = self.vid.read()

            #  newframe = cv2.resize(frame, (320, 240), fx = 0, fy = 0, 
			# 			interpolation = cv2.INTER_CUBIC)
             if ret:
                 # Return a boolean success flag and the current frame converted to BGR
                  return (ret, cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
             else:
                  return (ret, None)
          else:
             return (ret, None)

     # Release the video source when the object is destroyed
      def __del__(self):
          if self.vid.isOpened():
             self.vid.release()
    

if __name__ == '__main__':
    vp_start_gui()
Reply


Messages In This Thread
align frame inside canvas - by ro_btz - Sep-11-2020, 06:57 AM
RE: align frame inside canvas - by Larz60+ - Sep-11-2020, 04:38 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  [Tkinter] Help running a loop inside a tkinter frame Konstantin23 3 1,565 Aug-10-2023, 11:41 AM
Last Post: Konstantin23
  [Tkinter] Align the width of the entrys with the column captions Particledust 0 1,720 Apr-23-2020, 08:32 AM
Last Post: Particledust
  [Tkinter] Label, align imported text from pandas kundrius 2 4,225 Dec-11-2019, 08:26 AM
Last Post: kundrius
  [Tkinter] Scrollbar, Frame and size of Frame Maksim 2 9,009 Sep-30-2019, 07:30 AM
Last Post: Maksim
  [Tkinter] Resizing image inside Canvas (with Canvas' resize) Gupi 2 25,098 Jun-04-2019, 05:05 AM
Last Post: Gupi
  [Tkinter] create and insert a new frame on top of another frame atlass218 4 11,122 Apr-18-2019, 05:36 PM
Last Post: atlass218
  video player inside a frame/panel in python raspberry pi desktop application MATHEWS 1 2,844 Dec-12-2018, 11:42 AM
Last Post: Larz60+
  [Tkinter] Frame in canvas wont fill AceScottie 0 3,096 Nov-06-2018, 02:00 PM
Last Post: AceScottie
  [Tkinter] Treeview automatically adjust it's size when pack inside frame Prince_Bhatia 1 27,827 Jul-25-2018, 03:24 AM
Last Post: Larz60+
  [Tkinter] Frame size only works if frame is empty(Solved) Tuck12173 7 6,452 Jan-29-2018, 10:44 PM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020