├── .gitignore ├── advanceControl └── auto_text.py ├── media ├── readme.md ├── video.py └── webCam.py ├── messaging ├── app.py ├── pub.py └── readme.md ├── readme.md └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | 162 | 163 | # project specifics 164 | *.mp4 -------------------------------------------------------------------------------- /advanceControl/auto_text.py: -------------------------------------------------------------------------------- 1 | """ 2 | https://towardsdatascience.com/fuzzy-string-matching-in-python-68f240d910fe 3 | pip install fuzzywuzzy 4 | pip install python-Levenshtein # to remove the slow warning (warnings.warn('Using slow pure-python SequenceMatcher. Install python-Levenshtein to remove this warning')) 5 | """ 6 | import flet as ft 7 | from fuzzywuzzy import fuzz 8 | 9 | theme = ft.Theme() 10 | def main(page: ft.Page): 11 | text_list = ["banana", "apple", "tiger", "avocado", "toxic", "ten"] 12 | 13 | def option_selected(e): 14 | print(e.data) 15 | text_box.value = e.data 16 | suggest_list.clean() 17 | page.update() 18 | 19 | 20 | def text_box_on_change(e): 21 | suggest_list.clean() 22 | match_dict = {} 23 | for token in text_list: 24 | match = fuzz.ratio(e.data,token) 25 | match_dict[token] = match 26 | if match > 50: 27 | suggest_list.controls.append(ft.TextButton(token, data=token, on_click=option_selected)) 28 | 29 | print(match_dict) 30 | page.update() 31 | 32 | 33 | text_box = ft.TextField(on_change=text_box_on_change) 34 | suggest_list = ft.ListView(expand=1) 35 | 36 | suggest_list.controls.append(ft.TextButton("PASS")) 37 | page.add(ft.Column( 38 | [text_box, 39 | suggest_list] 40 | )) 41 | 42 | 43 | 44 | page.theme_mode = "light" 45 | page.update() 46 | 47 | 48 | ft.app(target=main) -------------------------------------------------------------------------------- /media/readme.md: -------------------------------------------------------------------------------- 1 | ## Video Player 2 | Currently flet has no in-built video player. We can read video frames with OpenCV. To update this in flet we have to run the OpenCV video source `read()` function in a seperate thread. 3 | 4 | To play your video, put your video path in the following line: 5 | ```python 6 | cap = cv2.VideoCapture('video.mp4') 7 | 8 | ``` -------------------------------------------------------------------------------- /media/video.py: -------------------------------------------------------------------------------- 1 | import flet as ft 2 | import threading 3 | import time 4 | 5 | import cv2 6 | import base64 7 | 8 | cap = cv2.VideoCapture('video.mp4') 9 | 10 | def main(page : ft.Page): 11 | page.title = "Video Player" 12 | 13 | def update_images(): 14 | while(cap.isOpened()): 15 | # Capture frame-by-frame 16 | ret, frame = cap.read() 17 | if ret == True: 18 | # encode the resulting frame 19 | jpg_img = cv2.imencode('.jpg', frame) 20 | b64_string = base64.b64encode(jpg_img[1]).decode('utf-8') 21 | image_box.src_base64 = b64_string 22 | page.update() 23 | else: 24 | break 25 | time.sleep(1/115) 26 | 27 | # when video is finished 28 | video_container.content.clean() 29 | video_container.content = ft.Text("Video Ended", size=20) 30 | page.update() 31 | 32 | b64_string = None 33 | image_box = ft.Image(src_base64=b64_string, width=500, height=500) 34 | video_container = ft.Container(image_box, alignment=ft.alignment.center, expand=True) 35 | page.add(ft.Row([ 36 | video_container 37 | ] 38 | 39 | 40 | )) 41 | 42 | ## theading 43 | update_image_thread = threading.Thread(target=update_images) 44 | update_image_thread.daemon = True 45 | update_image_thread.start() 46 | 47 | page.update() 48 | 49 | ft.app(target=main) -------------------------------------------------------------------------------- /media/webCam.py: -------------------------------------------------------------------------------- 1 | import flet as ft 2 | import threading 3 | import time 4 | 5 | import cv2 6 | import base64 7 | 8 | cap = cv2.VideoCapture(0) 9 | 10 | def main(page : ft.Page): 11 | page.title = "fletCam" 12 | 13 | def update_images(): 14 | while(cap.isOpened()): 15 | # Capture frame-by-frame 16 | ret, frame = cap.read() 17 | if ret == True: 18 | # encode the resulting frame 19 | jpg_img = cv2.imencode('.jpg', frame) 20 | b64_string = base64.b64encode(jpg_img[1]).decode('utf-8') 21 | image_box.src_base64 = b64_string 22 | page.update() 23 | else: 24 | break 25 | time.sleep(1/115) 26 | 27 | 28 | 29 | b64_string = None 30 | image_box = ft.Image(src_base64=b64_string, width=500, height=500) 31 | video_container = ft.Container(image_box, alignment=ft.alignment.center, expand=True) 32 | page.add(ft.Row([ 33 | video_container 34 | ] 35 | 36 | 37 | )) 38 | 39 | ## theading 40 | update_image_thread = threading.Thread(target=update_images) 41 | update_image_thread.daemon = True 42 | update_image_thread.start() 43 | 44 | page.update() 45 | 46 | ft.app(target=main) -------------------------------------------------------------------------------- /messaging/app.py: -------------------------------------------------------------------------------- 1 | import flet as ft 2 | from Znode import Node 3 | import threading 4 | 5 | 6 | client = Node(node_type="SUB") 7 | 8 | def main(page:ft.Page): 9 | client.subscribe("update") 10 | 11 | # text update function (will be in thread) 12 | def update_thread(): 13 | while True: 14 | pkt, success = client.receive() 15 | topic, msg = pkt 16 | 17 | if success: 18 | update_text.value = msg.decode() 19 | page.update() 20 | 21 | 22 | # Create a thread and pass the page object to update it 23 | thread = threading.Thread(target=update_thread, daemon=True) 24 | thread.start() 25 | 26 | # page ui config 27 | page.title = "Znode Demo" 28 | page.horizontal_alignment = ft.CrossAxisAlignment.CENTER 29 | page.vertical_alignment = ft.MainAxisAlignment.CENTER 30 | 31 | update_text = ft.Text("Hello, ready for receving messages?", size=30) 32 | 33 | # add ui element to page 34 | page.add( 35 | update_text 36 | ) 37 | 38 | ft.app(target=main) 39 | -------------------------------------------------------------------------------- /messaging/pub.py: -------------------------------------------------------------------------------- 1 | import time 2 | from Znode import Node 3 | 4 | 5 | publisher = Node(node_type="PUB") 6 | 7 | while True: 8 | publisher.publish("update", f"{time.time()}") 9 | 10 | 11 | -------------------------------------------------------------------------------- /messaging/readme.md: -------------------------------------------------------------------------------- 1 | # Znode with Flet 2 | This is an example of communicating with flet application script with other python scripts. 3 | 4 | # How to use Znode inside flet 5 | 6 | 7 | Install Znode in your environment with pip 8 | ``` 9 | pip install git+https://github.com/wpritom/Znode 10 | ``` 11 | 12 | First run: 13 | ``` 14 | python app.py 15 | ``` 16 | 17 | Then run the publisher script 18 | ``` 19 | python pub.py 20 | ``` 21 | 22 | You can send messages to other running python scripts from flet application using Znode -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Flet Demo 2 | This repo contains various techniqes demo with python [Flet](https://github.com/flet-dev/flet) package. 3 | 4 | # Computer Vision 5 | To create any computer vision application Flet can be used with OpenCV. For playing a video or capturing webcam stream flet demo can be found in `media` folder. -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flet==0.2.2 2 | opencv_python==4.5.5.62 3 | --------------------------------------------------------------------------------