libtk.py 24 KB

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