libtk.py 26 KB

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