Advertisement
AceScottie

tkutils.py

Jan 13th, 2020
462
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.35 KB | None | 0 0
  1. try:
  2.     from Tkinter import *
  3. except:
  4.     from tkinter import *
  5. import tkinter.ttk as ttk
  6. import PIL.Image, PIL.ImageTk, PIL.ImageDraw, PIL.ImageFont
  7. from itertools import count
  8. import threading, os, sys, re
  9. from datetime import datetime, date, time, timedelta
  10.  
  11. class ValidatingEntry(Entry): ##used for MaxLengthEntry
  12.     def __init__(self, master, value="", **kw):
  13.         #apply(Entry.__init__, (self, master), kw)
  14.         Entry.__init__(*(self, master), **kw)
  15.         self.__value = value
  16.         self.__variable = StringVar()
  17.         self.__variable.set(value)
  18.         self.__variable.trace("w", self.__callback)
  19.         self.config(textvariable=self.__variable)
  20.     def __callback(self, *dummy):
  21.         value = self.__variable.get()
  22.         newvalue = self.validate(value)
  23.         if newvalue is None:
  24.             self.__variable.set(self.__value)
  25.         elif newvalue != value:
  26.             self.__value = newvalue
  27.             self.__variable.set(newvalue)
  28.         else:
  29.             self.__value = value
  30.     def validate(self, value):
  31.         # override: return value, new value, or None if invalid
  32.         return value
  33. class MaxLengthEntry(ValidatingEntry): ##entry with a max length flag
  34.     def __init__(self, master, value="", maxlength=None, valtype=None, **kw):
  35.         self.maxlength = maxlength
  36.         self.valtype = valtype
  37.         #apply(ValidatingEntry.__init__, (self, master), kw)
  38.         ValidatingEntry.__init__(*(self, master), **kw)
  39.     def validate(self, value):
  40.         if self.maxlength is None or len(value) <= self.maxlength:
  41.             if self.valtype != None:
  42.                 if self.valtype == "int":
  43.                     try:
  44.                         x=int(value)
  45.                         return value
  46.                     except:
  47.                         return ""
  48.                 elif self.valtype == "int/hour":
  49.                     try:
  50.                         x=int(value)
  51.                         if x < 24:
  52.                             return value
  53.                         else:
  54.                             return ""
  55.                     except:
  56.                         return ""
  57.                 elif self.valtype == "int/minute":
  58.                     try:
  59.                         x=int(value)
  60.                         if x < 60:
  61.                             return value
  62.                         else:
  63.                             return ""
  64.                     except:
  65.                         return ""
  66.                 elif self.valtype == "int/currency":
  67.                     try:
  68.                         #x = float(value)
  69.                         if len(value.split(".")) == 2:
  70.                             if len(value.split(".")[1]) > 2:
  71.                                 return value[:-1]
  72.                             else:
  73.                                 return value
  74.                         elif len(value.split(".")) > 2:
  75.                             return ""
  76.                         else:
  77.                             return value
  78.                     except:
  79.                         return ""
  80.                 elif self.valtype == "str":
  81.                     try:
  82.                         x=int(value)
  83.                         return value
  84.                     except:
  85.                         return ""
  86.                 else:
  87.                     return ""
  88.                
  89.             else:
  90.                 return None
  91.         return None # new value too long
  92. class IconBuilder:
  93.     def __init__(self, exe_path):
  94.         self.exe_path = exe_path
  95.         self.icons = {}
  96.         self.gen_icons()
  97.     def create_icon(self, url, w=32, h=32):
  98.         im = PIL.Image.open(self.exe_path+url)
  99.         im = im.resize((w, h), PIL.Image.ANTIALIAS)
  100.         icon = PIL.ImageTk.PhotoImage(im)
  101.         return icon
  102.     def gen_icons(self):
  103.         icons = {"Logo": self.create_icon("\\assets\\Logo.gif"),
  104.                  "profile": self.create_icon("\\assets\\profile.gif", w=128, h=128),
  105.                  "gtick": self.create_icon("\\assets\\gtick.gif", w=16, h=16),
  106.                  "rcross": self.create_icon("\\assets\\rcross.gif", w=16, h=16),
  107.                  "+": self.create_icon("\\assets\\add.gif", w=24, h=24),
  108.                  "+x16": self.create_icon("\\assets\\add.gif", w=24, h=24),
  109.                  "edit": self.create_icon("\\assets\\edit.gif", w=24, h=24),
  110.                  "print": self.create_icon("\\assets\\print.gif", w=24, h=24),
  111.                  "save": self.create_icon("\\assets\\save.gif", w=24, h=24),
  112.                  "cancel": self.create_icon("\\assets\\cancel.gif", w=24, h=24),
  113.                  "search": self.create_icon("\\assets\\search.gif", w=32, h=24),
  114.                  "back": self.create_icon("\\assets\\back.gif", w=32, h=24),
  115.                  "settings": self.create_icon("\\assets\\settings.gif", w=32, h=24),
  116.                  "refresh": self.create_icon("\\assets\\refresh.gif", w=32, h=24),
  117.                  "arrow_left": self.create_icon("\\assets\\arrow_left.gif", w=32, h=32),
  118.                  "arrow_right": self.create_icon("\\assets\\arrow_right.gif", w=16, h=16),
  119.                  "delete": self.create_icon("\\assets\\delete.gif", w=16, h=16),
  120.                  "casenote": self.create_icon("\\assets\\casenote.gif", w=16, h=16),
  121.                  "filter": self.create_icon("\\assets\\filter.gif", w=16, h=16),
  122.                  "LED_RED": self.create_icon("\\assets\\LED_RED.gif", w=16, h=16),
  123.                  "LED_AMBER": self.create_icon("\\assets\\LED_AMBER.gif", w=16, h=16),
  124.                  "LED_GREEN": self.create_icon("\\assets\\LED_GREEN.gif", w=16, h=16)
  125.                  }
  126.         self.icons = icons
  127.     def get_icons(self):
  128.         return self.icons
  129.         pass
  130. class ImageLabel(Label): #for animated gifs
  131.     def load(self, im):
  132.         if isinstance(im, str):
  133.             im = PIL.Image.open(im)
  134.         self.loc = 0
  135.         self.frames = []
  136.  
  137.         try:
  138.             for i in count(1):
  139.                 self.frames.append(PIL.ImageTk.PhotoImage(im.copy()))
  140.                 im.seek(i)
  141.         except EOFError:
  142.             pass
  143.  
  144.         try:
  145.             self.delay = im.info['duration']
  146.         except:
  147.             self.delay = 100
  148.         if len(self.frames) == 1:
  149.             self.config(image=self.frames[0])
  150.         else:
  151.             self.next_frame()
  152.     def unload(self):
  153.         self.config(image=None)
  154.         self.frames = None
  155.     def next_frame(self):
  156.         if self.frames:
  157.             self.loc += 1
  158.             self.loc %= len(self.frames)
  159.             self.config(image=self.frames[self.loc])
  160.             self.after(self.delay, self.next_frame)
  161. class Tooltip:
  162.     def __init__(self, widget,*,bg='#FFFFEA',pad=(5, 3, 5, 3),text='widget info',waittime=400,wraplength=250):
  163.         self.waittime = waittime
  164.         self.wraplength = wraplength
  165.         self.widget = widget
  166.         self.text = text
  167.         self.widget.bind("<Enter>", self.onEnter)
  168.         self.widget.bind("<Leave>", self.onLeave)
  169.         self.widget.bind("<ButtonPress>", self.onLeave)
  170.         self.bg = bg
  171.         self.pad = pad
  172.         self.id = None
  173.         self.tw = None
  174.     def onEnter(self, event=None):
  175.         self.schedule()
  176.         pass
  177.     def onLeave(self, event=None):
  178.         self.unschedule()
  179.         self.hide()
  180.     def schedule(self):
  181.         self.unschedule()
  182.         self.id = self.widget.after(self.waittime, self.show)
  183.     def unschedule(self):
  184.         id_ = self.id
  185.         self.id = None
  186.         if id_:
  187.             self.widget.after_cancel(id_)
  188.     def show(self):
  189.         def tip_pos_calculator(widget, label,*,tip_delta=(10, 5), pad=(5, 3, 5, 3)):
  190.             w = widget
  191.             s_width, s_height = w.winfo_screenwidth(), w.winfo_screenheight()
  192.             width, height = (pad[0] + label.winfo_reqwidth() + pad[2],pad[1] + label.winfo_reqheight() + pad[3])
  193.             mouse_x, mouse_y = w.winfo_pointerxy()
  194.             x1, y1 = mouse_x + tip_delta[0], mouse_y + tip_delta[1]
  195.             x2, y2 = x1 + width, y1 + height
  196.             x_delta = x2 - s_width
  197.             if x_delta < 0:
  198.                 x_delta = 0
  199.             y_delta = y2 - s_height
  200.             if y_delta < 0:
  201.                 y_delta = 0
  202.             offscreen = (x_delta, y_delta) != (0, 0)
  203.             if offscreen:
  204.                 if x_delta:
  205.                     x1 = mouse_x - tip_delta[0] - width
  206.                 if y_delta:
  207.                     y1 = mouse_y - tip_delta[1] - height
  208.             offscreen_again = y1 < 0
  209.             if offscreen_again:
  210.                 y1 = 0
  211.             return x1, y1
  212.         bg = self.bg
  213.         pad = self.pad
  214.         widget = self.widget
  215.         self.tw = Toplevel(widget)
  216.         self.tw.wm_overrideredirect(True)
  217.         win = Frame(self.tw,background=bg,borderwidth=0)
  218.         label = ttk.Label(win,text=self.text,justify=LEFT,background=bg,relief=SOLID,borderwidth=0,wraplength=self.wraplength)
  219.         label.grid(padx=(pad[0], pad[2]),pady=(pad[1], pad[3]),sticky=NSEW)
  220.         win.grid()
  221.         x, y = tip_pos_calculator(widget, label)
  222.         self.tw.wm_geometry("+%d+%d" % (x, y))
  223.     def hide(self):
  224.         tw = self.tw
  225.         if tw:
  226.             tw.destroy()
  227.         self.tw = None
  228. class BaseThread(threading.Thread):
  229.     def __init__(self, callback=None, callback_args=None, *args, **kwargs):
  230.         target = kwargs.pop('target')
  231.         super(BaseThread, self).__init__(target=self.target_with_callback, *args, **kwargs)
  232.         self.callback = callback
  233.         self.method = target
  234.         self.callback_args = callback_args
  235.     def target_with_callback(self):
  236.         self.method()
  237.         if self.callback is not None:
  238.             self.callback(*self.callback_args)
  239. class SafeVars:
  240.     def __init__(self):
  241.         self.strtype = type("test")
  242.         self.inttype = type(0)
  243.         self.datetype = type(datetime.now())
  244.     def safe_var(self, userinput):
  245.         if type(userinput) == self.strtype:
  246.             output = self.safe_string(userinput)
  247.         elif type(userinput) == self.inttype:
  248.             output = self.safe_int(userinput)
  249.         elif type(userinput) == self.datetype:
  250.             output = self.safe_date(userinput)
  251.         else:
  252.             output = userinput
  253.         return output
  254.     def decode_vars(self, userinput):
  255.         if type(userinput) == self.strtype:
  256.             userinput = userinput.encode().decode('unicode-escape')
  257.             #userinput = userinput.encode().decode('unicode-escape')
  258.             output = userinput.encode("latin1").decode("UTF-8")
  259.         elif type(userinput) == self.inttype:
  260.             output = self.safe_int(userinput)
  261.         elif type(userinput) == self.datetype:
  262.             output = self.safe_date(userinput)
  263.         else:
  264.             output = userinput
  265.         return output
  266.     def safe_string(self, userinput):
  267.         output = str(userinput)
  268.         output = output.encode('UTF-8')
  269.         output =  str(output).replace("\\\\", "")[2:-1].replace("\\x", "\\\\x")
  270.         output = output.replace("\\'", "'")
  271.         output = output.replace('"', '\\\\\\"')
  272.         output = output.replace("'", "\\\\\\'")
  273.         return output
  274.     def safe_int(self, userinput):
  275.         output = userinput
  276.  
  277.         return output
  278.     def safe_date(self, userinput):
  279.         return userinput
  280.         pass
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement