Tkinter dont allow me to use memory for refreshing GUI [closed]

asked 2016-06-29 10:41:40 -0500

murat1212 gravatar image

updated 2016-06-29 13:45:32 -0500

There is a my sample kod. I want to do video rendering. For this propose, I wrote two thread one capture the screen from the camera consistently and save to disk and other one take this image from disk and update the my GUI. I use Tkinter for UI rendering.My problem is starting here. Speed of the refreshing is too low. The image comes to GUI intermittently.I want to use memory for transfer the images to GUI but Tkinter only allow me using disk, not memory. Do anyone give me any suggestions please? How I solve this problem on memory? :)

        # import the necessary packages
    import io
    from picamera.array import PiRGBArray
    from picamera import PiCamera
    import time
    import cv2
    import sys
    import traceback
    import threading
    from PIL import Image, ImageTk
    import numpy as np
    # GUI side imports
    from Tkinter import *
    import os
    from shutil import copyfile

    class ReaderThread(threading.Thread):

            def __init__(self):
                    super(ReaderThread, self).__init__()

            def run(self):
                    readMe()

    class UpdaterThread(threading.Thread):

            def __init__(self):
                    super(UpdaterThread, self).__init__()

            def run(self):
                    renderMe()

    def readMe():
        for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True):
            # grab the raw NumPy array representing the image, then initialize the timestamp
            # and occupied/unoccupied text
            try:
                    image = frame.array
                    cv2.imwrite("photo.jpg",image)
                    # clear the stream in preparation for the next frame
                    rawCapture.truncate(0)
            except:
                    exc_type, exc_value, exc_traceback = sys.exc_info()
                    traceback.print_exception(exc_type, exc_value, exc_traceback)

    # initialize the camera and grab a reference to the raw camera capture
    sWidth = 800
    sHeight = 600
    camera = PiCamera()
    camera.resolution = (sWidth, sHeight)
    camera.framerate = 15
    rawCapture = PiRGBArray(camera, size=(sWidth, sHeight))

    # allow the camera to warmup
    time.sleep(0.1)

    mainWindow = Tk()
    # Render area definition
    renderFrame = Frame(mainWindow, width = 800, height = 600)
    renderFrame.grid(row = 0, column = 1, padx = 10, pady =2)
    renderLabel = Label(renderFrame)
    renderLabel.grid(row = 0, column = 0, padx = 0, pady = 0)
    renderLabel.pack()

    # update frames on screen
    def renderMe():
            while 1:
                    if os.path.isfile("photo.jpg"):
                       copyfile("photo.jpg", "photo2.jpg")     
                       renderLabel["image"] = ImageTk.PhotoImage(file="photo2.jpg")
                    key = cv2.waitKey(1) & 0xFF
                    # if the `q` key was pressed, break from the loop
                    if key == ord("q"):
                       camera.close()
                       break

                    os.system('exit')

    # GUI interaction functions area
    def freeMouseChoice():
            print "You will choose the mouse my buddy"

    def main():
            try:
               rThread = ReaderThread()
               rThread.start()
               print "Reader thread started..."
               uThread = UpdaterThread()
               uThread.start()
               print "Updater thread started..."
            except:
                exc_type, exc_value, exc_traceback = sys.exc_info()
                traceback.print_exception(exc_type, exc_value, exc_traceback)
                camera.close()

            mainWindow.wm_title("Con sinov - Bustard the BEKCI")
            mainWindow.config(background = "#000000")

            #Preparing toolbar
            toolFrame = Frame(mainWindow, width=200, height = 600)
            toolFrame.grid(row = 0, column = 0, padx = 10, pady = 2)

            mouseChooseButton = Button(toolFrame, text = "Fare Secim", command = freeMouseChoice)
            mouseChooseButton.grid(row = 0, column = 0, padx = 5, pady = 2)

            #renderLabel.pack()

            mainWindow.mainloop()

    if __name__ == "__main__":
        main()
edit retag flag offensive reopen merge delete

Closed for the following reason duplicate question by murat1212
close date 2016-07-11 09:24:36.925240

Comments

there's cv2.imencode() / cv2.imdecode() as well

berak gravatar imageberak ( 2016-06-29 11:42:15 -0500 )edit
2

if you want my 2ct: stay away from tkinter. it's not portable, it does not play nice with opencv's built-in-gui

berak gravatar imageberak ( 2016-06-29 12:37:29 -0500 )edit

what do you recommend instead of tkinter?

murat1212 gravatar imagemurat1212 ( 2016-06-29 13:47:33 -0500 )edit
1

i would say qt or gtk. tinter is pretty old i think?

atv gravatar imageatv ( 2016-06-29 16:06:49 -0500 )edit