{"id":920,"date":"2021-08-07T08:27:35","date_gmt":"2021-08-07T08:27:35","guid":{"rendered":"https:\/\/achrafothman.net\/site\/?p=920"},"modified":"2021-08-07T08:27:35","modified_gmt":"2021-08-07T08:27:35","slug":"login-form-using-python-and-kivy-gui-and-mysql-connector-tutorial","status":"publish","type":"post","link":"https:\/\/achrafothman.net\/site\/login-form-using-python-and-kivy-gui-and-mysql-connector-tutorial\/","title":{"rendered":"Login Form using Python and Kivy GUI and MySQL Connector (Tutorial)"},"content":{"rendered":"<p>Hello!\u00a0In this tutorial, I will develop a GUI using Python, Kivy, KivyMD, and MySQL.<\/p>\n<p><a href=\"https:\/\/kivy.org\/\" target=\"_blank\" rel=\"noopener\">Kivy<\/a> is a graphical user interface opensource Python library that allows you to develop multi-platform applications on Windows, macOS, Android, iOS, Linux, and Raspberry-Pi. In addition to the regular mouse and keyboard inputs, it also supports multitouch events. The applications made using Kivy will be similar across all the platforms but it also means that the applications feel or look will differ from any native application.<\/p>\n<p>For this tutorial, we need 4 files:<\/p>\n<ul>\n<li><strong>config.ini<\/strong>: where we will save MySQL connector credentials<\/li>\n<li><strong>main.py<\/strong>: main python file to be called through MS Command (for Windows users) or Terminal (for Linux and Mac users)<\/li>\n<li><strong>login.py<\/strong>: Kivy screen python class<\/li>\n<li><strong>login.kv<\/strong>: Kivy screen UI components<\/li>\n<\/ul>\n<h3>The config file: config.ini<\/h3>\n<p>Here we will use the INI format config file to save MySQL connector credentials. We need only 4 parameters: host, database name, user, and password.<\/p>\n<div>\n<div><code>[mysql]<\/code><\/div>\n<div><code>host=localhost<\/code><\/div>\n<div><code>user=root<\/code><\/div>\n<div><code>password=your_password_here<\/code><\/div>\n<div><code>db=tutorialkivy01<\/code><\/div>\n<div><\/div>\n<\/div>\n<p>The database &#8220;tutorialkivy01&#8221; has only one table name &#8220;users&#8221; containing one row of one user. Here is the SQL code to create the table and insert one row:<\/p>\n<p><code>-- Table structure for table `users`<\/code><br \/>\n<code>CREATE TABLE `users` (<\/code><br \/>\n<code>`id_auto` int(11) NOT NULL,<\/code><br \/>\n<code>`email` varchar(250) NOT NULL,<\/code><br \/>\n<code>`password` varchar(250) NOT NULL,<\/code><br \/>\n<code>`last_login` datetime NOT NULL<\/code><br \/>\n<code>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;<\/code><br \/>\n<code>-- Dumping data for table `users`<\/code><br \/>\n<code>INSERT INTO `users` (`id_auto`, `email`, `password`, `last_login`) VALUES<\/code><br \/>\n<code>(1, 'demo@tutorial.com', 'mypassword', '0000-00-00 00:00:00');<\/code><br \/>\n<code>-- Indexes for table `users`<\/code><br \/>\n<code>ALTER TABLE `users` ADD PRIMARY KEY (`id_auto`);<\/code><\/p>\n<p><img data-attachment-id=\"921\" data-permalink=\"https:\/\/achrafothman.net\/site\/login-form-using-python-and-kivy-gui-and-mysql-connector-tutorial\/t2\/\" data-orig-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?fit=886%2C180&amp;ssl=1\" data-orig-size=\"886,180\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Achraf&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1628334133&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"t2\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?fit=300%2C61&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?fit=770%2C156&amp;ssl=1\" decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-921\" src=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?resize=476%2C97&#038;ssl=1\" alt=\"\" width=\"476\" height=\"97\" srcset=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?w=886&amp;ssl=1 886w, https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?resize=300%2C61&amp;ssl=1 300w, https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t2.jpg?resize=768%2C156&amp;ssl=1 768w\" sizes=\"(max-width: 476px) 100vw, 476px\" data-recalc-dims=\"1\" \/> <img data-attachment-id=\"922\" data-permalink=\"https:\/\/achrafothman.net\/site\/login-form-using-python-and-kivy-gui-and-mysql-connector-tutorial\/t1\/\" data-orig-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?fit=766%2C68&amp;ssl=1\" data-orig-size=\"766,68\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;Achraf&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;1628334106&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"t1\" data-image-description=\"\" data-image-caption=\"\" data-medium-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?fit=300%2C27&amp;ssl=1\" data-large-file=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?fit=766%2C68&amp;ssl=1\" decoding=\"async\" loading=\"lazy\" class=\"alignnone wp-image-922\" src=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?resize=484%2C43&#038;ssl=1\" alt=\"\" width=\"484\" height=\"43\" srcset=\"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?w=766&amp;ssl=1 766w, https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t1.jpg?resize=300%2C27&amp;ssl=1 300w\" sizes=\"(max-width: 484px) 100vw, 484px\" data-recalc-dims=\"1\" \/><\/p>\n<h3><\/h3>\n<h3>The main file: main.py<\/h3>\n<div>\n<div><code>import\u00a0os,\u00a0sys<\/code><\/div>\n<div><code>import\u00a0configparser<\/code><\/div>\n<div><code>from\u00a0datetime\u00a0import\u00a0datetime<\/code><\/div>\n<div><code>import\u00a0kivy<\/code><\/div>\n<div><code>kivy.require('1.0.8')<\/code><\/div>\n<div><code>from\u00a0kivy.app\u00a0import\u00a0App<\/code><\/div>\n<div><code>from\u00a0kivy.uix.screenmanager\u00a0import\u00a0ScreenManager,\u00a0NoTransition<\/code><\/div>\n<div><code>from\u00a0kivymd.app\u00a0import\u00a0MDApp<\/code><\/div>\n<div><code>from\u00a0login\u00a0import\u00a0Login<\/code><\/div>\n<div><code>#Login\u00a0Screen<\/code><\/div>\n<div><code>class\u00a0LoginApp(MDApp):<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0def\u00a0build(self):<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.manager\u00a0=\u00a0ScreenManager(transition=NoTransition())<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0self.manager.add_widget(Login(name='login'))<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return\u00a0self.manager<\/code><\/div>\n<div><code>#python\u00a0main\u00a0function<\/code><\/div>\n<div><code>if\u00a0__name__\u00a0==\u00a0'__main__':<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0if\u00a0hasattr(sys,\u00a0'_MEIPASS'):<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0resource_add_path(os.path.join(sys._MEIPASS))<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0LoginApp().run()<\/code><\/div>\n<\/div>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h3>The main file: login.kv<\/h3>\n<div>\n<div><code>#:kivy 1.0<\/code><\/div>\n<div><code>&lt;Login&gt;:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0BoxLayout:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id:\u00a0login_layout<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0orientation:\u00a0'vertical'<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0padding:\u00a0[30,30,30,30]<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0spacing:\u00a030<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size_hint:\u00a0None,\u00a0None<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size: 500,500<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0GridLayout:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cols:2<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MDLabel:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text:\u00a0'Email'<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0halign:\u00a0'left'<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size: 18<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MDTextField:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id:\u00a0input_email<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0multiline:False<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size: 28<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MDLabel:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text:\u00a0'Password'<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0halign:\u00a0'left'<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size: 18<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MDTextField:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0id:\u00a0input_password<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0multiline:False<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0password:True<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size: 28<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Button:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text:\u00a0\"Fermer\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size:\u00a0\"18sp\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size_hint:\u00a0None,\u00a0None<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size:\u00a0250,100<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0background_normal:\u00a0''<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0background_color:\u00a01,0,0,1<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0on_release:\u00a0app.stop()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Button:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0text:\u00a0\"Fermer\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0font_size:\u00a0\"18sp\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size_hint:\u00a0None,\u00a0None<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0size:\u00a0250,100<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0background_normal:\u00a0''<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0background_color:\u00a00,1,0,1<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0on_release:\u00a0root.connect()<\/code><\/div>\n<\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div><\/div>\n<div><span style=\"color: #111111; font-family: Roboto, Arial, sans-serif; font-size: 1.368em; font-weight: bold;\">The main file: login.py<\/span><\/div>\n<div>\n<div>\n<div><code>from\u00a0kivy.app\u00a0import\u00a0App<\/code><\/div>\n<div><code>from\u00a0kivy.lang\u00a0import\u00a0Builder<\/code><\/div>\n<div><code>from\u00a0kivy.uix.screenmanager\u00a0import\u00a0Screen,\u00a0SlideTransition<\/code><\/div>\n<div><code>from\u00a0kivymd.toast\u00a0import\u00a0toast<\/code><\/div>\n<div><code>from\u00a0datetime\u00a0import\u00a0datetime<\/code><\/div>\n<div><code>import\u00a0configparser<\/code><\/div>\n<div><code>import\u00a0mysql.connector<\/code><\/div>\n<div><code>class\u00a0Login(Screen):<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0pass<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0def\u00a0connect(self):<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#get\u00a0email\u00a0and\u00a0password\u00a0from\u00a0Screen<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0app\u00a0=\u00a0App.get_running_app()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0input_email\u00a0=\u00a0app.manager.get_screen('login').ids['input_email'].text<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0input_password\u00a0=\u00a0app.manager.get_screen('login').ids['input_password'].text<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#load\u00a0credentials\u00a0from\u00a0config.ini<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0config\u00a0=\u00a0configparser.ConfigParser()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0config.read('config.ini')<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0host\u00a0=\u00a0config['mysql']['host']<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0user\u00a0=\u00a0config['mysql']['user']<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0password\u00a0=\u00a0config['mysql']['password']<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0dbname\u00a0=\u00a0config['mysql']['db']<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#connect\u00a0to\u00a0MySQL<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db\u00a0=\u00a0mysql.connector.connect(host=str(host),\u00a0\u00a0user=str(user),\u00a0\u00a0password=str(password),\u00a0\u00a0database=str(dbname))<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cursor\u00a0=\u00a0db.cursor()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#run\u00a0query\u00a0to\u00a0check\u00a0email\/password<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query\u00a0=\u00a0\"SELECT\u00a0count(*)\u00a0FROM\u00a0users\u00a0where\u00a0email='\"+str(input_email)+\"'\u00a0and\u00a0password='\"+str(input_password)+\"'\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cursor.execute(query)<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0data\u00a0=\u00a0cursor.fetchone()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0count\u00a0=\u00a0data[0]<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#verif\u00a0login\/email<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#if\u00a0invalid<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0count\u00a0==\u00a00:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0toast('Invalid\u00a0Login\/Password')<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#else,\u00a0if\u00a0valid<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0else:<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0toast('Login\u00a0and\u00a0Password\u00a0are\u00a0correct!')<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0#update\u00a0last_login\u00a0column<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0now\u00a0=\u00a0datetime.now()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0query\u00a0=\u00a0\"update\u00a0users\u00a0set\u00a0last_login='\"+str(now.strftime(\"%Y-%m-%d\u00a0%H:%M:%S\"))+\"'\u00a0where\u00a0email='\"+str(input_email)+\"'\u00a0and\u00a0password='\"+str(input_password)+\"'\"<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0cursor.execute(query)<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db.commit()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0db.close()<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0pass<\/code><\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Hello!\u00a0In this tutorial, I will develop a GUI using Python, Kivy, KivyMD, and MySQL. Kivy is a graphical user interface opensource Python library that allows you to develop multi-platform applications on Windows, macOS, Android, iOS, Linux, and Raspberry-Pi. In addition to the regular mouse and keyboard inputs, it also supports multitouch events. The applications made<\/p>\n","protected":false},"author":1,"featured_media":927,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":""},"categories":[4],"tags":[136,137,140,139,138,88],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=996%2C782&ssl=1","uagb_featured_image_src":{"full":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=996%2C782&ssl=1",996,782,false],"thumbnail":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=150%2C150&ssl=1",150,150,true],"medium":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=300%2C236&ssl=1",300,236,true],"medium_large":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=768%2C603&ssl=1",768,603,true],"large":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=770%2C605&ssl=1",770,605,true],"1536x1536":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=996%2C782&ssl=1",996,782,true],"2048x2048":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?fit=996%2C782&ssl=1",996,782,true],"post-thumbnail":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=270%2C180&ssl=1",270,180,true],"contentberg-main":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=770%2C515&ssl=1",770,515,true],"contentberg-main-full":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=996%2C508&ssl=1",996,508,true],"contentberg-slider-stylish":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=900%2C515&ssl=1",900,515,true],"contentberg-slider-carousel":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=370%2C370&ssl=1",370,370,true],"contentberg-slider-grid-b":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=554%2C466&ssl=1",554,466,true],"contentberg-slider-grid-b-sm":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=306%2C466&ssl=1",306,466,true],"contentberg-slider-bold-sm":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=150%2C150&ssl=1",150,150,true],"contentberg-grid":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=370%2C245&ssl=1",370,245,true],"contentberg-list":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=260%2C200&ssl=1",260,200,true],"contentberg-list-b":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=370%2C305&ssl=1",370,305,true],"contentberg-thumb":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=87%2C67&ssl=1",87,67,true],"contentberg-thumb-alt":["https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/t3.png?resize=150%2C150&ssl=1",150,150,true]},"uagb_author_info":{"display_name":"Achraf Othman","author_link":"https:\/\/achrafothman.net\/site\/author\/achraf-othman\/"},"uagb_comment_info":0,"uagb_excerpt":"Hello!\u00a0In this tutorial, I will develop a GUI using Python, Kivy, KivyMD, and MySQL. Kivy is a graphical user interface opensource Python library that allows you to develop multi-platform applications on Windows, macOS, Android, iOS, Linux, and Raspberry-Pi. In addition to the regular mouse and keyboard inputs, it also supports multitouch events. The applications made","jetpack_shortlink":"https:\/\/wp.me\/p8KjJN-eQ","jetpack-related-posts":[{"id":235,"url":"https:\/\/achrafothman.net\/site\/how-to-install-moses-statistical-machine-translation-in-ubuntu\/","url_meta":{"origin":920,"position":0},"title":"How to install Moses (Statistical Machine Translation) on Ubuntu?","date":"November 27, 2017","format":"image","excerpt":"In this article, I will show you how to install and build Moses on Ubuntu, and how to use Moses to translate with some simple models (English and Sign Language Gloss). If you experience problems, then please contact me. If you\u2019re just writing about this work, please cite this paper\u2026","rel":"","context":"In &quot;Tutorials&quot;","img":{"alt_text":"How to install Moses on Ubuntu? Moses, Statistical Machine Translation","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/tuto-1.jpg?fit=640%2C400&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":396,"url":"https:\/\/achrafothman.net\/site\/youtube-tutorial-serie-1-deployment-of-a-statistical-machine-translation\/","url_meta":{"origin":920,"position":1},"title":"Youtube Tutorial Serie 1- Deployment of a statistical machine translation using Moses and Giza++","date":"April 18, 2020","format":false,"excerpt":"","rel":"","context":"In &quot;Blog&quot;","img":{"alt_text":"","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/video-1.jpg?fit=1200%2C675&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2084,"url":"https:\/\/achrafothman.net\/site\/what-is-arabic-braille-is-it-unified\/","url_meta":{"origin":920,"position":2},"title":"What is Arabic Braille? Is it Unified?","date":"October 2, 2021","format":false,"excerpt":"Authors: Achraf Othman Research and Innovation Letters \u2022 Volume 1 \u2022 Issue 3 \u2022 October 2021 \u2022 Published: October 2, 2021 \u2022 PDF Abstract- Braille is a method of reading and writing that relies on touching prominent dots that people with visual disabilities recognize once they pass their fingers over\u2026","rel":"","context":"In &quot;Research and Innovation Letters&quot;","img":{"alt_text":"Unified Arabic Braille","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/The-Unified-Arabic-Braille-Portal-744x372-1.jpg?fit=744%2C372&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":491,"url":"https:\/\/achrafothman.net\/site\/how-to-downgrade-gcc-and-g-in-ubuntu\/","url_meta":{"origin":920,"position":3},"title":"How to downgrade GCC and G++ in Ubuntu?","date":"May 17, 2020","format":false,"excerpt":"Downgrading GCC and G++ compilers in Ubuntu is mandatory to build some packages (like IRSTLM, Giza++, Moses, etc.). In this tutorial, I will present an easy way to install gcc-4.4, gcc-4.6, gcc-4.9, g++-4.4, g++-4.6, and, g++-4.9. First of all, you need to update the sources repository using a text editor\u2026","rel":"","context":"In &quot;Tutorials&quot;","img":{"alt_text":"How to downgrade GCC and G++ in Ubuntu?","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/gcc-logo.jpg?fit=905%2C501&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":156,"url":"https:\/\/achrafothman.net\/site\/eurolan-2017-summer-school-on-biomedical-text-processing\/","url_meta":{"origin":920,"position":4},"title":"EUROLAN-2017 \u2013 Summer School on Biomedical Text Processing","date":"May 27, 2017","format":false,"excerpt":"EUROLAN-2017 \u2013 Summer School on Biomedical Text Processing 10 \u2013 17 September 2017, Constan\u021ba, Romania http:\/\/eurolan.info.uaic.ro\/2017\/ The 13th in the series of EUROLAN Schools Biomedical Text Mining (BioNLP) applies natural language processing (NLP) techniques to identify and extract information from scientific publications in biology, medicine, and chemistry, in order to\u2026","rel":"","context":"In &quot;Blog&quot;","img":{"alt_text":"EUROLAN-2017 \u2013 Summer School on Biomedical Text Processing","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/1.png?fit=1200%2C438&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":500,"url":"https:\/\/achrafothman.net\/site\/deployment-of-a-statistical-machine-translation-english-american-sign-language\/","url_meta":{"origin":920,"position":5},"title":"Deployment of a Statistical Machine Translation (English &#038; American Sign Language)","date":"May 17, 2020","format":false,"excerpt":"Hello! In this tutorial, you will be able to deploy your statistical machine translation for the pair of language English and American Sign Language in written form. If you want to cite my work in your research papers, please refer to this publication: Achraf Othman, Mohamed Jemni, \u201cDesigning High Accuracy\u2026","rel":"","context":"In &quot;Tutorials&quot;","img":{"alt_text":"Deployment of a Statistical Machine Translation English-American Sign Language","src":"https:\/\/i0.wp.com\/achrafothman.net\/site\/wp-content\/uploads\/smt-tutorial.png?fit=600%2C400&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]}],"_links":{"self":[{"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/posts\/920"}],"collection":[{"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/comments?post=920"}],"version-history":[{"count":4,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/posts\/920\/revisions"}],"predecessor-version":[{"id":930,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/posts\/920\/revisions\/930"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/media\/927"}],"wp:attachment":[{"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/media?parent=920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/categories?post=920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/achrafothman.net\/site\/wp-json\/wp\/v2\/tags?post=920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}