libtk.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #!/usr/bin/python3
  2. import os
  3. import time
  4. import tkinter
  5. tk = tkinter
  6. import __main__ as MAIN
  7. from lib.cprint import *
  8. import lib.libwin as libwin
  9. class on_focus():
  10. def __init__(self,name,mode):
  11. self.name = name
  12. self.mode = mode
  13. def cb(self,event=None):
  14. print("on_focus",event,self.name,self.mode)
  15. try:
  16. e = MAIN.master.commands.elem["."]
  17. except:pass
  18. if self.mode == "Out":
  19. cmd="xset -display :0.0 r rate 240 20"
  20. print(cmd)
  21. os.system(cmd)
  22. try:
  23. e["bg"] = "#aaa"
  24. e["activebackground"] = "#aaa"
  25. except:pass
  26. if self.mode == "In":
  27. cmd = "xset -display :0.0 r off"
  28. print(cmd)
  29. os.system(cmd)
  30. try:
  31. e["bg"] = "#fff"
  32. e["activebackground"] = "#fff"
  33. except:pass
  34. class DummyCallback():
  35. def __init__(self,name="name"):
  36. self.name = name
  37. def cb(self,event=None):
  38. cprint("DummyCallback.cb",[self.name,event])
  39. class Window():
  40. def __init__(self,args): #title="title",master=0,width=100,height=100,left=None,top=None,exit=0,cb=None,resize=1):
  41. global MAIN #lf_nr
  42. self.args = {"title":"title","master":0,"width":100,"height":100,"left":None,"top":None,"exit":0,"cb":None,"resize":1}
  43. self.args.update(args)
  44. cprint("Window.init()",id(self.args),color="yellow")
  45. cprint(" ",self.args,color="yellow")
  46. ico_path="./icon/"
  47. self.cb = MAIN.cb
  48. if self.args["master"]:
  49. self.tk = tkinter.Tk()
  50. self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
  51. self.tk.withdraw() # do not draw
  52. self.tk.resizable(self.args["resize"],self.args["resize"])
  53. self.tk.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  54. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  55. cprint(defaultFont)
  56. defaultFont.configure(family="FreeSans",
  57. size=10,
  58. weight="bold")
  59. # MAIN MENUE
  60. try:
  61. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"main.png"))
  62. except Exception as e:
  63. cprint("Exception GUIWindow.__init__",e)
  64. else:
  65. # addtional WINDOW
  66. self.tk = tkinter.Toplevel()
  67. self.tk.iconify()
  68. #self.tk.withdraw() # do not draw
  69. self.tk.protocol("WM_DELETE_WINDOW", self.close_app_win)
  70. self.tk.resizable(self.args["resize"],self.args["resize"])
  71. try:
  72. if "COLORPICKER" in self.args["title"]:
  73. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"picker.png"))
  74. elif "ENCODER" in self.args["title"]:
  75. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"enc.png"))
  76. elif "EXEC" in self.args["title"]:
  77. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  78. elif "FX" in self.args["title"]:
  79. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"fx.png"))
  80. else:
  81. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  82. except Exception as e:
  83. cprint("Exception on load window icon",self.args["title"])
  84. cprint("Exception:",e)
  85. #time.sleep(3)
  86. self.tk.deiconify()
  87. self.tk["bg"] = "black"
  88. self.tk.bind("<Button>",self.callback)
  89. self.tk.bind("<Key>",self.callback)
  90. self.tk.bind("<KeyRelease>",self.callback)
  91. self.tk.bind("<FocusIn>", on_focus(self.args["title"],"In").cb)
  92. self.tk.bind("<FocusOut>", on_focus(self.args["title"],"Out").cb)
  93. self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
  94. MAIN.lf_nr+=1
  95. #self.tk.geometry("270x600+0+65")
  96. geo ="{}x{}".format(self.args["width"],self.args["height"])
  97. if self.args["left"] is not None:
  98. geo += "+{}".format(self.args["left"])
  99. if self.args["top"] is not None:
  100. geo += "+{}".format(self.args["top"])
  101. #self._event_clear = Xevent(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  102. self.tk.geometry(geo)
  103. self.show()
  104. def update_idle_task(self):
  105. if MAIN.INIT_OK:
  106. tkinter.Tk.update_idletasks(MAIN.gui_menu_gui.tk)
  107. pass
  108. def close_app_win(self,event=None):
  109. cprint("close_app_win",self,event,self.args["title"],color="red")
  110. if exit:
  111. if self.title == "MAIN":
  112. libwib.save_window_position()
  113. libwin.save_window_position()
  114. self.tk.destroy()
  115. try:
  116. self.cb("<exit>").cb()
  117. except Exception as e:
  118. cprint("EXCETPION: close_app_win",e,self,color="red")
  119. def title(self,title=None):
  120. if title is None:
  121. return self.tk.title()
  122. else:
  123. #return self.tk.title(title)
  124. self.args["title"] = title
  125. return self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
  126. def show(self):
  127. self.tk.deiconify()
  128. pass
  129. def mainloop(self):
  130. #save_window_position_loop() #like autosave
  131. try:
  132. self.tk.mainloop()
  133. finally:
  134. self.tk.quit()
  135. cmd="xset -display :0.0 r rate 240 15"
  136. print(cmd)
  137. os.system(cmd)
  138. def callback(self,event,data={}):#value=255):
  139. #global MAIN._global_short_key
  140. sstart = time.time()
  141. #time.sleep(0.1)
  142. if not MAIN._global_short_key:
  143. return 1
  144. #global MAIN #_shift_key
  145. #cprint("<GUI>",event,color="yellow")
  146. value = 255
  147. if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
  148. value = 0
  149. cprint("<GUI>",event.state,data,value,[event.type,event.keysym],color="yellow")
  150. #print(event)
  151. if "state" in dir(event) and "keysym" in dir(event):
  152. #print([event.state,event.keysym,event.type])
  153. if event.state == 4 and str(2) == str(event.type): # strg + s
  154. if str(event.keysym) == "s":
  155. cprint("tTtT ReW "*20)
  156. #print("numbersign !!")
  157. MAIN.PRESETS.backup_presets()
  158. MAIN.FIXTURES.backup_patch()
  159. libwin.save_window_position()
  160. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  161. #print(e)
  162. b = MAIN.BLINKI(e)
  163. b.blink()
  164. if str(event.keysym) == "c":
  165. MAIN.PRESETS.backup_presets()
  166. MAIN.FIXTURES.backup_patch()
  167. libwin.save_window_position()
  168. #self.elem.config(activebackground="lightgrey")
  169. MAIN.LOAD_SHOW_AND_RESTART("").cb(force=1)
  170. #cprint("oipo "*10,round(int(time.time()-sstart)*1000,2))
  171. return
  172. if "keysym" in dir(event):
  173. if "Escape" == event.keysym:
  174. MAIN.FIXTURES.clear()
  175. MAIN.modes.val("ESC",1)
  176. MAIN.master.refresh_fix()
  177. elif event.keysym in ["Shift_L","Shift_R"]:
  178. #cprint(event.type)
  179. if "KeyRelease" in str(event.type) or str(event.type) in ["3"]:
  180. MAIN._shift_key = 0
  181. else:
  182. MAIN._shift_key = 1
  183. #cprint("SHIFT_KEY",_shift_key,"??????????")
  184. #cprint("SHIFT_KEY",_shift_key,"??????????")
  185. #global MAIN #_ENCODER_WINDOW
  186. try:
  187. if MAIN._shift_key:
  188. MAIN._ENCODER_WINDOW.title("SHIFT/FINE ")
  189. else:
  190. MAIN._ENCODER_WINDOW.title("ENCODER")
  191. except Exception as e:
  192. cprint("exc9800",e)
  193. #raise e
  194. elif event.keysym in "ebfclrmsRx" and value:
  195. if "e" == event.keysym:
  196. MAIN.modes.val("EDIT",1)
  197. elif "b" == event.keysym:
  198. MAIN.modes.val("BLIND",1)
  199. elif "f" == event.keysym:
  200. MAIN.modes.val("FLASH",1)
  201. elif "c" == event.keysym:
  202. MAIN.modes.val("CFG-BTN",1)
  203. elif "l" == event.keysym:
  204. MAIN.modes.val("LABEL",1)
  205. elif "r" == event.keysym:
  206. MAIN.modes.val("REC",1)
  207. elif "R" == event.keysym:
  208. MAIN.modes.val("REC-FX",1)
  209. elif "x" == event.keysym:
  210. MAIN.modes.val("REC-FX",1)
  211. elif "m" == event.keysym:
  212. x=MAIN.modes.val("MOVE",1)
  213. if not x:
  214. MAIN.PRESETS.clear_move()
  215. elif "s" == event.keysym:
  216. MAIN.modes.val("SELECT",1)
  217. elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
  218. nr = int( event.keysym[1:]) # F:1-12
  219. nr = nr-1+81
  220. cprint("F-KEY",value,nr,event.keysym)
  221. #print(event)
  222. MAIN.master.preset_go(nr-1,xfade=None,val=value)
  223. elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
  224. nr = int( event.keysym)
  225. if nr == 0:
  226. nr = 10
  227. nr = nr-1+161
  228. cprint("NUM-KEY",value,nr)
  229. MAIN.master.preset_go(nr-1,xfade=None,val=value)
  230. elif "numbersign" == event.keysym and value: # is char "#"
  231. cprint("numbersign !!")
  232. MAIN.PRESETS.backup_presets()
  233. MAIN.FIXTURES.backup_patch()
  234. libwin.save_window_position()
  235. for e in MAIN.master.setup_cmd:
  236. cprint(e)
  237. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  238. cprint(e)
  239. b = MAIN.BLINKI(e)
  240. b.blink()
  241. #e = Xevent(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
  242. #e.cb(event=event)
  243. elif "End" == event.keysym:
  244. MAIN.FIXTURES.fx_off("all")
  245. CONSOLE.fx_off("all")
  246. CONSOLE.flash_off("all")
  247. elif "Delete" == event.keysym:
  248. #MAIN.PRESETS.delete(nr)
  249. if value:
  250. MAIN.modes.val("DEL",1)
  251. cprint("oipo "*10,round(int(time.time()-sstart)*1000,2))
  252. class PopupList():
  253. def __init__(self,name="<NAME>",master=0,width=400,height=450,exit=1,left=MAIN._POS_LEFT+400,top=MAIN._POS_TOP+100,cb=None,bg="black"):
  254. self.name = name
  255. self.frame = None
  256. self.bg=bg
  257. self.cb = cb
  258. if cb is None:
  259. cb = DummyCallback #("load_show_list.cb")
  260. #w = Window(self.name,master=master,width=width,height=height,exit=exit,left=left,top=top,cb=cb)
  261. args = {"title":self.name,"master":master,"width":width,"height":height,"exit":exit,"left":left,"top":top,"cb":cb}
  262. w = Window(args)
  263. self.w = w
  264. w.show()
  265. def sframe(self,line1="<line1>",line2="<line2>",data=[]):
  266. xframe=self.w.tk
  267. if self.bg:
  268. xframe.configure(bg=self.bg)
  269. self.w.tk.configure(bg=self.bg)
  270. c=0
  271. r=0
  272. b = tk.Label(xframe,bg="grey",text=line1,anchor="w")
  273. b.pack(side="top",expand=0,fill="x" )
  274. b = tk.Label(xframe,bg="grey",text=line2,anchor="w")
  275. b.pack(side="top",expand=0,fill="x" )
  276. b = tk.Label(xframe,bg="black",fg="black",text="")
  277. if self.bg:
  278. b.configure(fg=self.bg)
  279. b.configure(bg=self.bg)
  280. b.pack(side="top")
  281. b = tk.Entry(xframe,width=10,text="")#,anchor="w")
  282. b.pack(side="top",expand=0,fill="x")
  283. b["state"] = "readonly"
  284. b.focus()
  285. #frame = tk.Frame(xframe,heigh=2800)
  286. #frame.pack(fill=tk.BOTH,expand=1, side=tk.TOP)
  287. frame = MAIN.ScrollFrame(xframe,width=300,height=500,bd=1,bg=self.bg)
  288. #frame.pack(side="left") #fill=tk.BOTH,expand=1, side=tk.TOP)
  289. #self.frame = frame
  290. self.w.tk.state(newstate='normal')
  291. self.w.tk.attributes('-topmost',True)
  292. return frame
  293. def showwarning(msg="<ERROR>",title="<TITLE>"):
  294. cprint("showwarning","MSG:",msg,"tilte:",title)
  295. if IS_GUI:
  296. _main = tkinter.Tk()
  297. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  298. cprint("showwarning",defaultFont)
  299. if IS_GUI:
  300. defaultFont.configure(family="FreeSans",
  301. size=10,
  302. weight="normal")
  303. geo ="{}x{}".format(20,20)
  304. _main.geometry(geo)
  305. def _quit():
  306. time.sleep(1/10)
  307. _main.quit()
  308. thread.start_new_thread(_main.mainloop,())
  309. #_main.quit()
  310. #msg="'{}'\n Show Does Not Exist\n\n".format(show_name)
  311. #msg += "please check\n"
  312. #msg += "-{}init.txt\n".format(self.show_path0)
  313. #msg += "-{}".format(self.show_path1)
  314. r=tkinter.messagebox.showwarning(message=msg,title=title,parent=None)