libtk.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. #!/usr/bin/python3
  2. import os
  3. import time
  4. import json
  5. import sys
  6. sys.path.insert(0,"/opt/LibreLight/Xdesk/")
  7. import tkinter
  8. tk = tkinter
  9. import __main__ as MAIN
  10. from lib.cprint import cprint
  11. import lib.libwin as libwin
  12. import lib.baselib as baselib
  13. import tkgui.dialog as dialoglib
  14. dialog = dialoglib.Dialog()
  15. _config = []
  16. try:
  17. h = os.environ["HOME"]
  18. lines = [{}]
  19. try:
  20. f = open(h +"/LibreLight/config.json")
  21. lines = f.readlines()
  22. except FileNotFoundError as e: #Exception as e:
  23. f = open(h +"/LibreLight/config.json","w")
  24. f.write('{"POS_TOP":0}\n{"POS_LEFT":0}')
  25. f.close()
  26. cprint("Exception:",e)
  27. cprint("config read")
  28. for line in lines:
  29. line=line.strip()
  30. print(" config:",line)
  31. row = json.loads(line)
  32. _config.append(row)
  33. except Exception as e:
  34. cprint("Exception:",e)
  35. _POS_LEFT = 0
  36. _POS_TOP = 15
  37. try:
  38. for row in _config:
  39. #print(" config:",row)
  40. if "POS_LEFT" in row:
  41. _POS_LEFT = int(row["POS_LEFT"])
  42. if "POS_TOP" in row:
  43. _POS_TOP = int(row["POS_TOP"])
  44. except Exception as e:
  45. cprint("Exception:",e)
  46. class Event():
  47. def __init__(self,name):
  48. self.name=name
  49. #print("init",self)
  50. def event(self,event):
  51. print(self.name,event)
  52. class scroll():
  53. def __init__(self,canvas):
  54. self.canvas=canvas
  55. def config(self,event):
  56. canvas = self.canvas
  57. canvas.configure(scrollregion=canvas.bbox("all"))#,width=400,height=200)
  58. def test_command(a1="",a2=""):
  59. print([a1,a2])
  60. def online_help(page):
  61. print("INIT:online_help",page)
  62. try:
  63. #page = page.replace("&","")
  64. #page = page.replace("=","")
  65. page = page.replace("/","")
  66. import webbrowser
  67. def _cb():
  68. print("online_help",page)
  69. webbrowser.open("http://librelight.de/wiki/doku.php?id="+page )
  70. return _cb
  71. except Exception as e:
  72. print("online_help Exception",e)
  73. raise e
  74. def _cb():
  75. print("error online_help",page)
  76. return _cb
  77. class ELEM_FADER():
  78. def __init__(self,frame,nr,cb=None,fader_cb=None,**args):
  79. self.frame = frame
  80. self.nr= nr
  81. self.id=nr
  82. self.elem = []
  83. self._cb = cb
  84. self._fader_cb = fader_cb
  85. width=11
  86. frameS = tk.Frame(self.frame,bg="#005",width=width)
  87. frameS.pack(fill=tk.Y, side=tk.LEFT)
  88. self.frame=frameS
  89. def fader_event(self,a1="",a2=""):
  90. if self._fader_cb:
  91. self._fader_cb(a1,a2,nr=self.nr)
  92. def event(self,a1="",a2=""):
  93. if self._cb:
  94. self._cb([self,"event",a1,a2])
  95. def set_nr(self,_event=None):
  96. txt= self.elem_nr["text"]
  97. def _cb(data):
  98. if not data:
  99. print("err443",self,"_cb",data)
  100. return None
  101. txt = data["Value"]
  102. self._set_nr(txt)
  103. if self._cb:
  104. self._cb([self,"set_nr",txt])
  105. dialog._cb = _cb
  106. dialog.askstring("ATTR","set NR:",initialvalue=txt)
  107. def set_attr(self,_event=None):
  108. txt= self.attr["text"]
  109. def _cb(data):
  110. if not data:
  111. print("err443",self,"_cb",data)
  112. return None
  113. txt = data["Value"]
  114. #print(self,"set_attr._cb()",txt)
  115. self._set_attr(txt)
  116. if self._cb:
  117. self._cb([self,"set_attr",txt])
  118. dialog._cb = _cb
  119. dialog.askstring("ATTR","set attr:",initialvalue=txt)
  120. def set_label(self,name=""):
  121. #print("set_label",self.b,name)
  122. self.label["text"] = name
  123. if self._cb:
  124. self._cb([self,"set_label",name])
  125. def set_mode(self,_event=None):
  126. txt= self.mode["text"]
  127. def _cb(data):
  128. if not data:
  129. print("err443",self,"_cb",data)
  130. return None
  131. txt = data["Value"]
  132. print(self,"set_mode._cb()",txt)
  133. #w = MAIN.WindowContainer("config",master=1,width=200,height=140,left=L1,top=TOP)
  134. #w.pack()
  135. self._set_mode(txt)
  136. #w.show()
  137. if self._cb:
  138. self._cb([self,"set_mode",txt])
  139. dialog._cb = _cb
  140. dialog.askstring("MODE S/F:","SWITCH or FADE",initialvalue=txt)
  141. def _set_nr(self,txt=""):
  142. if type(txt) is str:
  143. try:
  144. x = int(txt)
  145. if x <= 0:
  146. txt = "off"
  147. self.attr["bg"] = "#fa0"
  148. self.elem_nr["bg"] = "#fa0"
  149. else:
  150. self.attr["bg"] = "lightblue"
  151. self.elem_nr["bg"] = "lightblue"
  152. except:pass
  153. self.elem_nr["text"] = "{}".format(txt)
  154. if self._cb:
  155. self._cb([self,"_set_nr",txt])
  156. def _set_attr(self,txt=""):
  157. self._set_mode("-")
  158. if type(txt) is str:
  159. self.attr["text"] = "{}".format(txt)
  160. if txt.startswith("EMPTY"):
  161. self.attr["bg"] = "#fa0"
  162. else:
  163. if txt in MAIN._FIX_FADE_ATTR:
  164. self._set_mode("F")
  165. else:
  166. self._set_mode("S")
  167. if self._cb:
  168. self._cb([self,"_set_attr",txt])
  169. def _set_mode(self,txt=""):
  170. if type(txt) is str:
  171. txt = txt[0].upper()
  172. self.mode["text"] = "{}".format(txt)
  173. #print("_set_mode",[self])
  174. if self._cb:
  175. self._cb([self,"_set_mode",txt])
  176. def _refresh(self):
  177. pass
  178. def pack(self,init=None,from_=255,to=0,**args):
  179. width=11
  180. r=0
  181. c=0
  182. j=0
  183. self.font8 = ("FreeSans",8)
  184. frameS=self.frame
  185. self.b = tk.Button(frameS,bg="#ffa",text="{}".format(self.nr), width=4,command=test_command,font=self.font8 )
  186. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  187. self.label = self.b
  188. self.elem.append(self.b)
  189. self.b = tk.Scale(frameS,bg="#ffa", width=28,from_=from_,to=to,command=self.fader_event)
  190. self.elem_fader = self.b
  191. self.b.pack(fill=tk.Y, side=tk.TOP)
  192. if init is not None:
  193. self.b.set(init)
  194. self.elem.append(self.b)
  195. self.b = tk.Button(frameS,bg="lightblue",text="0", width=4,command=self.set_nr,font=self.font8 )
  196. self.elem_nr=self.b
  197. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  198. self.elem.append(self.b)
  199. self.b = tk.Button(frameS,bg="lightblue",text="", width=5,command=self.set_attr,font=self.font8 )
  200. self.attr=self.b
  201. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  202. self.elem.append(self.b)
  203. f = tk.Frame(frameS)
  204. #f.pack()
  205. self.b = tk.Button(frameS,bg="lightblue",text="", width=4,command=self.set_mode,font=self.font8 )
  206. self.mode=self.b
  207. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  208. #self.b.pack(fill=tk.BOTH, side=tk.LEFT)
  209. self.elem.append(self.b)
  210. #self.b = tk.Button(frameS,bg="lightblue",text="+>", width=4,command=self.set_mode,font=self.font8 )
  211. #self.xmode=self.b
  212. #self.b.pack(fill=tk.BOTH, side=tk.TOP)
  213. #self.elem.append(self.b)
  214. self.b = tk.Label(frameS,bg="black",text="", width=4,font=self.font8 )
  215. self.b.pack(fill=tk.BOTH, side=tk.TOP)
  216. self.elem.append(self.b)
  217. def ScrollFrame(root,width=50,height=100,bd=1,bg="black",head=None,foot=None):
  218. rframe=tk.Frame(root)
  219. rframe.pack(side="top",fill="both",expand=1) #x=0,y=0)
  220. # frame grid start =========
  221. if head:
  222. height -= 25
  223. hframe=tk.Frame(rframe)
  224. #l = tk.Label(hframe,text="frame")
  225. #l.pack()
  226. hframe.pack(side="top",fill="x",expand=0) #x=0,y=0)
  227. aframe=tk.Frame(rframe)
  228. aframe.pack(side="top",fill="both",expand=1) #x=0,y=0)
  229. if foot:
  230. height -= 25
  231. fframe=tk.Frame(rframe)
  232. #l = tk.Label(fframe,text="frame")
  233. #l.pack()
  234. fframe.pack(side="top",fill="x",expand=0) #x=0,y=0)
  235. # frame grid end ==========
  236. canvas=tk.Canvas(aframe,width=width-24,height=height)
  237. if bg == "":
  238. bg="orange"
  239. canvas["bg"] = bg # "black" #"green"
  240. bframe=tk.Frame(canvas,width=width,height=height,relief=tk.GROOVE)
  241. bframe["bg"] = "blue"
  242. scrollbar=tk.Scrollbar(aframe,orient="vertical",command=canvas.yview,width=20)
  243. canvas.configure(yscrollcommand=scrollbar.set)
  244. scrollbar.pack(side="right",fill="y")
  245. canvas.pack(side="left",expand=1,fill="both")
  246. canvas.create_window((0,0),window=bframe,anchor='nw')
  247. bframe.bind("<Configure>",scroll(canvas).config)
  248. canvas.bind("<Button>",Event("XXX").event)
  249. canvas.bind("<Key>",Event("XXX").event)
  250. canvas.bind("<KeyRelease>",Event("XXX").event)
  251. if head or foot:
  252. return [hframe,bframe,fframe]
  253. return bframe
  254. def frame_of_show_list(frame,cb=None):
  255. c=0
  256. r=0
  257. base = baselib.Base()
  258. for i in ["name","stamp"]: #,"create"]:
  259. b = tk.Label(frame,bg="grey",text=i)
  260. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  261. c+=1
  262. r+=1
  263. blist = baselib.list_shows()
  264. for i in range(10):
  265. blist.append(["",""])
  266. if cb is None:
  267. cb = DummyCallback #("load_show_list.cb")
  268. for i in blist:
  269. #print(i)
  270. c=0
  271. for j in i:
  272. bg="lightgrey"
  273. dbg="lightgrey"
  274. if i[1] > time.strftime("%Y-%m-%d %X", time.localtime(time.time()-3600*4)):
  275. dbg = "lightgreen"
  276. elif i[1] > time.strftime("%Y-%m-%d %X", time.localtime(time.time()-3600*24*7)):
  277. dbg = "green"
  278. if c > 0:
  279. b = tk.Button(frame,text=j,anchor="w",bg=dbg,relief="sunken")
  280. b.config(activebackground=dbg)
  281. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  282. else:
  283. if base.show_name == i[0]:
  284. bg="green"
  285. _cb = cb(j)
  286. b = tk.Button(frame,text=j,anchor="w",height=1,bg=bg,command=_cb.cb)
  287. if base.show_name == i[0]:
  288. b.config(activebackground=bg)
  289. b.grid(row=r, column=c, sticky=tk.W+tk.E)
  290. c+=1
  291. r+=1
  292. class BLINKI():
  293. def __init__(self,e):
  294. self.e = e
  295. def blink(self):
  296. e = self.e
  297. e.config(bg='green')
  298. duration = 150
  299. for i in range(8):
  300. d = i * duration
  301. if i % 2 == 0:
  302. e.after(d, lambda: e.config(bg='white')) # after 1000ms
  303. e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
  304. else:
  305. e.after(d, lambda: e.config(bg='orange')) # after 1000ms
  306. e.after(d, lambda: e.config(activebackground='orange')) # after 1000ms
  307. i+=1
  308. duration = 150
  309. e.after(d, lambda: e.config(bg='white')) # after 1000ms
  310. e.after(d, lambda: e.config(activebackground='white')) # after 1000ms
  311. class on_focus():
  312. def __init__(self,name,mode):
  313. self.name = name
  314. self.mode = mode
  315. def cb(self,event=None):
  316. #print("on_focus",event,self.name,self.mode)
  317. try:
  318. e = MAIN.master.commands.elem["."]
  319. except:pass
  320. if self.mode == "Out":
  321. cmd="xset -display :0.0 r rate 240 20"
  322. #print(cmd)
  323. os.system(cmd)
  324. try:
  325. e["bg"] = "#aaa"
  326. e["activebackground"] = "#aaa"
  327. except:pass
  328. if self.mode == "In":
  329. cmd = "xset -display :0.0 r off"
  330. #print(cmd)
  331. os.system(cmd)
  332. try:
  333. e["bg"] = "#fff"
  334. e["activebackground"] = "#fff"
  335. except:pass
  336. class DummyCallback():
  337. def __init__(self,name="name"):
  338. self.name = name
  339. def cb(self,event=None):
  340. cprint("DummyCallback.cb",[self.name,event])
  341. class WindowContainer():
  342. def __init__(self,args): #title="title",master=0,width=100,height=100,left=None,top=None,exit=0,cb=None,resize=1):
  343. global MAIN #lf_nr
  344. self.args = {"title":"title","master":0,"width":100,"height":100,"left":None,"top":None,"exit":0,"cb":None,"resize":1}
  345. self.args.update(args)
  346. cprint("WindowContainer.init()",self.args["title"],color="yellow")
  347. #cprint("WindowContainer.init()",id(self.args),color="yellow")
  348. #cprint(" ",self.args,color="yellow")
  349. ico_path="./icon/"
  350. self.cb = MAIN.cb
  351. if self.args["master"]:
  352. self.tk = tkinter.Tk()
  353. self.tk.protocol("WM_DELETE_WINDOW", self.close)
  354. self.tk.withdraw() # do not draw
  355. self.tk.resizable(self.args["resize"],self.args["resize"])
  356. self.tk.tk_setPalette(background='#bbb', foreground='black', activeBackground='#aaa', activeForeground="black")
  357. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  358. cprint(defaultFont)
  359. defaultFont.configure(family="FreeSans",
  360. size=10,
  361. weight="bold")
  362. # MAIN MENUE
  363. try:
  364. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"main.png"))
  365. except Exception as e:
  366. cprint(" Exception GUIWindowContainer.__init__",e)
  367. else:
  368. # addtional WINDOW
  369. self.tk = tkinter.Toplevel()
  370. self.tk.iconify()
  371. #self.tk.withdraw() # do not draw
  372. self.tk.protocol("WM_DELETE_WINDOW", self.close)
  373. self.tk.resizable(self.args["resize"],self.args["resize"])
  374. try:
  375. if "COLORPICKER" in self.args["title"]:
  376. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"picker.png"))
  377. elif "ENCODER" in self.args["title"]:
  378. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"enc.png"))
  379. elif "EXEC" in self.args["title"]:
  380. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"exec.png"))
  381. elif "FX" in self.args["title"]:
  382. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"fx.png"))
  383. else:
  384. self.tk.iconphoto(False, tk.PhotoImage(file=ico_path+"scribble.png"))
  385. except Exception as e:
  386. cprint(" Exception on load window icon",self.args["title"])
  387. cprint(" Exception:",e)
  388. #time.sleep(3)
  389. self.tk.deiconify()
  390. self.tk["bg"] = "black"
  391. self.tk.bind("<Button>",self.callback)
  392. self.tk.bind("<Key>",self.callback)
  393. self.tk.bind("<KeyRelease>",self.callback)
  394. self.tk.bind("<FocusIn>", on_focus(self.args["title"],"In").cb)
  395. self.tk.bind("<FocusOut>", on_focus(self.args["title"],"Out").cb)
  396. self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
  397. MAIN.lf_nr+=1
  398. #self.tk.geometry("270x600+0+65")
  399. geo ="{}x{}".format(self.args["width"],self.args["height"])
  400. if self.args["left"] is not None:
  401. geo += "+{}".format(self.args["left"])
  402. if self.args["top"] is not None:
  403. geo += "+{}".format(self.args["top"])
  404. #self._event_clear = MAIN.tk_event(fix=0,elem=None,attr="CLEAR",data=self,mode="ROOT").cb
  405. self.tk.geometry(geo)
  406. self.show()
  407. def update_idle_task(self):
  408. if MAIN.INIT_OK:
  409. tkinter.Tk.update_idletasks(MAIN.gui_menu_gui.tk)
  410. def close(self,event=None):
  411. cprint("WindowContainer.close",self.args["title"],color="red")
  412. #cprint(" ",self.title)
  413. #cprint(" ",self.args)
  414. if self.args["title"] == "MAIN":
  415. MAIN.save_show()
  416. self.tk.destroy()
  417. try:
  418. self.tk.destroy()
  419. except Exception as e:
  420. cprint("WindowContainer.close err",e,color="red")
  421. def title(self,title=None):
  422. if title is None:
  423. return self.tk.title()
  424. else:
  425. #return self.tk.title(title)
  426. self.args["title"] = title
  427. return self.tk.title(""+str(self.args["title"])+" "+str(MAIN.lf_nr)+":"+str(MAIN.rnd_id))
  428. def show(self):
  429. self.tk.deiconify()
  430. pass
  431. def mainloop(self):
  432. #save_window_position_loop() #like autosave
  433. try:
  434. self.tk.mainloop()
  435. finally:
  436. self.tk.quit()
  437. cmd="xset -display :0.0 r rate 240 15"
  438. #print(cmd)
  439. os.system(cmd)
  440. def callback(self,event,data={}):#value=255):
  441. #global MAIN._global_short_key
  442. sstart = time.time()
  443. #time.sleep(0.1)
  444. if not MAIN._global_short_key:
  445. return 1
  446. #global MAIN #_shift_key
  447. #cprint("<GUI>",event,color="yellow")
  448. value = 255
  449. if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
  450. value = 0
  451. cprint("<GUI>",event.state,data,value,[event.type,event.keysym],color="yellow")
  452. #print(event)
  453. if "state" in dir(event) and "keysym" in dir(event):
  454. #print([event.state,event.keysym,event.type])
  455. if event.state == 4 and str(2) == str(event.type): # strg + s
  456. if str(event.keysym) == "s":
  457. MAIN.save_show()
  458. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  459. b = BLINKI(e)
  460. b.blink()
  461. if str(event.keysym) == "c":
  462. if MAIN.save_show():
  463. MAIN.LOAD_SHOW_AND_RESTART("").cb(force=1)
  464. return
  465. if "keysym" in dir(event):
  466. if "Escape" == event.keysym:
  467. MAIN.FIXTURES.clear()
  468. MAIN.modes.val("ESC",1)
  469. MAIN.master.refresh_fix()
  470. elif event.keysym in ["Shift_L","Shift_R"]:
  471. #cprint(event.type)
  472. if "KeyRelease" in str(event.type) or str(event.type) in ["3"]:
  473. MAIN._shift_key = 0
  474. else:
  475. MAIN._shift_key = 1
  476. #cprint("SHIFT_KEY",_shift_key,"??????????")
  477. #cprint("SHIFT_KEY",_shift_key,"??????????")
  478. #global MAIN #_ENCODER_WINDOW
  479. try:
  480. if MAIN._shift_key:
  481. MAIN._ENCODER_WINDOW.title("SHIFT/FINE ")
  482. else:
  483. MAIN._ENCODER_WINDOW.title("ENCODER")
  484. except Exception as e:
  485. cprint("exc9800",e)
  486. #raise e
  487. elif event.keysym in "ebfclrmsRx" and value:
  488. if "e" == event.keysym:
  489. MAIN.modes.val("EDIT",1)
  490. elif "b" == event.keysym:
  491. MAIN.modes.val("BLIND",1)
  492. elif "f" == event.keysym:
  493. MAIN.modes.val("FLASH",1)
  494. elif "c" == event.keysym:
  495. MAIN.modes.val("CFG-BTN",1)
  496. elif "l" == event.keysym:
  497. MAIN.modes.val("LABEL",1)
  498. elif "r" == event.keysym:
  499. MAIN.modes.val("REC",1)
  500. elif "R" == event.keysym:
  501. MAIN.modes.val("REC-FX",1)
  502. elif "x" == event.keysym:
  503. MAIN.modes.val("REC-FX",1)
  504. elif "m" == event.keysym:
  505. x=MAIN.modes.val("MOVE",1)
  506. if not x:
  507. MAIN.EXEC.clear_move()
  508. elif "s" == event.keysym:
  509. MAIN.modes.val("SELECT",1)
  510. elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
  511. nr = int( event.keysym[1:]) # F:1-12
  512. nr = nr-1+81
  513. cprint("F-KEY",value,nr,event.keysym)
  514. #print(event)
  515. MAIN.master.exec_go(nr-1,xfade=None,val=value)
  516. elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
  517. nr = int( event.keysym)
  518. if nr == 0:
  519. nr = 10
  520. nr = nr-1+161
  521. cprint("NUM-KEY",value,nr)
  522. MAIN.master.exec_go(nr-1,xfade=None,val=value)
  523. elif "numbersign" == event.keysym and value: # is char "#"
  524. cprint("numbersign !!")
  525. MAIN.save_show()
  526. for e in MAIN.master.setup_cmd:
  527. cprint(e)
  528. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  529. cprint(e)
  530. b = BLINKI(e)
  531. b.blink()
  532. #e = MAIN.tk_event(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
  533. #e.cb(event=event)
  534. elif "End" == event.keysym:
  535. MAIN.FIXTURES.fx_off("all")
  536. CONSOLE.fx_off("all")
  537. CONSOLE.flash_off("all")
  538. elif "Delete" == event.keysym:
  539. #MAIN.EXEC.delete(nr)
  540. if value:
  541. MAIN.modes.val("DEL",1)
  542. #cprint("oipo "*10,round(int(time.time()-sstart)*1000,2))
  543. class window_create_buffer():
  544. # könnte auch direkt im WindowContainer object eingebaut werden !?
  545. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  546. self.args = args.copy()
  547. self.cls = cls
  548. self.cb_ok = cb_ok
  549. self.data = data
  550. self.scroll = scroll
  551. self.gui = gui
  552. def create(self,hidde=0):
  553. obj = None
  554. w = WindowContainer(self.args)
  555. out = []
  556. f = None
  557. h = None
  558. if self.scroll:
  559. head = None
  560. foot = None
  561. if "head" in self.args:
  562. head = self.args["head"]
  563. if "foot" in self.args:
  564. foot = self.args["foot"]
  565. w1 = ScrollFrame(w.tk,width=self.args["width"],height=self.args["height"],foot=foot,head=head)
  566. if type(w1) is list:
  567. try:
  568. h = w1[0]
  569. f = w1[2]
  570. except:pass
  571. w1 = w1[1]
  572. else:
  573. w1 = tk.Frame(w.tk,width=self.args["width"],height=self.args["height"])
  574. w1.pack()
  575. try:
  576. obj=self.cls(self.gui,w1,self.data,foot=f,head=h)
  577. except:
  578. obj=self.cls(self.gui,w1,self.data)
  579. return w,obj,self.cb_ok
  580. class PopupList():
  581. def __init__(self,name="<NAME>",master=0,width=400,height=450,exit=1,left=_POS_LEFT+400,top=_POS_TOP+100,cb=None,bg="black"):
  582. self.name = name
  583. self.frame = None
  584. self.bg=bg
  585. self.cb = cb
  586. if cb is None:
  587. cb = DummyCallback #("load_show_list.cb")
  588. #w = WindowContainer(self.name,master=master,width=width,height=height,exit=exit,left=left,top=top,cb=cb)
  589. args = {"title":self.name,"master":master,"width":width,"height":height,"exit":exit,"left":left,"top":top,"cb":cb}
  590. w = WindowContainer(args)
  591. self.w = w
  592. w.show()
  593. def sframe(self,line1="<line1>",line2="<line2>",data=[]):
  594. xframe=self.w.tk
  595. if self.bg:
  596. xframe.configure(bg=self.bg)
  597. self.w.tk.configure(bg=self.bg)
  598. c=0
  599. r=0
  600. b = tk.Label(xframe,bg="grey",text=line1,anchor="w")
  601. b.pack(side="top",expand=0,fill="x" )
  602. b = tk.Label(xframe,bg="grey",text=line2,anchor="w")
  603. b.pack(side="top",expand=0,fill="x" )
  604. b = tk.Label(xframe,bg="black",fg="black",text="")
  605. if self.bg:
  606. b.configure(fg=self.bg)
  607. b.configure(bg=self.bg)
  608. b.pack(side="top")
  609. b = tk.Entry(xframe,width=10,text="")#,anchor="w")
  610. b.pack(side="top",expand=0,fill="x")
  611. b["state"] = "readonly"
  612. b.focus()
  613. #frame = tk.Frame(xframe,heigh=2800)
  614. #frame.pack(fill=tk.BOTH,expand=1, side=tk.TOP)
  615. frame = ScrollFrame(xframe,width=300,height=500,bd=1,bg=self.bg)
  616. #frame.pack(side="left") #fill=tk.BOTH,expand=1, side=tk.TOP)
  617. #self.frame = frame
  618. self.w.tk.state(newstate='normal')
  619. self.w.tk.attributes('-topmost',True)
  620. return frame
  621. def showwarning(msg="<ERROR>",title="<TITLE>"):
  622. cprint("showwarning","MSG:",msg,"tilte:",title)
  623. if IS_GUI:
  624. _main = tkinter.Tk()
  625. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  626. cprint("showwarning",defaultFont)
  627. if IS_GUI:
  628. defaultFont.configure(family="FreeSans",
  629. size=10,
  630. weight="normal")
  631. geo ="{}x{}".format(20,20)
  632. _main.geometry(geo)
  633. def _quit():
  634. time.sleep(1/10)
  635. _main.quit()
  636. thread.start_new_thread(_main.mainloop,())
  637. r=tkinter.messagebox.showwarning(message=msg,title=title,parent=None)