rra
4 years ago
commit
650ec62401
3 changed files with 272 additions and 0 deletions
@ -0,0 +1,18 @@ |
|||
# pom |
|||
|
|||
|
|||
You need python3 and also: |
|||
|
|||
`sudo apt install python3-gi python3-gi-cairo gir1.2-gtk-3.0` |
|||
|
|||
To run: `python3 pom.py` |
|||
|
|||
To edit interface: open `main.glade` in Glade |
|||
|
|||
Useful resources: |
|||
|
|||
<https://python-gtk-3-tutorial.readthedocs.io/en/latest/index.html> |
|||
|
|||
<https://pygobject.readthedocs.io/en/latest/guide/index.html> |
|||
|
|||
|
@ -0,0 +1,143 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!-- Generated with glade 3.36.0 --> |
|||
<interface> |
|||
<requires lib="gtk+" version="3.22"/> |
|||
<object class="GtkImage" id="image1"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
<property name="icon_name">preferences-other</property> |
|||
</object> |
|||
<object class="GtkApplicationWindow" id="Main"> |
|||
<property name="can_focus">False</property> |
|||
<property name="resizable">False</property> |
|||
<property name="icon_name">dialog-ok</property> |
|||
<child> |
|||
<object class="GtkBox"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
<property name="orientation">vertical</property> |
|||
<child> |
|||
<object class="GtkLabel" id="time_display"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
<property name="xpad">12</property> |
|||
<property name="label" translatable="yes">0:00:00</property> |
|||
<attributes> |
|||
<attribute name="font-desc" value="Recursive Heavy 14"/> |
|||
<attribute name="weight" value="book"/> |
|||
<attribute name="scale" value="6"/> |
|||
</attributes> |
|||
</object> |
|||
<packing> |
|||
<property name="expand">False</property> |
|||
<property name="fill">True</property> |
|||
<property name="padding">4</property> |
|||
<property name="position">1</property> |
|||
</packing> |
|||
</child> |
|||
<child> |
|||
<object class="GtkBox"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
<property name="margin_start">18</property> |
|||
<property name="margin_end">18</property> |
|||
<property name="margin_bottom">8</property> |
|||
<child> |
|||
<object class="GtkButton"> |
|||
<property name="label" translatable="yes">Start</property> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">True</property> |
|||
<property name="receives_default">True</property> |
|||
<signal name="clicked" handler="startCountdown" swapped="no"/> |
|||
</object> |
|||
<packing> |
|||
<property name="expand">True</property> |
|||
<property name="fill">True</property> |
|||
<property name="padding">4</property> |
|||
<property name="position">0</property> |
|||
</packing> |
|||
</child> |
|||
<child> |
|||
<object class="GtkButton"> |
|||
<property name="label" translatable="yes">Pause</property> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">True</property> |
|||
<property name="receives_default">True</property> |
|||
<property name="tooltip_text" translatable="yes">Pause the timer</property> |
|||
<signal name="clicked" handler="pauseCountdown" swapped="no"/> |
|||
</object> |
|||
<packing> |
|||
<property name="expand">True</property> |
|||
<property name="fill">True</property> |
|||
<property name="padding">4</property> |
|||
<property name="position">1</property> |
|||
</packing> |
|||
</child> |
|||
<child> |
|||
<object class="GtkButton"> |
|||
<property name="label" translatable="yes">Restart</property> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">True</property> |
|||
<property name="receives_default">True</property> |
|||
<property name="tooltip_text" translatable="yes">Stop the timer</property> |
|||
<signal name="clicked" handler="restartCountdown" swapped="no"/> |
|||
</object> |
|||
<packing> |
|||
<property name="expand">True</property> |
|||
<property name="fill">True</property> |
|||
<property name="padding">4</property> |
|||
<property name="position">2</property> |
|||
</packing> |
|||
</child> |
|||
</object> |
|||
<packing> |
|||
<property name="expand">False</property> |
|||
<property name="fill">False</property> |
|||
<property name="padding">8</property> |
|||
<property name="position">2</property> |
|||
</packing> |
|||
</child> |
|||
</object> |
|||
</child> |
|||
<child type="titlebar"> |
|||
<object class="GtkHeaderBar"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
<property name="spacing">0</property> |
|||
<property name="show_close_button">True</property> |
|||
<child> |
|||
<object class="GtkSwitch" id="modeSwitch"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">True</property> |
|||
<property name="tooltip_text" translatable="yes">Switch to work or break mode</property> |
|||
<property name="halign">center</property> |
|||
<property name="active">True</property> |
|||
</object> |
|||
</child> |
|||
<child> |
|||
<object class="GtkStackSwitcher"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">False</property> |
|||
</object> |
|||
<packing> |
|||
<property name="position">3</property> |
|||
</packing> |
|||
</child> |
|||
<child> |
|||
<object class="GtkButton"> |
|||
<property name="visible">True</property> |
|||
<property name="can_focus">True</property> |
|||
<property name="receives_default">True</property> |
|||
<property name="margin_start">6</property> |
|||
<property name="image">image1</property> |
|||
<property name="always_show_image">True</property> |
|||
</object> |
|||
<packing> |
|||
<property name="pack_type">end</property> |
|||
<property name="position">5</property> |
|||
</packing> |
|||
</child> |
|||
</object> |
|||
</child> |
|||
</object> |
|||
</interface> |
@ -0,0 +1,111 @@ |
|||
|
|||
|
|||
import gi |
|||
import time |
|||
import datetime |
|||
import timeit |
|||
import threading |
|||
|
|||
gi.require_version("Gtk", "3.0") |
|||
from gi.repository import Gtk, GLib |
|||
|
|||
class Main: |
|||
def __init__(self): |
|||
self.timer = None |
|||
self.event = None |
|||
self.timer_running = False |
|||
|
|||
self.builder = Gtk.Builder() |
|||
self.builder.add_from_file('main.glade') |
|||
#self.builder.add_from_file('secondtry.glade') |
|||
self.builder.connect_signals(self) |
|||
|
|||
# button = self.builder.get_object("button") |
|||
# button.connect("clicked", self.printText) |
|||
|
|||
window = self.builder.get_object("Main") |
|||
window.connect('delete-event', Gtk.main_quit) |
|||
window.show() |
|||
|
|||
self.time_display = self.builder.get_object("time_display") |
|||
self.mode_switch = self.builder.get_object('modeSwitch') |
|||
self.mode_switch.connect('notify::active', self.work_break_switch) |
|||
|
|||
self.POMTIME = 25 * 60 |
|||
self.BREAKTIME = 5 * 60 |
|||
self.LONGBREAK = 30 * 60 |
|||
|
|||
self.time_left = self.POMTIME |
|||
|
|||
def updateDisplay(self,time_left): |
|||
self.clock = str(datetime.timedelta(seconds = self.time_left)) |
|||
self.time_display.set_text(self.clock) |
|||
|
|||
def countdown(self): |
|||
#self.time_left |
|||
future = datetime.datetime.now() + datetime.timedelta(seconds=self.time_left) |
|||
|
|||
if self.timer_running: |
|||
while not self.event.is_set(): |
|||
self.updateDisplay(self.time_left) |
|||
self.time_left -= 1 |
|||
|
|||
time.sleep(1) |
|||
|
|||
if datetime.datetime.now() >= future: |
|||
if self.mode_switch.get_active(): |
|||
self.time_left = self.POMTIME |
|||
print('swith on') |
|||
self.mode_switch.set_active(False) |
|||
else: |
|||
self.time_left = self.BREAKTIME |
|||
print('swith off') |
|||
self.mode_switch.set_active(True) |
|||
|
|||
# add alarm or whatev here |
|||
|
|||
#can add an auto continue? |
|||
self.pauseCountdown('') |
|||
|
|||
|
|||
def work_break_switch(self, switch, active): |
|||
if self.mode_switch.get_active(): |
|||
state = "Pomtime" |
|||
self.time_left = self.POMTIME |
|||
else: |
|||
state = "Breaktime" |
|||
self.time_left = self.BREAKTIME |
|||
|
|||
print("Switch was turned to", state) |
|||
self.updateDisplay(self.time_left) |
|||
self.pauseCountdown('') |
|||
|
|||
def startCountdown(self,button): |
|||
print('Pressed start') |
|||
if not self.timer_running: |
|||
print('Started timer') |
|||
self.timer_running = True |
|||
self.timer = threading.Thread(target=self.countdown) |
|||
self.event = threading.Event() |
|||
self.timer.daemon=True |
|||
self.timer.start() |
|||
|
|||
|
|||
def pauseCountdown(self,button): |
|||
print('Pressed stop') |
|||
self.event.set() |
|||
self.timer.join() |
|||
self.timer_running = False |
|||
|
|||
def restartCountdown(self, button): |
|||
print('Pressed restart') |
|||
self.time_left = self.POMTIME |
|||
self.work_break_switch(self.mode_switch,'') |
|||
self.event.set() |
|||
self.startCountdown(button) |
|||
|
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main = Main() |
|||
Gtk.main() |
Loading…
Reference in new issue