| 
		
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
	
		I'll have a try at these     
	
	
	
		
	Posts: 9,005 
	Threads: 567 
	Joined: Feb 2014
	
 Reputation: 
12 
	
	
		Don't sweat if you can't do something, you've already achieved so much. I will fill in the gaps    Just let me know.
	 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
	
		 (10-20-2018, 03:14 AM)Jerry link Wrote:#1 - Top logo also links to main website.#2 - Add button somewhere logical that links to internal Help Manual. /usr/share/doc/litemanual/index.html
 #3 - Could you please add our logo as a taskbar icon, points to in Series 4.x+: /usr/share/icons/Papirus/48x48/apps/liteicon.png (or whatever size suits)
 #4 - Rename app to llabout.py
 #5-  pull and display the current LL version from /etc/llver file.Hope you're enjoying the challenges.
  
#1 - completed 
#4 - completed
 
#1 Changed this to a button so a command to open the browser and go to main site can be added, this also lets the viewer know it is a button.  
Resized the button so there is a border around the image icon.Change coordinates of x and y to align the button.
 ![[Image: llabout1.png]](https://preview.ibb.co/hKWPVf/llabout1.png)  Code: #!/usr/bin/env python# code by bitsnpcs
 
 from Tkinter import *
 import webbrowser
 
 url1 = 'https://mityer.khdlhfjijfrupr.tk/development.html#team'
 url2 = 'https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html'
 url3 = 'https://mityer.khdlhfjijfrupr.tk/'
 
 # open browser and display url at line 7 thru 9
 def OpenUrl1():
 webbrowser.open(url1)
 
 def OpenUrl2():
 webbrowser.open(url2)
 
 def OpenUrl3():
 webbrowser.open(url3)
 
 def close_window():
 window.destroy()
 
 # Make window
 window = Tk()
 window.title("About Linux Lite")
 window.geometry("242x242")
 window.resizable(0,0)
 
 # adding a logo
 photo=PhotoImage(file="logo.png")
 l1 = Button(image=photo,width=160, height=59, command=OpenUrl3)
 l1.grid(row=4, column=0)
 l1.place(x=36.3, y=12)
 l1 = Label(window, text="     ")
 l1.grid(row=5, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=6, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=7, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=8, column=0, sticky=W)
 
 # adding a frame for ll website button
 GUIFrame1=Frame(window)
 GUIFrame1.grid(row=11, column=0)
 
 #adding a frame for last row of buttons
 GUIFrame2=Frame(window)
 GUIFrame2.grid(row=13, column=0)
 
 # define title, nym, year
 l2 = Label(window, text=u"\u00a9Copyright 2012-2018 Jerry Bezencon", fg="grey", font="none 8")
 l2.grid(row=15, column=0)
 
 l3 = Label(window, text="     ")
 l3.grid(row=0, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=10, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=12, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=14, column=0, sticky=W)
 
 l4 = Label(window, text="Current Version: 5.0")
 l4.grid(row=9, column=0)
 
 # ll website button
 l5 = Label(GUIFrame1, text=" ")
 l5.grid(row=11, column=0, sticky=W)
 Button(GUIFrame1, text="Visit Linux Lite website", width=16, command=OpenUrl3).grid(row=11, column=0)
 
 # last row of buttons
 l6 = Label(GUIFrame2, text=" ")
 l6.grid(row=13, column=0)
 Button(GUIFrame2, text="Credits", width=6, command=OpenUrl1).grid(row=13, column=1)
 Button(GUIFrame2, text="License", width=6, command=OpenUrl2).grid(row=13, column=2)
 Button(GUIFrame2, text="Close", width=6, command=window.destroy).grid(row=13, column=3)
 
 window.mainloop()
 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
	
		 (10-20-2018, 03:14 AM)Jerry link Wrote:#1 - Top logo also links to main website.#2 - Add button somewhere logical that links to internal Help Manual. /usr/share/doc/litemanual/index.html
 #3 - Could you please add our logo as a taskbar icon, points to in Series 4.x+: /usr/share/icons/Papirus/48x48/apps/liteicon.png (or whatever size suits)#4 - Rename app to llabout.py
 #5 - pull and display the current LL version from /etc/llver file.
 Hope you're enjoying the challenges.
  
#1 - completed 
#2 - completed*** 
#4 - completed
 
#3 - I was not able to do this, :-[ the various code I tried didn't display gif, png or ico, unsure where I was going wrong with it. 
#5 - I am unable to do this, I know an idea of it (a thought) but not how to do it. 
One way could be the text of current version to be made into a button, to its right add an output box, it somehow (the stuck point) needs to read the /etc/llver file, specifically the line stating the version, it then needs a variable defined that stores this version parameter , then the variable is output to the box when the button is clicked.  
eg; in the donation builder app I made it runs a number generating script I wrote then stores these in a variable and outputs them to the output box on each click, I had help from an Open Source programmer in India on Stack Overflow of how to achieve the output as I could'nt get it to display. 
So the user doesn't need to press the button it would need a way of doing an automated click, eg; so the app clicks the version button itself such as when the user clicks/executes to open the app, it also executes an automated click on the version button and so displays the version in the output box.That would occur so fast before the app is on screen and not be seen by the person opening the app, it would appear like the version number was already wrote there etc. 
In a few years of practice I might be able to do #5    but likely only in this type of way rather than a tidy more advanced way.
 
*** #2 in 2017 I wrote a post on the forum about how the local help manual for me, displays as a leafpad file of code rather than the actual manual. 
On completing #2 for me this is how it displays, not the actual manual, it will need someone with a working local manual to test it and see if the manual appears or the leafpad file.
 
*** #2 I done some extra learning for this. 
I put a menubar on the app for the help manual. 
I then decided to make 2 cascading menus.
 
The menu named Help has - 
Help Manual (local) - clicking this opens the manual offline on a users computer, using the default browser.  
Help Manual (online) - clicking this opens the default browser and displays the online manual. 
Ask community - clicking this opens the forum main page.
 
The Menu named Support has - 
Donate and Shop, clicking either of these opens the main site page for Donating to LL, or the main page LL Shop, in the users default browser.
 
Additionally @ line #74 I have added and commented out a menu separator, to use this people just delete the # you place this line of code between which ever menu items in the cascades where you want to have a horizontal divider line in the menu, separating the Menu options. 
More cascading menus can be added all the way along the menu bar for future needs.
 ![[Image: llabout1.png]](https://preview.ibb.co/eEDuwL/llabout1.png)  ![[Image: llabout2.png]](https://preview.ibb.co/knGmAf/llabout2.png)  ![[Image: llabout3.png]](https://preview.ibb.co/gsJYqf/llabout3.png)  
The code -
 Code: #!/usr/bin/env python# code by bitsnpcs
 
 from Tkinter import *
 import webbrowser
 
 url1 = 'https://mityer.khdlhfjijfrupr.tk/development.html#team'
 url2 = 'https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html'
 url3 = 'https://mityer.khdlhfjijfrupr.tk/'
 url4 = 'https://mityer.khdlhfjijfrupr.tk/manual/'
 url5 = 'https://mityer.khdlhfjijfrupr.tk/forums/index.php'
 url6 = 'https://mityer.khdlhfjijfrupr.tk/donate.html'
 url7 = 'https://mityer.khdlhfjijfrupr.tk/shop.html'
 url8 = '/usr/share/doc/litemanual/index.html'
 
 # open browser and display url at line 7 thru 13
 def OpenUrl1():
 webbrowser.open(url1)
 
 def OpenUrl2():
 webbrowser.open(url2)
 
 def OpenUrl3():
 webbrowser.open(url3)
 
 def OpenUrl4():
 webbrowser.open(url4)
 
 def OpenUrl5():
 webbrowser.open(url5)
 
 def OpenUrl6():
 webbrowser.open(url6)
 
 def OpenUrl7():
 webbrowser.open(url7)
 
 def close_window():
 window.destroy()
 
 def OpenUrl8():
 webbrowser.open(url8)
 
 # Make window
 window = Tk()
 window.title("About Linux Lite")
 window.geometry("242x242")
 window.resizable(0,0)
 
 # adding a menubar
 menubar = Menu(window)
 window.config(menu=menubar)
 
 helpmenu = Menu(menubar)
 menubar.add_cascade(label='Help', menu=helpmenu)
 
 supportmenu = Menu(menubar)
 menubar.add_cascade(label='Support', menu=supportmenu)
 
 def doPrint(  ): print 'doPrint'
 def doSave(  ): print 'doSave'
 helpmenu.add_command(label='Help Manual (local)', command=OpenUrl8)
 helpmenu.add_command(label='Help Manual (online)', command=OpenUrl4)
 helpmenu.add_command(label='Ask Community', command=OpenUrl5)
 helpmenu = Menu(menubar)
 
 def doPrint(  ): print 'doPrint'
 def doSave(  ): print 'doSave'
 supportmenu.add_command(label='Donate', command=OpenUrl6)
 supportmenu.add_command(label='Shop', command=OpenUrl7)
 supportmenu = Menu(menubar)
 
 # uncomment below to add separator in menu, place code where seperator is wanted
 # filemenu.add_separator(  )
 
 # adding a logo
 photo=PhotoImage(file="logo.png")
 l1 = Button(image=photo,width=160, height=59, command=OpenUrl3)
 l1.grid(row=4, column=0)
 l1.place(x=36.3, y=12)
 l1 = Label(window, text="     ")
 l1.grid(row=5, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=6, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=7, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=8, column=0, sticky=W)
 
 # adding a frame for ll website button
 GUIFrame1=Frame(window)
 GUIFrame1.grid(row=11, column=0)
 
 #adding a frame for last row of buttons
 GUIFrame2=Frame(window)
 GUIFrame2.grid(row=13, column=0)
 
 # define title, nym, year
 l2 = Label(window, text=u"\u00a9Copyright 2012-2018 Jerry Bezencon", fg="grey", font="none 8")
 l2.grid(row=15, column=0)
 
 l3 = Label(window, text="     ")
 l3.grid(row=0, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=10, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=12, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=14, column=0, sticky=W)
 
 l4 = Label(window, text="Current Version: 5.0")
 l4.grid(row=9, column=0)
 
 # ll website button
 l5 = Label(GUIFrame1, text=" ")
 l5.grid(row=11, column=0, sticky=W)
 Button(GUIFrame1, text="Visit Linux Lite website", width=16, command=OpenUrl3).grid(row=11, column=0)
 
 # last row of buttons
 l6 = Label(GUIFrame2, text=" ")
 l6.grid(row=13, column=0)
 Button(GUIFrame2, text="Credits", width=6, command=OpenUrl1).grid(row=13, column=1)
 Button(GUIFrame2, text="License", width=6, command=OpenUrl2).grid(row=13, column=2)
 Button(GUIFrame2, text="Close", width=6, command=window.destroy).grid(row=13, column=3)
 
 window.mainloop()
 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
		
		
		10-20-2018, 07:57 PM 
(This post was last modified: 10-20-2018, 08:00 PM by bitsnpcs.)
		
	 
		App no visual change, same as above. 
Improved code, nomenclature, removed x2 excess lines.
 Code: #!/usr/bin/env python# code by bitsnpcs
 from Tkinter import *
 import webbrowser
 
 url1 = 'https://mityer.khdlhfjijfrupr.tk/development.html#team'
 url2 = 'https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html'
 url3 = 'https://mityer.khdlhfjijfrupr.tk/'
 url4 = 'https://mityer.khdlhfjijfrupr.tk/manual/'
 url5 = 'https://mityer.khdlhfjijfrupr.tk/forums/index.php'
 url6 = 'https://mityer.khdlhfjijfrupr.tk/donate.html'
 url7 = 'https://mityer.khdlhfjijfrupr.tk/shop.html'
 url8 = '/usr/share/doc/litemanual/index.html'
 
 # open browser and display url at line 7 thru 13
 def OpenUrl1():
 webbrowser.open(url1)
 
 def OpenUrl2():
 webbrowser.open(url2)
 
 def OpenUrl3():
 webbrowser.open(url3)
 
 def OpenUrl4():
 webbrowser.open(url4)
 
 def OpenUrl5():
 webbrowser.open(url5)
 
 def OpenUrl6():
 webbrowser.open(url6)
 
 def OpenUrl7():
 webbrowser.open(url7)
 
 def close_window():
 window.destroy()
 
 def OpenUrl8():
 webbrowser.open(url8)
 
 # Make window
 window = Tk()
 window.title("About Linux Lite")
 window.geometry("242x242")
 window.resizable(0,0)
 
 # adding a menubar
 menubar = Menu(window)
 window.config(menu=menubar)
 
 helpmenu = Menu(menubar)
 menubar.add_cascade(label='Help', menu=helpmenu)
 
 supportmenu = Menu(menubar)
 menubar.add_cascade(label='Support', menu=supportmenu)
 
 def doHelp(  ): print 'doHelp'
 
 helpmenu.add_command(label='Help Manual (local)', command=OpenUrl8)
 helpmenu.add_command(label='Help Manual (online)', command=OpenUrl4)
 helpmenu.add_command(label='Ask Community', command=OpenUrl5)
 helpmenu = Menu(menubar)
 
 def doSupport(  ): print 'doSupport'
 
 supportmenu.add_command(label='Donate', command=OpenUrl6)
 supportmenu.add_command(label='Shop', command=OpenUrl7)
 supportmenu = Menu(menubar)
 
 # uncomment below to add separator in menu, place code where seperator is wanted
 # filemenu.add_separator(  )
 
 # adding a logo
 photo=PhotoImage(file="logo.png")
 l1 = Button(image=photo,width=160, height=59, command=OpenUrl3)
 l1.grid(row=4, column=0)
 l1.place(x=36.3, y=12)
 l1 = Label(window, text="     ")
 l1.grid(row=5, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=6, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=7, column=0, sticky=W)
 l1 = Label(window, text="     ")
 l1.grid(row=8, column=0, sticky=W)
 
 # adding a frame for ll website button
 GUIFrame1=Frame(window)
 GUIFrame1.grid(row=11, column=0)
 
 #adding a frame for last row of buttons
 GUIFrame2=Frame(window)
 GUIFrame2.grid(row=13, column=0)
 
 # define title, nym, year
 l2 = Label(window, text=u"\u00a9Copyright 2012-2018 Jerry Bezencon", fg="grey", font="none 8")
 l2.grid(row=15, column=0)
 
 l3 = Label(window, text="     ")
 l3.grid(row=0, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=10, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=12, column=0, sticky=W)
 l3 = Label(window, text="     ")
 l3.grid(row=14, column=0, sticky=W)
 
 l4 = Label(window, text="Current Version: 5.0")
 l4.grid(row=9, column=0)
 
 # ll website button
 l5 = Label(GUIFrame1, text=" ")
 l5.grid(row=11, column=0, sticky=W)
 Button(GUIFrame1, text="Visit Linux Lite website", width=16, command=OpenUrl3).grid(row=11, column=0)
 
 # last row of buttons
 l6 = Label(GUIFrame2, text=" ")
 l6.grid(row=13, column=0)
 Button(GUIFrame2, text="Credits", width=6, command=OpenUrl1).grid(row=13, column=1)
 Button(GUIFrame2, text="License", width=6, command=OpenUrl2).grid(row=13, column=2)
 Button(GUIFrame2, text="Close", width=6, command=window.destroy).grid(row=13, column=3)
 
 window.mainloop()
 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
		
		
		10-20-2018, 08:38 PM 
(This post was last modified: 10-20-2018, 09:12 PM by bitsnpcs.)
		
	 
		Just an experimental change, for opinions/ideas.  
The idea is, the menu bar and the title bar are similarly grey but don't match, to break this effect and that of the gui background and title bar, I thought to try a third colour as a highlight. 
Here I opened the LL Logo in GIMP and took a colour sampling of the feather, got the hex number and used this for the menu bar background colour.  
The menus when dropped down are still grey.
 ![[Image: Screenshot-2018-10-20-21-21-58.png]](https://preview.ibb.co/jsDdqf/Screenshot-2018-10-20-21-21-58.png)  
Edit - 
I forgot to say, when moving the mouse over the Help or Support menus, each changes colour to grey individually, the rest of the menu bar stays the feather colour. 
The drop down menus can also have the colour changed, I've just checked it, and also each menu item changes colour to grey when moused over, but it might be too much as the intention is just to break up the title bar menu bar/gui difference. 
Also the button background the LL logo is on can have its colour changed, plus any of the other buttons,  the button fonts, colours and sizes can be changed. 
The gui background cannot change at this time as I made using a spacing hack, I made it up by trial and error when making the donation builder app, by using labels, so these do not colour when the gui background is coloured, it may be possible to colour each spacing block/label, and so then colour the entire gui background I'd have to try, if it is wanted.
	 
	
	
	
		
	Posts: 9,005 
	Threads: 567 
	Joined: Feb 2014
	
 Reputation: 
12 
	
	
		Have a look in this file, there are some great clues there on how to pull info from LL. Code: #!/usr/bin/env python3# -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 #
 # Distributed under terms of the GPL2 license.
 
 import os
 import sys
 import urllib.request
 import webbrowser
 import subprocess
 import fcntl
 import tkinter
 from configparser import ConfigParser
 import gi
 gi.require_version('WebKit', '3.0')
 from gi.repository import WebKit as webkit
 gi.require_version('Gtk', '3.0')
 from gi.repository import Gtk as gtk
 from gi.repository.GdkPixbuf import Pixbuf
 from os import stat as os_stat
 import datetime
 import apt
 
 
 def run_once():
 global fh
 fh = open(os.path.realpath(__file__), 'r')
 try:
 fcntl.flock(fh, fcntl.LOCK_EX | fcntl.LOCK_NB)
 except:
 run_once_dialog()
 
 
 def run_once_dialog():
 window = gtk.Window()
 dialog = gtk.MessageDialog(None, 0, gtk.MessageType.WARNING,
 gtk.ButtonsType.OK, appname + ' - Error')
 dialog.set_default_size(400, 250)
 dialog.set_transient_for(window)
 dialog.format_secondary_text("There is another instance of " + appname +
 " already running.")
 response = dialog.run()
 
 if response == gtk.ResponseType.OK:
 dialog.destroy()
 sys.exit()
 
 dialog.destroy()
 
 
 def execute(command, ret=True):
 if ret is True:
 p = os.popen(command)
 return p.readline()
 else:
 p = subprocess.Popen(command,
 shell=True,
 stdout=subprocess.PIPE,
 stderr=subprocess.STDOUT)
 return p.stdout
 
 
 def functions(view, frame, req, data=None):
 uri = req.get_uri()
 lllink, path = uri.split('://', 1)
 path = path.replace("%20", " ")
 if lllink == "file":
 return False
 elif lllink == "about":
 about = gtk.AboutDialog()
 about.set_program_name(appname)
 about.set_version(appver)
 about.set_license(
 '''This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 MA 02110-1301, USA. ''')
 about.set_authors([
 "Johnathan 'ShaggyTwoDope'" +
 " Jenkins\n<[email protected]>\n",
 "Jerry Bezencon\n<[email protected]>\n",
 "Milos Pavlovic\n<[email protected]>\n",
 "Brian 'DarthLukan' Tomlinson\n<[email protected]>\n",
 "Josh Erickson\n<[email protected]>"
 ])
 about.set_comments("Designed for Linux Lite")
 about.set_website("http://mityer.khdlhfjijfrupr.tk")
 about.set_logo(Pixbuf.new_from_file(app_icon))
 about.set_transient_for(window)
 about.run()
 about.destroy()
 elif lllink == "admin":
 subprocess.Popen(path, shell=True, executable='/bin/bash')
 elif lllink == "script":
 execute("{0}/scripts/{1}".format(app_dir, path))
 elif lllink == "help":
 webbrowser.open('file:///usr/share/doc/litemanual/index.html')
 elif lllink == "forum":
 webbrowser.open('http://mityer.khdlhfjijfrupr.tk/forums/')
 elif lllink == "website":
 webbrowser.open('http://mityer.khdlhfjijfrupr.tk/')
 elif lllink == "facebook":
 webbrowser.open('https://www.facebook.com/linuxliteos')
 elif lllink == "twitter":
 webbrowser.open('http://www.twitter.com/linuxlite/')
 elif lllink == "google":
 webbrowser.open('https://plus.google.com/+linuxliteos/')
 elif lllink == "linkedin":
 webbrowser.open('http://www.linkedin.com/in/jerrybezencon')
 elif lllink == "screenshot":
 os.system("/bin/bash -c 'scrot -u $HOME/liteccshot.png'")
 subprocess.Popen(['/bin/bash', '-c',
 '/usr/share/litecc/scripts/screenshot'])
 elif lllink == "report":
 subprocess.Popen(['/bin/bash', '-c', 'gksudo /usr/scripts/systemreport'
 ])
 elif lllink == "update":
 subprocess.Popen(['/bin/bash', '-c', 'gksudo /usr/scripts/updates-gui'
 ])
 elif lllink == "refresh":
 reload()
 
 return True
 
 
 def reload():
 info = ""
 get_info(info)
 frontend = frontend_fill()
 browser.load_html_string(frontend, "file://{0}/frontend/".format(app_dir))
 return True
 
 
 def connected(host='http://google.com'):
 try:
 urllib.request.urlopen(host)
 return True
 except:
 return False
 
 
 def mem_info():
 f = open('/proc/meminfo')
 for line in f:
 if line.startswith('MemTotal:'):
 mem_total = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Active:'):
 mem_active = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Inactive:'):
 mem_inactive = (int(line.split()[1]) * 1024.0)
 elif line.startswith('MemFree:'):
 mem_free = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Cached:'):
 mem_cached = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Buffers:'):
 mem_buffers = (int(line.split()[1]) * 1024.0)
 f.close()
 
 return (mem_total, mem_active, mem_inactive, mem_free, mem_cached,
 mem_buffers)
 
 
 def apt_info():
 cache = apt.Cache()
 cache.close()
 cache.open()
 upgrades = 0
 cache.upgrade(dist_upgrade=False)
 changes = cache.get_changes()
 if changes:
 counter = [change.name for change in changes]
 upgrades = (len(counter))
 return upgrades
 
 
 def get_info(info):
 try:
 if info == "os":
 try:
 osin = open('/etc/llver', 'r').read().split('\\n')[0]
 except:
 infocmd = "lsb_release -d | sed 's/Description:[\t]//g'"
 osin = execute(infocmd).split('\\n')[0]
 return osin
 if info == "desk":
 desk_ses = os.environ.get("XDG_SESSION_DESKTOP")
 if desk_ses is None:
 desk_ses = os.environ.get("XDG_CURRENT_DESKTOP")
 if "XFCE" in desk_ses or desk_ses.startswith("xfce"):
 xfcev = "xfce4-session -V | grep xfce4-session"
 return execute(xfcev).split('(')[1].split(')')[0].split(',')[0]
 elif "ubuntu" in desk_ses:
 return "Unity"
 else:
 return desk_ses
 if desk_ses is None:
 desk_ses = "Desktop Unknown"
 return desk_ses
 
 if info == "arc":
 return os.uname()[4]
 if info == "host":
 return os.uname()[1]
 if info == "kernel":
 return "{0} {1}".format(os.uname()[0], os.uname()[2])
 if info == "updates":
 pkgcache = '/var/cache/apt/pkgcache.bin'
 aptcount = apt_info()
 if aptcount == 0:
 count = ''
 elif aptcount == 1:
 count = ' (<font style=\"color: red;\">{0}</font> update available)'.format(
 aptcount)
 else:
 count = ' (<font style=\"color: red;\">{0}</font> updates available)'.format(
 aptcount)
 
 if os.path.isfile(pkgcache):
 mtime = os_stat(pkgcache).st_mtime
 modtime = datetime.datetime.fromtimestamp(mtime).strftime(
 '%Y-%m-%d %H:%M')
 modday = datetime.datetime.fromtimestamp(mtime).strftime(
 '%Y-%m-%d')
 today = datetime.datetime.today().strftime('%Y-%m-%d')
 if modday == today:
 updaters = '''<section class="gradient">Last checked on <font style=\"color: green;\">{0}</font>{1} <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''.format(
 modtime, count)
 else:
 updaters = '''<section class="gradient">Last checked on <font style=\"color: red;\">{0}</font>{1} <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''.format(
 modtime, count)
 else:
 updaters = '''<section class="gradient">No Update History <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''
 
 return updaters
 
 if info == "processor":
 proc = execute("grep 'model name' /proc/cpuinfo").split(':')[1]
 return proc
 if info == "mem":
 total, active, inactive, free, cached, buffers, = mem_info()
 pie = ((int(total) - int(free)) - (int(buffers) + int(cached)))
 mem_usage = float(pie) * 100 / float(total)
 ramdis = "%14dMB (Used: %8dMB %7.2f%%)" % (
 int(total) / 1048576, pie / 1024 / 1024, mem_usage)
 
 return ramdis
 if info == "gfx":
 return execute("lspci | grep VGA").split('controller:')[1].split(
 '(rev')[0].split(',')[0]
 if info == "audio":
 audio = execute("lspci | grep 'Audio device:'")
 if len(audio) == 0:
 return execute("lspci | grep audio").split('controller:')[
 1].split('(rev')[0].split(',')[0]
 else:
 return execute("lspci | grep Audio").split('device:')[1].split(
 '(rev')[0].split(',')[0]
 if info == "disk":
 p1 = subprocess.Popen(
 ['df', '-Tlh', '--total', '-t', 'ext4', '-t', 'ext3', '-t',
 'ext2', '-t', 'reiserfs', '-t'
 'jfs', '-t', 'ntfs', '-t', 'fat32', '-t', 'btrfs', '-t',
 'fuseblk', '-t', 'xfs'],
 stdout=subprocess.PIPE).communicate()[0].decode("Utf-8")
 total = p1.splitlines()[-1]
 used = total.split()[3].replace(total.split()[3][-1:],
 " " + total.split()[3][-1:] + "B")
 size = total.split()[2].replace(total.split()[2][-1:],
 " " + total.split()[2][-1:] + "B")
 disk = "{0} (Used: {1})".format(size, used)
 return disk
 if info == "netstatus":
 if connected():
 status = '<font color=green>Active</font>'
 else:
 status = '<font color=red>Not connected</font>'
 return status
 if info == "netip":
 ip = execute("hostname -I").split(' ')
 if len(ip) > 1:
 ip = ip[0]
 elif ip == "":
 ip = 'None'
 else:
 ip = 'None'
 return ip
 if info == "gateway":
 gateway = execute("route -n | grep 'UG[ \t]' | awk '{print $2}'")
 if len(gateway) == 0:
 gateway = 'None'
 return gateway
 except (OSError, TypeError, Exception) as e:
 print(e)
 return " "
 
 
 def which(program):
 def is_exe(fpath):
 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
 
 fpath, fname = os.path.split(program)
 if fpath:
 if is_exe(program):
 return program
 else:
 for path in os.environ["PATH"].split(os.pathsep):
 path = path.strip('"')
 exe_file = os.path.join(path, program)
 if is_exe(exe_file):
 return exe_file
 
 return None
 
 
 def get_modules(section):
 window = gtk.Window()
 try:
 mod_dir = os.listdir("{0}/modules/{1}/".format(app_dir, section))
 mod_dir.sort()
 except Exception:
 dialog = gtk.MessageDialog(None, 0, gtk.MessageType.WARNING,
 gtk.ButtonsType.OK,
 'Error Importing Module Data')
 dialog.set_default_size(400, 250)
 dialog.format_secondary_text("No modules could be found." +
 " Please reinstall " + appname)
 dialog.set_transient_for(window)
 response = dialog.run()
 if response == gtk.ResponseType.OK:
 dialog.destroy()
 sys.exit()
 dialog.destroy()
 
 if isinstance(mod_dir, list) and len(mod_dir) < 1:
 return "<p>\"no modules found!\"</p>"
 else:
 parser = ConfigParser()
 admin = ""
 mod_dir.sort()
 for i in mod_dir:
 parser.read("{0}/modules/{1}/{2}".format(app_dir, section, i))
 command = parser.get('module', 'command')
 
 chk = command.split(' ')[0]
 if chk == "gksudo":
 chk = command.split(' ')[1]
 elif chk == "gksu":
 chk = command.split(' ')[1]
 checking = which(chk)
 if checking is not None:
 ico = parser.get('module', 'ico')
 ico = "{0}/frontend/icons/modules/{1}".format(app_dir, ico)
 name = parser.get('module', 'name')
 desc = parser.get('module', 'desc')
 command = command.replace("'", ''' \\' ''')
 
 admin += '''<div class="launcher" onclick="location.href='admin://{0}'" >
 <img src="{1}" onerror='this.src = "/usr/share/litecc/frontend/icons/modules/notfound.png"'/>
 <h3>{2}</h3>
 <span>{3}</span>
 </div>'''.format(command, ico, name, desc)
 return admin
 
 
 def frontend_fill():
 filee = open("{0}/frontend/default.html".format(app_dir), "r")
 page = filee.read()
 for i in ['os', 'desk', 'arc', 'processor', 'mem', 'gfx', 'audio', 'disk',
 'kernel', 'updates', 'host', 'netstatus', 'netip', 'gateway']:
 page = page.replace("{%s}" % i, str(get_info(i)))
 sections = ['software', 'system', 'desktop', 'hardware', 'networking']
 sections.sort()
 for i in sections:
 page = page.replace("{%s_list}" % i, get_modules(i))
 filee.close()
 return page
 
 
 def main():
 global browser
 global window
 frontend = frontend_fill()
 window = gtk.Window()
 window.connect('destroy', gtk.main_quit)
 window.set_title(appname)
 window.set_icon(Pixbuf.new_from_file(app_icon))
 rootsize = tkinter.Tk()
 if rootsize.winfo_screenheight() > 700:
 window.set_resizable(False)
 window.set_size_request(880, 660)
 else:
 window.set_resizable(True)
 window.set_size_request(880, 500)
 window.set_position(gtk.WindowPosition.CENTER),
 browser = webkit.WebView()
 swindow = gtk.ScrolledWindow()
 window.add(swindow)
 swindow.add(browser)
 window.show_all()
 browser.connect("navigation-requested", functions)
 browser.load_html_string(frontend, "file://{0}/frontend/".format(app_dir))
 settings = browser.get_settings()
 settings.set_property('enable-default-context-menu', False)
 browser.set_settings(settings)
 gtk.main()
 
 
 if __name__ == '__main__':
 appname = 'Linux Lite Control Center'
 appver = '1.0-0310'
 app_dir = '/usr/share/litecc'
 app_icon = "/usr/share/pixmaps/lite-controlcenter.png"
 fh = 0
 try:
 run_once()
 main()
 except (Exception, AttributeError) as e:
 print("Exiting due to error: {0}".format(e))
 sys.exit(1)
 
	
	
	
		
	Posts: 9,005 
	Threads: 567 
	Joined: Feb 2014
	
 Reputation: 
12 
	
	
		Let's try the title bar for now. I'll see how it fits into the final product. Thank you.
	 
	
	
	
		
	Posts: 3,234 
	Threads: 125 
	Joined: Jul 2014
	
 Reputation: 
0 
	
	
		 (10-21-2018, 02:27 AM)Jerry link Wrote:Have a look in this file, there are some great clues there on how to pull info from LL.
 
 Code: #!/usr/bin/env python3# -*- coding: utf-8 -*-
 # vim:fenc=utf-8
 #
 # Distributed under terms of the GPL2 license.
 
 import os
 import sys
 import urllib.request
 import webbrowser
 import subprocess
 import fcntl
 import tkinter
 from configparser import ConfigParser
 import gi
 gi.require_version('WebKit', '3.0')
 from gi.repository import WebKit as webkit
 gi.require_version('Gtk', '3.0')
 from gi.repository import Gtk as gtk
 from gi.repository.GdkPixbuf import Pixbuf
 from os import stat as os_stat
 import datetime
 import apt
 
 
 def run_once():
 global fh
 fh = open(os.path.realpath(__file__), 'r')
 try:
 fcntl.flock(fh, fcntl.LOCK_EX | fcntl.LOCK_NB)
 except:
 run_once_dialog()
 
 
 def run_once_dialog():
 window = gtk.Window()
 dialog = gtk.MessageDialog(None, 0, gtk.MessageType.WARNING,
 gtk.ButtonsType.OK, appname + ' - Error')
 dialog.set_default_size(400, 250)
 dialog.set_transient_for(window)
 dialog.format_secondary_text("There is another instance of " + appname +
 " already running.")
 response = dialog.run()
 
 if response == gtk.ResponseType.OK:
 dialog.destroy()
 sys.exit()
 
 dialog.destroy()
 
 
 def execute(command, ret=True):
 if ret is True:
 p = os.popen(command)
 return p.readline()
 else:
 p = subprocess.Popen(command,
 shell=True,
 stdout=subprocess.PIPE,
 stderr=subprocess.STDOUT)
 return p.stdout
 
 
 def functions(view, frame, req, data=None):
 uri = req.get_uri()
 lllink, path = uri.split('://', 1)
 path = path.replace("%20", " ")
 if lllink == "file":
 return False
 elif lllink == "about":
 about = gtk.AboutDialog()
 about.set_program_name(appname)
 about.set_version(appver)
 about.set_license(
 '''This program is free software; you can redistribute it and/or modify it
 under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2 of the License, or
 (at your option) any later version.
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
 MA 02110-1301, USA. ''')
 about.set_authors([
 "Johnathan 'ShaggyTwoDope'" +
 " Jenkins\n<[email protected]>\n",
 "Jerry Bezencon\n<[email protected]>\n",
 "Milos Pavlovic\n<[email protected]>\n",
 "Brian 'DarthLukan' Tomlinson\n<[email protected]>\n",
 "Josh Erickson\n<[email protected]>"
 ])
 about.set_comments("Designed for Linux Lite")
 about.set_website("http://mityer.khdlhfjijfrupr.tk")
 about.set_logo(Pixbuf.new_from_file(app_icon))
 about.set_transient_for(window)
 about.run()
 about.destroy()
 elif lllink == "admin":
 subprocess.Popen(path, shell=True, executable='/bin/bash')
 elif lllink == "script":
 execute("{0}/scripts/{1}".format(app_dir, path))
 elif lllink == "help":
 webbrowser.open('file:///usr/share/doc/litemanual/index.html')
 elif lllink == "forum":
 webbrowser.open('http://mityer.khdlhfjijfrupr.tk/forums/')
 elif lllink == "website":
 webbrowser.open('http://mityer.khdlhfjijfrupr.tk/')
 elif lllink == "facebook":
 webbrowser.open('https://www.facebook.com/linuxliteos')
 elif lllink == "twitter":
 webbrowser.open('http://www.twitter.com/linuxlite/')
 elif lllink == "google":
 webbrowser.open('https://plus.google.com/+linuxliteos/')
 elif lllink == "linkedin":
 webbrowser.open('http://www.linkedin.com/in/jerrybezencon')
 elif lllink == "screenshot":
 os.system("/bin/bash -c 'scrot -u $HOME/liteccshot.png'")
 subprocess.Popen(['/bin/bash', '-c',
 '/usr/share/litecc/scripts/screenshot'])
 elif lllink == "report":
 subprocess.Popen(['/bin/bash', '-c', 'gksudo /usr/scripts/systemreport'
 ])
 elif lllink == "update":
 subprocess.Popen(['/bin/bash', '-c', 'gksudo /usr/scripts/updates-gui'
 ])
 elif lllink == "refresh":
 reload()
 
 return True
 
 
 def reload():
 info = ""
 get_info(info)
 frontend = frontend_fill()
 browser.load_html_string(frontend, "file://{0}/frontend/".format(app_dir))
 return True
 
 
 def connected(host='http://google.com'):
 try:
 urllib.request.urlopen(host)
 return True
 except:
 return False
 
 
 def mem_info():
 f = open('/proc/meminfo')
 for line in f:
 if line.startswith('MemTotal:'):
 mem_total = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Active:'):
 mem_active = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Inactive:'):
 mem_inactive = (int(line.split()[1]) * 1024.0)
 elif line.startswith('MemFree:'):
 mem_free = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Cached:'):
 mem_cached = (int(line.split()[1]) * 1024.0)
 elif line.startswith('Buffers:'):
 mem_buffers = (int(line.split()[1]) * 1024.0)
 f.close()
 
 return (mem_total, mem_active, mem_inactive, mem_free, mem_cached,
 mem_buffers)
 
 
 def apt_info():
 cache = apt.Cache()
 cache.close()
 cache.open()
 upgrades = 0
 cache.upgrade(dist_upgrade=False)
 changes = cache.get_changes()
 if changes:
 counter = [change.name for change in changes]
 upgrades = (len(counter))
 return upgrades
 
 
 def get_info(info):
 try:
 if info == "os":
 try:
 osin = open('/etc/llver', 'r').read().split('\\n')[0]
 except:
 infocmd = "lsb_release -d | sed 's/Description:[\t]//g'"
 osin = execute(infocmd).split('\\n')[0]
 return osin
 if info == "desk":
 desk_ses = os.environ.get("XDG_SESSION_DESKTOP")
 if desk_ses is None:
 desk_ses = os.environ.get("XDG_CURRENT_DESKTOP")
 if "XFCE" in desk_ses or desk_ses.startswith("xfce"):
 xfcev = "xfce4-session -V | grep xfce4-session"
 return execute(xfcev).split('(')[1].split(')')[0].split(',')[0]
 elif "ubuntu" in desk_ses:
 return "Unity"
 else:
 return desk_ses
 if desk_ses is None:
 desk_ses = "Desktop Unknown"
 return desk_ses
 
 if info == "arc":
 return os.uname()[4]
 if info == "host":
 return os.uname()[1]
 if info == "kernel":
 return "{0} {1}".format(os.uname()[0], os.uname()[2])
 if info == "updates":
 pkgcache = '/var/cache/apt/pkgcache.bin'
 aptcount = apt_info()
 if aptcount == 0:
 count = ''
 elif aptcount == 1:
 count = ' (<font style=\"color: red;\">{0}</font> update available)'.format(
 aptcount)
 else:
 count = ' (<font style=\"color: red;\">{0}</font> updates available)'.format(
 aptcount)
 
 if os.path.isfile(pkgcache):
 mtime = os_stat(pkgcache).st_mtime
 modtime = datetime.datetime.fromtimestamp(mtime).strftime(
 '%Y-%m-%d %H:%M')
 modday = datetime.datetime.fromtimestamp(mtime).strftime(
 '%Y-%m-%d')
 today = datetime.datetime.today().strftime('%Y-%m-%d')
 if modday == today:
 updaters = '''<section class="gradient">Last checked on <font style=\"color: green;\">{0}</font>{1} <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''.format(
 modtime, count)
 else:
 updaters = '''<section class="gradient">Last checked on <font style=\"color: red;\">{0}</font>{1} <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''.format(
 modtime, count)
 else:
 updaters = '''<section class="gradient">No Update History <button style=\"padding-bottom:0px;padding-left:50pxi\" onclick=\"location.href=('update://')\">Run Updates</button></section>'''
 
 return updaters
 
 if info == "processor":
 proc = execute("grep 'model name' /proc/cpuinfo").split(':')[1]
 return proc
 if info == "mem":
 total, active, inactive, free, cached, buffers, = mem_info()
 pie = ((int(total) - int(free)) - (int(buffers) + int(cached)))
 mem_usage = float(pie) * 100 / float(total)
 ramdis = "%14dMB (Used: %8dMB %7.2f%%)" % (
 int(total) / 1048576, pie / 1024 / 1024, mem_usage)
 
 return ramdis
 if info == "gfx":
 return execute("lspci | grep VGA").split('controller:')[1].split(
 '(rev')[0].split(',')[0]
 if info == "audio":
 audio = execute("lspci | grep 'Audio device:'")
 if len(audio) == 0:
 return execute("lspci | grep audio").split('controller:')[
 1].split('(rev')[0].split(',')[0]
 else:
 return execute("lspci | grep Audio").split('device:')[1].split(
 '(rev')[0].split(',')[0]
 if info == "disk":
 p1 = subprocess.Popen(
 ['df', '-Tlh', '--total', '-t', 'ext4', '-t', 'ext3', '-t',
 'ext2', '-t', 'reiserfs', '-t'
 'jfs', '-t', 'ntfs', '-t', 'fat32', '-t', 'btrfs', '-t',
 'fuseblk', '-t', 'xfs'],
 stdout=subprocess.PIPE).communicate()[0].decode("Utf-8")
 total = p1.splitlines()[-1]
 used = total.split()[3].replace(total.split()[3][-1:],
 " " + total.split()[3][-1:] + "B")
 size = total.split()[2].replace(total.split()[2][-1:],
 " " + total.split()[2][-1:] + "B")
 disk = "{0} (Used: {1})".format(size, used)
 return disk
 if info == "netstatus":
 if connected():
 status = '<font color=green>Active</font>'
 else:
 status = '<font color=red>Not connected</font>'
 return status
 if info == "netip":
 ip = execute("hostname -I").split(' ')
 if len(ip) > 1:
 ip = ip[0]
 elif ip == "":
 ip = 'None'
 else:
 ip = 'None'
 return ip
 if info == "gateway":
 gateway = execute("route -n | grep 'UG[ \t]' | awk '{print $2}'")
 if len(gateway) == 0:
 gateway = 'None'
 return gateway
 except (OSError, TypeError, Exception) as e:
 print(e)
 return " "
 
 
 def which(program):
 def is_exe(fpath):
 return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
 
 fpath, fname = os.path.split(program)
 if fpath:
 if is_exe(program):
 return program
 else:
 for path in os.environ["PATH"].split(os.pathsep):
 path = path.strip('"')
 exe_file = os.path.join(path, program)
 if is_exe(exe_file):
 return exe_file
 
 return None
 
 
 def get_modules(section):
 window = gtk.Window()
 try:
 mod_dir = os.listdir("{0}/modules/{1}/".format(app_dir, section))
 mod_dir.sort()
 except Exception:
 dialog = gtk.MessageDialog(None, 0, gtk.MessageType.WARNING,
 gtk.ButtonsType.OK,
 'Error Importing Module Data')
 dialog.set_default_size(400, 250)
 dialog.format_secondary_text("No modules could be found." +
 " Please reinstall " + appname)
 dialog.set_transient_for(window)
 response = dialog.run()
 if response == gtk.ResponseType.OK:
 dialog.destroy()
 sys.exit()
 dialog.destroy()
 
 if isinstance(mod_dir, list) and len(mod_dir) < 1:
 return "<p>\"no modules found!\"</p>"
 else:
 parser = ConfigParser()
 admin = ""
 mod_dir.sort()
 for i in mod_dir:
 parser.read("{0}/modules/{1}/{2}".format(app_dir, section, i))
 command = parser.get('module', 'command')
 
 chk = command.split(' ')[0]
 if chk == "gksudo":
 chk = command.split(' ')[1]
 elif chk == "gksu":
 chk = command.split(' ')[1]
 checking = which(chk)
 if checking is not None:
 ico = parser.get('module', 'ico')
 ico = "{0}/frontend/icons/modules/{1}".format(app_dir, ico)
 name = parser.get('module', 'name')
 desc = parser.get('module', 'desc')
 command = command.replace("'", ''' \\' ''')
 
 admin += '''<div class="launcher" onclick="location.href='admin://{0}'" >
 <img src="{1}" onerror='this.src = "/usr/share/litecc/frontend/icons/modules/notfound.png"'/>
 <h3>{2}</h3>
 <span>{3}</span>
 </div>'''.format(command, ico, name, desc)
 return admin
 
 
 def frontend_fill():
 filee = open("{0}/frontend/default.html".format(app_dir), "r")
 page = filee.read()
 for i in ['os', 'desk', 'arc', 'processor', 'mem', 'gfx', 'audio', 'disk',
 'kernel', 'updates', 'host', 'netstatus', 'netip', 'gateway']:
 page = page.replace("{%s}" % i, str(get_info(i)))
 sections = ['software', 'system', 'desktop', 'hardware', 'networking']
 sections.sort()
 for i in sections:
 page = page.replace("{%s_list}" % i, get_modules(i))
 filee.close()
 return page
 
 
 def main():
 global browser
 global window
 frontend = frontend_fill()
 window = gtk.Window()
 window.connect('destroy', gtk.main_quit)
 window.set_title(appname)
 window.set_icon(Pixbuf.new_from_file(app_icon))
 rootsize = tkinter.Tk()
 if rootsize.winfo_screenheight() > 700:
 window.set_resizable(False)
 window.set_size_request(880, 660)
 else:
 window.set_resizable(True)
 window.set_size_request(880, 500)
 window.set_position(gtk.WindowPosition.CENTER),
 browser = webkit.WebView()
 swindow = gtk.ScrolledWindow()
 window.add(swindow)
 swindow.add(browser)
 window.show_all()
 browser.connect("navigation-requested", functions)
 browser.load_html_string(frontend, "file://{0}/frontend/".format(app_dir))
 settings = browser.get_settings()
 settings.set_property('enable-default-context-menu', False)
 browser.set_settings(settings)
 gtk.main()
 
 
 if __name__ == '__main__':
 appname = 'Linux Lite Control Center'
 appver = '1.0-0310'
 app_dir = '/usr/share/litecc'
 app_icon = "/usr/share/pixmaps/lite-controlcenter.png"
 fh = 0
 try:
 run_once()
 main()
 except (Exception, AttributeError) as e:
 print("Exiting due to error: {0}".format(e))
 sys.exit(1)
 
Thanks for showing the code.  It is too complex for me, I understand <1% of it. 
It is only useful to let me know, I shouldn't have wasted the time on my efforts, and could have put it to a better use lol, and so I will pass and not embarrass myself further     |