10
10
description: Python/GTK/Glade app to capture a screenshot of your desktop.
13
import sys, os, subprocess, signal, re, time
14
import gobject, gtk, gtk.gdk, pango, gtk.glade, pygtk
13
import sys, os, subprocess, signal, re, time, sqlite3, \
14
gobject, gtk, gtk.gdk, pango, gtk.glade, pygtk
16
16
APPNAME = "pyscreenie"
18
18
APPCONFDIR = os.environ["HOME"] + '/.pyscreenie'
19
19
GLADEFILE = "/usr/share/pyscreenie/pyscreenie.glade"
20
20
#GLADEFILE = "glade/pyscreenie.glade"
21
21
SCHEDULER = 'pyscreenie-scheduler'
22
22
PIDFILE = APPCONFDIR + '/pyscreenie.pid'
23
CONFIGFILE = APPCONFDIR + "/config.db"
24
25
print "\n\n" + APPNAME + " version " + APPVERSION + ", Copyright (C) 2008 - TheLupine"
25
26
print APPNAME + " comes with ABSOLUTELY NO WARRANTY, is licensed under the"
46
gtkbuilder = gtk.Builder()
47
gtkbuilder.add_from_file(GLADEFILE)
50
self.statusicon = gtkbuilder.get_object('statusicon')
51
self.prefs_dialog = gtkbuilder.get_object('prefs_dialog')
52
self.menu_rightclick = gtkbuilder.get_object('menu_statusicon')
53
self.label_version = gtkbuilder.get_object('label_version')
54
self.about_dialog = gtkbuilder.get_object('about_dialog')
55
self.statusicon_menuitem_enable = gtkbuilder.get_object('statusicon_menuitem_enable')
56
self.radiobutton_repeatyes = gtkbuilder.get_object('radiobutton_repeatyes')
57
self.radiobutton_repeatno = gtkbuilder.get_object('radiobutton_repeatno')
58
self.filechooser_screeniepath = gtkbuilder.get_object('filechooser_screeniepath')
59
self.spinbutton_hour = gtkbuilder.get_object('spinbutton_hour')
60
self.spinbutton_minute = gtkbuilder.get_object('spinbutton_minute')
61
self.radiobutton_minute = gtkbuilder.get_object('radiobutton_minute')
62
self.radiobutton_hour = gtkbuilder.get_object('radiobutton_hour')
63
self.radiobutton_day = gtkbuilder.get_object('radiobutton_day')
64
self.radiobutton_week = gtkbuilder.get_object('radiobutton_week')
65
self.radiobutton_png = gtkbuilder.get_object('radiobutton_png')
66
self.radiobutton_jpg = gtkbuilder.get_object('radiobutton_jpg')
67
self.label_compression = gtkbuilder.get_object('label_compression')
68
self.spinbutton_compression = gtkbuilder.get_object('spinbutton_compression')
70
signals = { 'on_menuitem_about_activate' : self.on_about_menu_activate,
71
'on_menuitem_close_activate' : self.on_menuitem_close_activate,
72
'on_menuitem_quit_activate' : self.main_quit,
73
'on_statusicon_button_press_event' : self.on_statusicon_button_press_event,
74
'on_statusicon_menuitem_enable_toggled': self.on_statusicon_menuitem_enable_toggled,
75
'on_statusicon_menuitem_prefs_activate' : self.on_statusicon_menuitem_prefs_activate,
76
'on_statusicon_menuitem_about_activate' : self.on_about_menu_activate,
77
'on_statusicon_menuitem_quit_activate' : self.main_quit,
78
'on_about_menu_activate' : self.on_about_menu_activate,
79
'on_about_close_button_clicked' : self.on_about_dialog_delete_event,
80
'on_about_dialog_delete_event' : self.on_about_dialog_delete_event,
81
'on_prefs_dialog_delete_event' : self.on_menuitem_close_activate,
82
'on_button_cancel_clicked' : self.on_menuitem_close_activate,
83
'on_button_enable_clicked' : self.on_button_enable_clicked,
84
'on_radiobutton_jpg_clicked' : self.on_radiobutton_jpg_clicked,
85
'on_radiobutton_png_clicked' : self.on_radiobutton_png_clicked
87
gtkbuilder.connect_signals(signals)
89
#setup some initial values of certain widgets
90
self.statusicon.set_tooltip(APPNAME)
92
#cleanup left over PIDs and config files (possibly from a crash or logout)
95
47
def startupcleanup(self):
96
48
"""This function will remove any existing PID or conf files"""
220
176
#spawn the process
221
177
self.spawn_child(datestamp, location, pngorjpg, starttime, repeat, everywhen)
222
178
self.statusicon.set_tooltip(APPNAME + ' - enabled')
180
#update the CONFIGFILE
181
self.update_configfile(savepath, filetype, getcomp, starthour, startmin, \
224
184
self.clear_conf_files()
225
185
self.stop_child()
226
186
self.statusicon.set_tooltip(APPNAME)
188
def check_sqlitedb(self):
190
This function will check for the sqlite3 file, and if not exist
191
it will create it. If it does exist, it will perform any DB
192
updates that are needed.
194
if os.path.isfile(CONFIGFILE):
195
sqlconn = sqlite3.connect(CONFIGFILE)
196
sqlcursor = sqlconn.cursor()
197
sqlcursor.execute('''pragma table_info('options')''')
199
# this is what the current schema should look like
203
4|compression|int|0||0
207
8|repeatevery|text|0||0
211
sqlite3.connect(CONFIGFILE)
213
errormessage = 'Unable to connect to sqlite3 file:\n' \
215
'\nYou will not be able to save config options.\n\n'
218
sqlconn = sqlite3.connect(CONFIGFILE)
219
sqlcursor = sqlconn.cursor()
220
sqlcursor.execute('''create table if not exists options
228
repeatevery text)''')
230
sqlcursor.execute('''INSERT INTO options VALUES (?,?,?,?,?,?,?,?)
231
''',("0","","png","0","0","0","True","min") )
235
def read_configfile(self):
237
This function will read in the settings from the sqlite
238
CONFIGFILE file, and populate the necessary values
248
sqlconn = sqlite3.connect(CONFIGFILE)
249
sqlcursor = sqlconn.cursor()
250
#first look through the sqlite db, and assign values to variables
251
for row in sqlcursor.execute("SELECT * FROM options"):
254
self.filechooser_screeniepath.set_uri(savepath)
258
if filetype == "png":
259
self.radiobutton_png.set_active(1)
260
if filetype == "jpg":
261
self.radiobutton_jpg.set_active(1)
262
self.label_compression.set_text(compression)
265
compression = str(row[3])
266
self.spinbutton_compression.set_text(compression)
270
self.spinbutton_hour.set_text(hour)
274
self.spinbutton_minute.set_text(minute)
278
if repeat == "False":
279
self.radiobutton_repeatno.set_active(1)
281
self.radiobutton_repeatyes.set_active(1)
285
if repeatevery == "min":
286
self.radiobutton_minute.set_active(1)
287
if repeatevery == "hour":
288
self.radiobutton_hour.set_active(1)
289
if repeatevery == "day":
290
self.radiobutton_day.set_active(1)
291
if repeatevery == "week":
292
self.radiobutton_week.set_active(1)
294
def update_configfile(self,savepath,filetype,compression,hour, \
295
minute,repeat,repeatevery):
297
This function will update the CONFIGFILE file
299
sqlconn = sqlite3.connect(CONFIGFILE)
300
sqlcursor = sqlconn.cursor()
301
values = (savepath,filetype,compression,hour, \
302
minute,repeat,repeatevery,"0")
303
sqlcursor.execute('''
312
WHERE id=? ''', values)
313
#update and close the database
319
gtkbuilder = gtk.Builder()
320
gtkbuilder.add_from_file(GLADEFILE)
323
self.statusicon = gtkbuilder.get_object('statusicon')
324
self.prefs_dialog = gtkbuilder.get_object('prefs_dialog')
325
self.menu_rightclick = gtkbuilder.get_object('menu_statusicon')
326
self.label_version = gtkbuilder.get_object('label_version')
327
self.about_dialog = gtkbuilder.get_object('about_dialog')
328
self.statusicon_menuitem_enable = gtkbuilder.get_object('statusicon_menuitem_enable')
329
self.radiobutton_repeatyes = gtkbuilder.get_object('radiobutton_repeatyes')
330
self.radiobutton_repeatno = gtkbuilder.get_object('radiobutton_repeatno')
331
self.filechooser_screeniepath = gtkbuilder.get_object('filechooser_screeniepath')
332
self.spinbutton_hour = gtkbuilder.get_object('spinbutton_hour')
333
self.spinbutton_minute = gtkbuilder.get_object('spinbutton_minute')
334
self.radiobutton_minute = gtkbuilder.get_object('radiobutton_minute')
335
self.radiobutton_hour = gtkbuilder.get_object('radiobutton_hour')
336
self.radiobutton_day = gtkbuilder.get_object('radiobutton_day')
337
self.radiobutton_week = gtkbuilder.get_object('radiobutton_week')
338
self.radiobutton_png = gtkbuilder.get_object('radiobutton_png')
339
self.radiobutton_jpg = gtkbuilder.get_object('radiobutton_jpg')
340
self.label_compression = gtkbuilder.get_object('label_compression')
341
self.spinbutton_compression = gtkbuilder.get_object('spinbutton_compression')
343
signals = { 'on_menuitem_about_activate' : self.on_about_menu_activate,
344
'on_menuitem_close_activate' : self.on_menuitem_close_activate,
345
'on_menuitem_quit_activate' : self.main_quit,
346
'on_statusicon_button_press_event' : self.on_statusicon_button_press_event,
347
'on_statusicon_menuitem_enable_toggled': self.on_statusicon_menuitem_enable_toggled,
348
'on_statusicon_menuitem_prefs_activate' : self.on_statusicon_menuitem_prefs_activate,
349
'on_statusicon_menuitem_about_activate' : self.on_about_menu_activate,
350
'on_statusicon_menuitem_quit_activate' : self.main_quit,
351
'on_about_menu_activate' : self.on_about_menu_activate,
352
'on_about_close_button_clicked' : self.on_about_dialog_delete_event,
353
'on_about_dialog_delete_event' : self.on_about_dialog_delete_event,
354
'on_prefs_dialog_delete_event' : self.on_menuitem_close_activate,
355
'on_button_cancel_clicked' : self.on_menuitem_close_activate,
356
'on_button_enable_clicked' : self.on_button_enable_clicked,
357
'on_radiobutton_jpg_clicked' : self.on_radiobutton_jpg_clicked,
358
'on_radiobutton_png_clicked' : self.on_radiobutton_png_clicked
360
gtkbuilder.connect_signals(signals)
362
#setup some initial values of certain widgets
363
self.statusicon.set_tooltip(APPNAME)
365
#cleanup left over PIDs and config files (possibly from a crash or logout)
366
self.startupcleanup()
368
#perform some initialization functions
369
self.check_sqlitedb()
370
self.read_configfile()
228
372
if __name__ == "__main__":
229
373
pyscreenie = pyscreenie()
230
374
gtk.gdk.threads_enter()