Advertisement
Guest User

Untitled

a guest
Jan 17th, 2020
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.36 KB | None | 0 0
  1. from tkinter import *
  2.  
  3. from datetime import datetime, timedelta
  4. ##custom imports
  5. from aceutil import TkUtils, Log #download from https://pastebin.com/yUaMxmv3
  6. from tkutils import * #download from https://pastebin.com/TLdsJ2er
  7.  
  8. class TKGUI:
  9. def __init__(self):
  10. self.log = Log("Alarm Clock")
  11.  
  12. self.root= Tk() ##initilise the main window
  13. self.tku = TkUtils(self.log, self.root)
  14. self.quit = False ##defaults the quit flag
  15. self.multi_alarms = {}
  16. self.next_alarms = {}
  17.  
  18.  
  19. def add_alarm(self, event, date=[], time=[], days=[], ty=""):
  20. if ty == "Multi":
  21. al_time = time[0].get()+":"+time[1].get()+":00"
  22. d = [0] * len(days)
  23. for i in range(len(days)):
  24. d[i] = days[i].get()
  25. if len(self.multi_alarms) < 1:
  26. self.multi_alarms[0] = [al_time] + d
  27. else:
  28. self.multi_alarms[max(self.multi_alarms.keys())+1] = [al_time] + d
  29. self.list_alarms()
  30.  
  31. def add_alarm_window(self, a=None, b=None, c=None, event=Event(), al_type=None):
  32. over = self.tku.overlay(self.root, Event(), "Add Alarms", height=200, width=320)
  33. window = self.tku.cFrame(over, padx=5, pady=5, fill=BOTH, expand=1, bg="white")
  34. holder = self.tku.cFrame(window, side=TOP, fill=BOTH, expand=1, bg="white")
  35. can = Canvas(holder, bg="white", highlightthickness=0)
  36. can.pack(side=TOP, fill=BOTH, expand=1)
  37. holder2 = self.tku.cFrame(can, fill=X)
  38. scroll, can2 = self.tku.scrollable_area2(can)
  39. holder3= self.tku.cFrame(scroll, side=TOP, borderwidth=1, relief="groove")
  40.  
  41.  
  42. al = {}
  43. tyF = self.tku.cFrame(holder3, side=TOP, fill=X)
  44. Label(tyF, text="Type", justify=RIGHT, anchor="e", bg="white", borderwidth=1, relief="groove", width=10).pack(side=LEFT)
  45. al_types = ["Single", "Multi"]
  46. alV= StringVar(tyF)
  47. if al_type == None:
  48. alV.set(None)
  49. else:
  50. alV.set(al_type.get())
  51. al['type'] = OptionMenu(*(tyF, alV) + tuple(al_types))
  52. al['type'].pack(side=LEFT)
  53.  
  54. alV.trace("w", lambda a, b, c, e=Event(), t=alV: self.add_alarm_window(a, b, c, event, t))
  55.  
  56. dt_picker = self.tku.cFrame(holder3, fill=BOTH, expand=1)
  57. if al_type != None:
  58. if al_type.get() == "Multi":
  59. lables = self.tku.cFrame(holder3, fill=X, expand=1)
  60. w=4
  61. Label(dt_picker, text="Time", borderwidth=1, relief="raised", width=10).pack(side=LEFT)
  62. Label(dt_picker, text="M", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  63. Label(dt_picker, text="T", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  64. Label(dt_picker, text="W", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  65. Label(dt_picker, text="T", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  66. Label(dt_picker, text="F", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  67. Label(dt_picker, text="S", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  68. Label(dt_picker, text="S", borderwidth=1, relief="raised", width=w).pack(side=LEFT)
  69. options = self.tku.cFrame(holder3, fill=X, expand=1)
  70. hhV = StringVar()
  71. hh = MaxLengthEntry(options, maxlength=2, valtype="int/hour", width=3, textvariable=hhV)
  72. hh.pack(side=LEFT)
  73. Label(options, text=":", width=3).pack(side=LEFT)
  74. mmV = StringVar()
  75. mm = MaxLengthEntry(options, maxlength=2, valtype="int/minute", width=3, textvariable=mmV)
  76. mm.pack(side=LEFT)
  77. ckw = 1
  78. Monv = IntVar()
  79. Mon = Checkbutton(options, variable=Monv, width=ckw, borderwidth=1, relief="groove")
  80. Mon.pack(side=LEFT)
  81.  
  82. Tuev = IntVar()
  83. Tue = Checkbutton(options, variable=Tuev, width=ckw, borderwidth=1, relief="groove")
  84. Tue.pack(side=LEFT)
  85.  
  86. Wedv = IntVar()
  87. Wed = Checkbutton(options, variable=Wedv, width=ckw, borderwidth=1, relief="groove")
  88. Wed.pack(side=LEFT)
  89.  
  90. Thuv = IntVar()
  91. Thu = Checkbutton(options, variable=Thuv, width=ckw, borderwidth=1, relief="groove")
  92. Thu.pack(side=LEFT)
  93.  
  94. Friv = IntVar()
  95. Fri = Checkbutton(options, variable=Friv, width=ckw, borderwidth=1, relief="groove")
  96. Fri.pack(side=LEFT)
  97.  
  98. Satv = IntVar()
  99. Sat = Checkbutton(options, variable=Satv, width=ckw, borderwidth=1, relief="groove")
  100. Sat.pack(side=LEFT)
  101.  
  102. Sunv = IntVar()
  103. Sun = Checkbutton(options, variable=Sunv, width=ckw, borderwidth=1, relief="groove")
  104. Sun.pack(side=LEFT)
  105.  
  106. self.tku.cButton(holder3, text="Add", command=lambda e=Event(), t=[hh, mm], day=[Monv, Tuev, Wedv, Thuv, Friv, Satv, Sunv], ty="Multi": self.add_alarm(e, time=t, days=day, ty=ty))
  107. OPTIONS = [
  108. "Jan",
  109. "Feb",
  110. "Mar"
  111. ]
  112. variable = StringVar(self.root)
  113. variable.set(OPTIONS[0])
  114. self.root = OptionMenu(self.root, variable, *OPTIONS)
  115. self.root.pack()
  116.  
  117.  
  118. def open_edit(self, event, al_id):
  119. alarm = self.multi_alarms[al_id]
  120. print(alarm)
  121.  
  122. def list_alarms(self):
  123. children = self.alarms.winfo_children()
  124. for child in children:
  125. child.pack_forget()
  126. child.destroy()
  127. days = [0, "M", "T", "W", "T", "F", "S", "S"]
  128. for key, value in self.multi_alarms.items():
  129. row = self.tku.cFrame(self.alarms, fill=X, side=TOP)
  130. Label(row, text=value[0]).pack(side=LEFT)
  131. hol=Frame(row, borderwidth=1, relief="groove")
  132. hol.pack(side=LEFT)
  133. for x in range(1, len(value)):
  134. if value[x] == 1:
  135. Label(hol, text=days[x], fg="blue", bg="white").pack(side=LEFT)
  136. else:
  137. Label(hol, text=days[x], fg="lightgray", bg="white").pack(side=LEFT)
  138. self.tku.cButton(row, text="Update", command=lambda e=Event(), al_id=key: self.open_edit(e, al_id))
  139. self.tku.cButton(row, text="Delete", command=lambda e=Event(), al_id=key: self.delete(e, al_id))
  140.  
  141. def trigger_alarm(self, al_id):
  142. print("Alarm Triggered for %s at %s" %(int(al_id), self.multi_alarms[al_id][0]))
  143.  
  144. def delete(self, event, al_id):
  145. print(self.multi_alarms[al_id])
  146. print(self.multi_alarms)
  147. del self.multi_alarms[al_id]
  148. self.list_alarms()
  149.  
  150. def trigger_alarms(self):
  151. now = datetime.now()
  152. complete = []
  153. for key, value in self.multi_alarms.items():
  154. if now.strftime("%H:%M:%S") == self.multi_alarms[key][0] and value[now.weekday()+1] == 1:
  155. self.trigger_alarm(key)
  156. complete.append(key)
  157. for k in complete:
  158. self.next_alarms[k] = self.multi_alarms[k]
  159. del self.multi_alarms[k]
  160. if now.strftime("%H:%M:%S") == "00:00:01": #resets the alarms for the next day
  161. self.multi_alarms = self.next_alarms
  162.  
  163. def update_clock(self):
  164. now = datetime.now()
  165. self.timer.configure(text=now.strftime("%H:%M:%S"))
  166.  
  167. def run(self): ##main part of the application
  168. self.root.configure(bg="white") #sets the background to white rather than default gray.
  169. self.root.protocol("WM_DELETE_WINDOW", self.quitting) ##changes the X (close) Button to run a function instead.
  170. try:
  171. self.root.iconbitmap("fav.ico") ##sets the application Icon
  172. except:
  173. pass
  174. self.root.title("MyApp")
  175. self.root.geometry("800x600")
  176.  
  177.  
  178. #the current time
  179. clock = self.tku.cFrame(self.root, fill=X, bg="Blue", side=TOP)
  180. self.timer = Label(clock, text="00:00:00")
  181. self.timer.pack(side=TOP, fill=X)
  182.  
  183. self.tku.cButton(self.root, side=TOP, text="+", command=lambda e=Event(): self.add_alarm_window(e))
  184.  
  185. #section for alarms to sit
  186. scrollarea, can2 = self.tku.scrollable_area2(self.root)
  187. self.alarms = self.tku.cFrame(scrollarea, borderwidth=2, relief="groove", bg="white", fill=BOTH, expand=1, side=TOP)
  188.  
  189.  
  190. while not self.quit: ##flag to quit the application
  191. self.root.update_idletasks() #updates the root. same as root.mainloop() but safer and interruptable
  192. self.root.update() #same as above. This lest you stop the loop or add things to the loop.
  193. #add extra functions here if you need them to run with the loop#
  194. self.update_clock()
  195. self.trigger_alarms()
  196.  
  197. def quitting(self): ##to set the quit flag
  198. self.quit = True
  199.  
  200. if __name__ == "__main__":
  201. app = TKGUI() ##creates instance of GUI class
  202. try:
  203. app.run()# starts the application
  204. except KeyboardInterrupt:
  205. app.quitting() ##safely quits the application when crtl+C is pressed
  206. except:
  207. raise #you can change this to be your own error handler if needed
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement