libtk.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747
  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. sstart = time.time()
  442. #time.sleep(0.1)
  443. if not MAIN._global_short_key:
  444. return 1
  445. #global MAIN #_shift_key
  446. #cprint("<GUI>",event,color="yellow")
  447. value = 255
  448. if "Release" in str(event.type) or str(event.type) == '5' or str(event.type) == '3':
  449. value = 0
  450. cprint("<GUI>",event.state,data,value,[event.type,event.keysym],color="yellow")
  451. #print(event)
  452. if "state" in dir(event) and "keysym" in dir(event):
  453. #print([event.state,event.keysym,event.type])
  454. if event.state == 4 and str(2) == str(event.type): # strg + s
  455. if str(event.keysym) == "s":
  456. MAIN.save_show()
  457. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  458. b = BLINKI(e)
  459. b.blink()
  460. if str(event.keysym) == "c":
  461. if MAIN.save_show():
  462. MAIN.LOAD_SHOW_AND_RESTART("").cb(force=1)
  463. return
  464. if "keysym" in dir(event):
  465. if "Escape" == event.keysym:
  466. MAIN.FIXTURES.clear()
  467. MAIN.modes.val("ESC",1)
  468. MAIN.master.refresh_fix()
  469. elif event.keysym in ["Shift_L","Shift_R"]:
  470. #cprint(event.type)
  471. if "KeyRelease" in str(event.type) or str(event.type) in ["3"]:
  472. MAIN._shift_key = 0
  473. else:
  474. MAIN._shift_key = 1
  475. #cprint("SHIFT_KEY",_shift_key,"??????????")
  476. #cprint("SHIFT_KEY",_shift_key,"??????????")
  477. #global MAIN #_ENCODER_WINDOW
  478. try:
  479. if MAIN._shift_key:
  480. MAIN._ENCODER_WINDOW.title("SHIFT/FINE ")
  481. else:
  482. MAIN._ENCODER_WINDOW.title("ENCODER")
  483. except Exception as e:
  484. cprint("exc9800",e)
  485. #raise e
  486. elif event.keysym in "ebfclrmsRx" and value:
  487. if "e" == event.keysym:
  488. MAIN.modes.val("EDIT",1)
  489. elif "b" == event.keysym:
  490. MAIN.modes.val("BLIND",1)
  491. elif "f" == event.keysym:
  492. MAIN.modes.val("FLASH",1)
  493. elif "c" == event.keysym:
  494. MAIN.modes.val("CFG-BTN",1)
  495. elif "l" == event.keysym:
  496. MAIN.modes.val("LABEL",1)
  497. elif "r" == event.keysym:
  498. MAIN.modes.val("REC",1)
  499. elif "R" == event.keysym:
  500. MAIN.modes.val("REC-FX",1)
  501. elif "x" == event.keysym:
  502. MAIN.modes.val("REC-FX",1)
  503. elif "m" == event.keysym:
  504. x=MAIN.modes.val("MOVE",1)
  505. if not x:
  506. MAIN.EXEC.clear_move()
  507. elif "s" == event.keysym:
  508. MAIN.modes.val("SELECT",1)
  509. elif event.keysym in ["F1","F2","F3","F4","F5","F6","F7","F8","F9","F10","F11","F12"]:
  510. nr = int( event.keysym[1:]) # F:1-12
  511. nr = nr-1+81
  512. cprint("F-KEY",value,nr,event.keysym)
  513. #print(event)
  514. MAIN.master.exec_go(nr-1,xfade=None,val=value)
  515. elif event.keysym in ["1","2","3","4","5","6","7","8","9","0"]:
  516. nr = int( event.keysym)
  517. if nr == 0:
  518. nr = 10
  519. nr = nr-1+161
  520. cprint("NUM-KEY",value,nr)
  521. MAIN.master.exec_go(nr-1,xfade=None,val=value)
  522. elif "numbersign" == event.keysym and value: # is char "#"
  523. cprint("numbersign !!")
  524. MAIN.save_show()
  525. for e in MAIN.master.setup_cmd:
  526. cprint(e)
  527. e = MAIN.master.setup_elem["SAVE\nSHOW"]
  528. cprint(e)
  529. b = BLINKI(e)
  530. b.blink()
  531. #e = MAIN.tk_event(fix=0,elem=None,attr="SAVE\nSHOW",mode="SETUP")
  532. #e.cb(event=event)
  533. elif "End" == event.keysym:
  534. MAIN.FIXTURES.fx_off("all")
  535. MAIN.CONSOLE.fx_off("all")
  536. MAIN.CONSOLE.flash_off("all")
  537. elif "Delete" == event.keysym:
  538. #MAIN.EXEC.delete(nr)
  539. if value:
  540. MAIN.modes.val("DEL",1)
  541. #cprint("oipo "*10,round(int(time.time()-sstart)*1000,2))
  542. class window_create_buffer():
  543. # könnte auch direkt im WindowContainer object eingebaut werden !?
  544. def __init__(self,args,cls,data,cb_ok=None,scroll=0,gui=None):
  545. self.args = args.copy()
  546. self.cls = cls
  547. self.cb_ok = cb_ok
  548. self.data = data
  549. self.scroll = scroll
  550. self.gui = gui
  551. def create(self,hidde=0):
  552. obj = None
  553. w = WindowContainer(self.args)
  554. out = []
  555. f = None
  556. h = None
  557. if self.scroll:
  558. head = None
  559. foot = None
  560. if "head" in self.args:
  561. head = self.args["head"]
  562. if "foot" in self.args:
  563. foot = self.args["foot"]
  564. w1 = ScrollFrame(w.tk,width=self.args["width"],height=self.args["height"],foot=foot,head=head)
  565. if type(w1) is list:
  566. try:
  567. h = w1[0]
  568. f = w1[2]
  569. except:pass
  570. w1 = w1[1]
  571. else:
  572. w1 = tk.Frame(w.tk,width=self.args["width"],height=self.args["height"])
  573. w1.pack()
  574. try:
  575. obj=self.cls(self.gui,w1,self.data,foot=f,head=h)
  576. except:
  577. obj=self.cls(self.gui,w1,self.data)
  578. return w,obj,self.cb_ok
  579. class PopupList():
  580. 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"):
  581. self.name = name
  582. self.frame = None
  583. self.bg=bg
  584. self.cb = cb
  585. if cb is None:
  586. cb = DummyCallback #("load_show_list.cb")
  587. #w = WindowContainer(self.name,master=master,width=width,height=height,exit=exit,left=left,top=top,cb=cb)
  588. args = {"title":self.name,"master":master,"width":width,"height":height,"exit":exit,"left":left,"top":top,"cb":cb}
  589. w = WindowContainer(args)
  590. self.w = w
  591. w.show()
  592. def sframe(self,line1="<line1>",line2="<line2>",data=[]):
  593. xframe=self.w.tk
  594. if self.bg:
  595. xframe.configure(bg=self.bg)
  596. self.w.tk.configure(bg=self.bg)
  597. c=0
  598. r=0
  599. b = tk.Label(xframe,bg="grey",text=line1,anchor="w")
  600. b.pack(side="top",expand=0,fill="x" )
  601. b = tk.Label(xframe,bg="grey",text=line2,anchor="w")
  602. b.pack(side="top",expand=0,fill="x" )
  603. b = tk.Label(xframe,bg="black",fg="black",text="")
  604. if self.bg:
  605. b.configure(fg=self.bg)
  606. b.configure(bg=self.bg)
  607. b.pack(side="top")
  608. b = tk.Entry(xframe,width=10,text="")#,anchor="w")
  609. b.pack(side="top",expand=0,fill="x")
  610. b["state"] = "readonly"
  611. b.focus()
  612. #frame = tk.Frame(xframe,heigh=2800)
  613. #frame.pack(fill=tk.BOTH,expand=1, side=tk.TOP)
  614. frame = ScrollFrame(xframe,width=300,height=500,bd=1,bg=self.bg)
  615. #frame.pack(side="left") #fill=tk.BOTH,expand=1, side=tk.TOP)
  616. #self.frame = frame
  617. self.w.tk.state(newstate='normal')
  618. self.w.tk.attributes('-topmost',True)
  619. return frame
  620. def showwarning(msg="<ERROR>",title="<TITLE>"):
  621. cprint("showwarning","MSG:",msg,"tilte:",title)
  622. if IS_GUI:
  623. _main = tkinter.Tk()
  624. defaultFont = tkinter.font.nametofont("TkDefaultFont")
  625. cprint("showwarning",defaultFont)
  626. if IS_GUI:
  627. defaultFont.configure(family="FreeSans",
  628. size=10,
  629. weight="normal")
  630. geo ="{}x{}".format(20,20)
  631. _main.geometry(geo)
  632. def _quit():
  633. time.sleep(1/10)
  634. _main.quit()
  635. thread.start_new_thread(_main.mainloop,())
  636. r=tkinter.messagebox.showwarning(message=msg,title=title,parent=None)