honghaier 发表于 2021-6-16 11:35:40

FUN函数库API说明

FUN函数库API说明
===============================================
在逻辑代码中,我们经常要访问控件,或者反复实现一些常用功能,比如打开文件对话框,将对话框移动到某个位置等。为了方便这些操作,我提供了FUN.py来提供这些函数。在这里我会对Fun.py进行逐一说明。


======================================================================
首先是一些全局变量:
#控件的用户绑定变量字典
G_UIElementUserDataArray={}
#控件字典
G_UIElementArray={}
#控件内部Tkinter变量字典
G_UIElementVariableArray={}
#用于返回指定对话框上所有控件文本数据的字典
G_UIInputDataArray={}
#用于文档模版工程中保存文件的路径
G_CurrentFilePath=None
#用于文档模版工程中保存文本框剪切内容
G_CutContent=None


======================================================================
然后是函数:#注册控件,也就是将名字与控件实体进行绑定,后续如果想通过名字访问控件实体,必须是已注册的。这里通过uiName来区分是属于哪一个界面实例的控件,因为有可能工程里有多个界面,就使用uiName来区分。
def Register(uiName,elementName,element):
    if uiName not in G_UIElementArray:
      G_UIElementArray={}
    G_UIElementArray=element
======================================================================
#通过控件名称访问控件实体。
def GetElement(uiName,elementName):
    global G_UIElementArray
    if uiName in G_UIElementArray:
      return G_UIElementArray
    return None
======================================================================
#为控件增加TKinter变量
def AddTKVariable(uiName,elementName,defaultValue = None):
    if uiName not in G_UIElementVariableArray:
      G_UIElementVariableArray={}
    NameLower = elementName.lower()
    if NameLower.find('combobox_') >= 0:
      G_UIElementVariableArray=tkinter.IntVar()
    elif NameLower.find('group_') >= 0:
      G_UIElementVariableArray=tkinter.IntVar()
    elif NameLower.find('checkbutton_') >= 0:
      G_UIElementVariableArray=tkinter.BooleanVar()
    else:
      G_UIElementVariableArray=tkinter.StringVar()
    if defaultValue:
      G_UIElementVariableArray.set(defaultValue)
    return G_UIElementVariableArray
======================================================================#设置控件的Tkinter变量值
def SetTKVariable(uiName,elementName,value):
    if uiName in G_UIElementVariableArray:
      if elementName in G_UIElementVariableArray:
            G_UIElementVariableArray.set(value)
======================================================================
#取得控件的Tkinter变量
def GetTKVariable(uiName,elementName):
    if uiName in G_UIElementVariableArray:
      if elementName in G_UIElementVariableArray:
            return G_UIElementVariableArray.get()
======================================================================
#为控件增加一个用户绑定类型的数据
#参数dataName是数据名称,datatype是数据类型,可以包括int,float,string,list,dictory等,一般在设计软件中对控件进行鼠标右键操作,在弹出的“绑定数据变量”中设置。
#参数datavalue是数据值 ,isMapToText是指是否直接将数据反映到控件的text文本变量
def AddUserData(uiName,elementName,dataName,datatype,datavalue,isMapToText):
    global G_UIElementUserDataArray
    if uiName not in G_UIElementUserDataArray:
      G_UIElementUserDataArray={}
    if elementName not in G_UIElementUserDataArray:
      G_UIElementUserDataArray=[]
    G_UIElementUserDataArray.append()
======================================================================
#设置用户绑定数据的值
def SetUserData(uiName,elementName,dataName,datavalue):
    global G_UIElementArray
    global G_UIElementUserDataArray
    if uiName in G_UIElementUserDataArray:
      if elementName in G_UIElementUserDataArray:
            for EBData in G_UIElementUserDataArray:
                if EBData == dataName:
                  EBData = datavalue
                  if EBData == 1:
                        SetText(uiName,elementName,datavalue)
                  return
======================================================================
#取得用户绑定数据的值
def GetUserData(uiName,elementName,dataName):
    global G_UIElementUserDataArray
    ifuiName in G_UIElementUserDataArray:
      if elementName in G_UIElementUserDataArray:
            for EBData in G_UIElementUserDataArray:
                if EBData == dataName:
                  if EBData=='int':
                        return int(EBData)
                  elif EBData=='float':
                        return float(EBData)
                  else:
                        return EBData
    return None
======================================================================
#设置控件的Tkinter属性,就等于是调用configure。
def SetTKAttrib(uiName,elementName,AttribName,attribValue):
    global G_UIElementArray
    if uiName in G_UIElementArray:
      if AttribName in G_UIElementArray.configure().keys():
            G_UIElementArray=attribValue
======================================================================
#取得控件的Tkinter属性值
def GetTKAttrib(uiName,elementName,AttribName):
    global G_UIElementArray
    if uiName in G_UIElementArray:
      return G_UIElementArray.cget(AttribName)
    return None
======================================================================
#设置LABEL,BUTTON,ENTRY,TEXT的文本
def SetText(uiName,elementName,textValue):
    global G_UIElementArray
    global G_UIElementVariableArray
    showtext = str("%s"%textValue)
    if uiName in G_UIElementVariableArray:
      if elementName in G_UIElementVariableArray:
            G_UIElementVariableArray.set(showtext)
            return
    if uiName in G_UIElementArray:
      if elementName in G_UIElementArray:
            if elementName.find('Text_') >= 0:
                G_UIElementArray.delete('0.0',tkinter.END)
                G_UIElementArray.insert(tkinter.END,showtext)
            else:
                G_UIElementArray.configure(text=showtext)
======================================================================
#取得LABEL,BUTTON,ENTRY,TEXT的文本
def GetText(uiName,elementName):
    global G_UIElementArray
    global G_UIElementVariableArray
    if uiName in G_UIElementVariableArray:
      if elementName in G_UIElementVariableArray:
            return G_UIElementVariableArray.get()
    if uiName in G_UIElementArray:
      if elementName in G_UIElementArray:
            if elementName.find('Text_') >= 0:
                return G_UIElementArray.get('0.0', tkinter.END)
            elif elementName.find('Spinbox_') >= 0:
                return str(G_UIElementArray.get())
            else:
                return G_UIElementArray.cget('text')
    return str("")
======================================================================
#设置LABEL,BUTTON的背景图片
def SetImage(uiName,elementName,imagePath):
    global G_UIElementVariableArray
    if elementName.find('Label_') == 0 or elementName.find('Button_') == 0 :
      Control = GetElement(uiName,elementName)
      if Control != None:
            if uiName in G_UIElementUserDataArray:
                if elementName in G_UIElementUserDataArray:
                  for EBData in G_UIElementUserDataArray:
                        if EBData == 'image':
                            EBData = imagePath
                            from   PIL import Image,ImageTk
                            image=Image.open(imagePath).convert('RGBA')
                            image_Resize = image.resize((Control.winfo_width(), Control.winfo_height()),Image.ANTIALIAS)
                            EBData = ImageTk.PhotoImage(image_Resize)
                            Control.configure(image = EBData)
                            return
            from   PIL import Image,ImageTk
            image=Image.open(imagePath).convert('RGBA')
            image_Resize = image.resize((Control.winfo_width(), Control.winfo_height()),Image.ANTIALIAS)
            EBData2 = ImageTk.PhotoImage(image_Resize)
            AddUserData(uiName,elementName,'image',imagePath,EBData2,0)
            Control.configure(image = EBData2)
======================================================================
#取得LABEL,BUTTON的背景图片
def GetImage(uiName,elementName):
    global G_UIElementVariableArray
    if elementName.find('Label_') == 0 or elementName.find('Button_') == 0 :
      Control = GetElement(uiName,elementName)
      if Control != None:
            if uiName in G_UIElementUserDataArray:
                if elementName in G_UIElementUserDataArray:
                  for EBData in G_UIElementUserDataArray:
                        if EBData == 'image':
                            return EBData
    return str("")
======================================================================
#初始化所有的用户绑定数据,无须手动调用。
def InitElementData(uiName):
    global G_UIElementUserDataArray
    if uiName in G_UIElementUserDataArray:
      for elementName in G_UIElementUserDataArray.keys():
            for EBData in G_UIElementUserDataArray:
                if EBData == 1:
                  SetText(uiName,elementName,EBData)
                  SetText(uiName,elementName,EBData)
======================================================================
#初始化样式,无须手动调用。
def InitElementStyle(uiName,Style):
    StyleArray = ReadStyleFile(Style+".py")
    global G_UIElementArray
    if uiName in G_UIElementArray:
      for elementName in G_UIElementArray.keys():
            Widget = G_UIElementArray
            try:
                ifWidget.winfo_exists() == 1:
                  WinClass = Widget.winfo_class()
                  StyleName = ".T"+WinClass
                  ifStyleName == '.TLabel':
                        Root = GetElement(uiName,'root')
                        Root['background'] = StyleArray['background']
                  for attribute in StyleArray.keys():
                        Widget = StyleArray
            except BaseException:
                continue
======================================================================
#取得一个界面的所有属入数据
def GetInputDataArray(uiName):
    global G_UIElementArray
    global G_UIInputDataArray
    global G_UIElementVariableArray
    G_UIInputDataArray.clear()
    if uiName in G_UIElementArray:
      for elementName in G_UIElementArray.keys():
            G_UIInputDataArray = []
            Widget = G_UIElementArray
            if elementName.find('Text_') >= 0:
                content = Widget.get('0.0', tkinter.END)
                G_UIInputDataArray.append(content)
            elif elementName.find('Entry_') >= 0:
                content = G_UIElementVariableArray.get()
                G_UIInputDataArray.append(content)
    if uiName in G_UIElementVariableArray:
      for elementName in G_UIElementVariableArray.keys():
         if elementName.find('Group_') >= 0:
                ElementIntValue = G_UIElementVariableArray.get()
                G_UIInputDataArray = []
                G_UIInputDataArray.append(ElementIntValue)
    return G_UIInputDataArray
======================================================================
#将一个弹出的界面对话框居中显示
def CenterDlg(uiName,popupDlg,dw=0,dh=0):
    if dw == 0:
      dw = popupDlg.winfo_width()
    if dh == 0:
      dh = popupDlg.winfo_height()
    root = GetElement(uiName,'root')
    if root != None:
       sw = root.winfo_width()
       sh = root.winfo_height()
       sx = root.winfo_x()
       sy = root.winfo_y()
       popupDlg.geometry('%dx%d+%d+%d'%(dw,dh,sx+(sw-dw)/2,sy+(sh-dh)/2))
    else:
       import ctypes
       user32 = ctypes.windll.user32
       sw = user32.GetSystemMetrics(0)
       sh = user32.GetSystemMetrics(1)
       sx = 0
       sy = 0
       popupDlg.geometry('%dx%d+%d+%d'%(dw,dh,sx+(sw-dw)/2,sy+(sh-dh)/2))
======================================================================
#设置控件的圆角属性,在界面的py中调用,但因为界面尚未创建,所以要稍候二次调用ShowRoundedRectangle,注意:这个函数不跨平台
def SetRoundedRectangle(control,WidthEllipse=20,HeightEllipse=20):
    if control != None:
       control.after(10, lambda: ShowRoundedRectangle(control,WidthEllipse,HeightEllipse))
======================================================================
#立即设置控件的圆角属性,注意:这个函数不跨平台
def ShowRoundedRectangle(control,WidthEllipse,HeightEllipse):
    import win32gui
    HRGN = win32gui.CreateRoundRectRgn(0,0,control.winfo_width(),control.winfo_height(),WidthEllipse,HeightEllipse)
    win32gui.SetWindowRgn(control.winfo_id(), HRGN,1)
======================================================================
#弹出对话框
def MessageBox(text):
    tkinter.messagebox.showwarning('info',text)
======================================================================
#弹出输入框
def InputBox(title,text):
    res = tkinter.simpledialog.askstring(title,'Input Box',initialvalue=text)
    return res
======================================================================
#弹出选择是与否对话框
def AskBox(title,text):
    res = tkinter.messagebox.askyesno(title,text)
    return res
======================================================================
#返回目录里的所有文件
def WalkAllResFiles(parentPath,alldirs=True,extName=None):
    ResultFilesArray = []
    if os.path.exists(parentPath) == True:
      for fileName in os.listdir(parentPath):
            if '__pycache__' not in fileName:
                if '.git' not in fileName:
                  newPath = parentPath +'\\'+ fileName
                  if os.path.isdir(newPath):
                        if extName == None:
                           ResultFilesArray.append(newPath)
                        if alldirs == True:
                            ResultFilesArray.extend(WalkAllResFiles(newPath,alldirs,extName))
                  else:
                        if extName == None:
                            ResultFilesArray.append(newPath)
                        else:
                            file_extension = os.path.splitext(fileName).replace('.','')
                            file_extension_lower = file_extension.lower().strip()
                            file_extName_lower = extName.lower().strip()
                            if file_extension_lower == file_extName_lower:
                              ResultFilesArray.append(newPath)
    return ResultFilesArray
======================================================================
#对事件响应函数进行重新定义
def EventFunction_Adaptor(fun,**params):
    return lambda event, fun=fun, params=params: fun(event, **params)
======================================================================
#设置控件的绝对或相对位置
def SetControlPlace(control,x,y,w,h):
    control.place(x=0,y=0,width=0,height=0)
    control.place(relx=0,rely=0,relwidth=0,relheight=0)
    if type(x) == type(1.0):
      if type(y) == type(1.0):
            if type(w) == type(1.0):
                if type(h) == type(1.0):
                   control.place(relx=x,rely=y,relwidth=w,relheight=h)
                else:
                   control.place(relx=x,rely=y,relwidth=w,height=h)
            else:
                if type(h) == type(1.0):
                   control.place(relx=x,rely=y,width=w,relheight=h)
                else:
                   control.place(relx=x,rely=y,width=w,height=h)
      else:
            if type(w) == type(1.0):
                if type(h) == type(1.0):
                   control.place(relx=x,y=y,relwidth=w,relheight=h)
                else:
                   control.place(relx=x,y=y,relwidth=w,height=h)
            else:
                if type(h) == type(1.0):
                   control.place(relx=x,y=y,relwidth=w,relheight=h)
                else:
                   control.place(relx=x,y=y,relwidth=w,height=h)
    else:
      if type(y) == type(1.0):
            if type(w) == type(1.0):
                if type(h) == type(1.0):
                   control.place(x=x,rely=y,relwidth=w,relheight=h)
                else:
                   control.place(x=x,rely=y,relwidth=w,height=h)
            else:
                if type(h) == type(1.0):
                   control.place(x=x,rely=y,width=w,relheight=h)
                else:
                   control.place(x=x,rely=y,width=w,height=h)
      else:
            if type(w) == type(1.0):
                if type(h) == type(1.0):
                   control.place(x=x,y=y,relwidth=w,relheight=h)
                else:
                   control.place(x=x,y=y,relwidth=w,height=h)
            else:
                if type(h) == type(1.0):
                   control.place(x=x,y=y,width=w,relheight=h)
                else:
                   control.place(x=x,y=y,width=w,height=h)
======================================================================
#窗口的可拖拽类实现
class WindowDraggable():
    def __init__(self,widget,bordersize = 6,bordercolor = '#444444'):
      self.widget = widget
      widget.bind('<Enter>',self.Enter)
      widget.bind('<Motion>',self.Motion)
      widget.bind('<Leave>',self.Leave)
      widget.bind('<ButtonPress-1>',self.StartDrag)
      widget.bind('<ButtonRelease-1>',self.StopDrag)
      widget.bind('<B1-Motion>',self.MoveDragPos)
      self.bordersize = bordersize
      self.bordercolor = bordercolor
      self.top_drag = None
      self.left_drag = None
      self.right_drag = None
      self.bottom_drag = None
      self.topleft_drag = None
      self.bottomleft_drag = None
      self.topright_drag = None
      self.bottomright_drag = None
      widget.after(10, lambda: self.ShowWindowIcoToBar(widget))
    def ShowWindowIcoToBar(self,widget):
      GWL_EXSTYLE=-20
      WS_EX_APPWINDOW=0x00040000
      WS_EX_TOOLWINDOW=0x00000080
      from ctypes import windll
      hwnd = windll.user32.GetParent(widget.winfo_id())
      style = windll.user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE)
      style = style & ~WS_EX_TOOLWINDOW
      style = style | WS_EX_APPWINDOW
      res = windll.user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, style)
      widget.wm_withdraw()
      widget.after(10, lambda: widget.wm_deiconify())
    def Enter(self,event):
      if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
            formx = self.widget.winfo_x()
            formy = self.widget.winfo_y()
            formw = self.widget.winfo_width()
            formh = self.widget.winfo_height()
            x = event.x_root - formx
            y = event.y_root - formy
    def Motion(self,event):
      if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
            formx = self.widget.winfo_x()
            formy = self.widget.winfo_y()
            formw = self.widget.winfo_width()
            formh = self.widget.winfo_height()
            x = event.x_root - formx
            y = event.y_root - formy
            if ((x >= 0) and (x <= self.bordersize) and (y >= 0) and (y <= self.bordersize)):
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
                self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
                self.top_drag.configure(bg = self.bordercolor)
                self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
                self.left_drag.configure(bg = self.bordercolor)
            if ((y >= 0) and (y <= self.bordersize)):
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_V1)
                self.top_drag.bind('<Motion>',self.MotionDragBorder)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder)
                self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
                self.top_drag.configure(bg = self.bordercolor)
            if ((y >= (formh - self.bordersize)) and (y <= formh)):
                if self.bottom_drag == None:
                  self.bottom_drag = tkinter.Label(self.widget)
                self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_V2)
                self.bottom_drag.bind('<Motion>',self.MotionDragBorder)
                self.bottom_drag.bind('<Leave>',self.LeaveDragBorder)
                self.bottom_drag.place(x = 0,y = (formh - self.bordersize),width = formw,height = self.bordersize)
                self.bottom_drag.configure(bg = self.bordercolor)
            if ((x >= 0 ) and (x <= self.bordersize)):
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_H1)
                self.left_drag.bind('<Motion>',self.MotionDragBorder)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder)
                self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
                self.left_drag.configure(bg = self.bordercolor)
            if ((x >= (formw - self.bordersize)) and (x <= formw)):
                if self.right_drag == None:
                  self.right_drag = tkinter.Label(self.widget)
                self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.right_drag.bind('<B1-Motion>',self.MoveDragSize_H2)
                self.right_drag.bind('<Motion>',self.MotionDragBorder)
                self.right_drag.bind('<Leave>',self.LeaveDragBorder)
                self.right_drag.place(x = (formw - self.bordersize),y = 0,width = self.bordersize,height = formh)
                self.right_drag.configure(bg = self.bordercolor)
    def Leave(self,event):
      if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
            pass
    def StartDrag(self,event):
      self.x = event.x_root
      self.y = event.y_root
    def StopDrag(self,event):
      self.x = None
      self.y = None
      self.widget.configure(cursor='arrow')
    def MoveDragPos(self,event):
      if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
            formx = self.widget.winfo_x()
            formy = self.widget.winfo_y()
            formw = self.widget.winfo_width()
            formh = self.widget.winfo_height()
            x = event.x_root - formx
            y = event.y_root - formy
            deltaX = event.x_root - self.x
            deltaY = event.y_root - self.y
            newX = self.widget.winfo_x() + deltaX
            newY = self.widget.winfo_y() + deltaY
            geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width(),self.widget.winfo_height(),newX,newY))
            self.widget.geometry(geoinfo)
            self.x = event.x_root
            self.y = event.y_root
    def MoveDragSize_H1(self,event):
      deltaX = event.x_root - self.x
      formx = self.widget.winfo_x() + deltaX
      newW = self.widget.winfo_width() - deltaX
      geoinfo = str('%dx%d+%d+%d'%(newW,self.widget.winfo_height(),formx,self.widget.winfo_y()))
      self.widget.geometry(geoinfo)
      self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
      self.x = event.x_root
      self.widget.configure(cursor='plus')
    def MoveDragSize_H2(self,event):
      deltaX = event.x_root - self.x
      formw = self.widget.winfo_width()
      formh = self.widget.winfo_height()
      newW = self.widget.winfo_width() + deltaX
      geoinfo = str('%dx%d+%d+%d'%(newW,self.widget.winfo_height(),self.widget.winfo_x(),self.widget.winfo_y()))
      self.widget.geometry(geoinfo)
      self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = formh)
      self.x = event.x_root
      self.widget.configure(cursor='plus')
    def MoveDragSize_V1(self,event):
      deltaY = event.y_root - self.y
      formy = self.widget.winfo_y() + deltaY
      newH = self.widget.winfo_height() - deltaY
      geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width() ,newH,self.widget.winfo_x(),formy))
      self.widget.geometry(geoinfo)
      self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def MoveDragSize_V2(self,event):
      deltaY = event.y_root - self.y
      newH = self.widget.winfo_height() + deltaY
      geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width(),newH,self.widget.winfo_x(),self.widget.winfo_y()))
      self.widget.geometry(geoinfo)
      self.bottom_drag.place(x = 0,y = (newH - self.bordersize),width = self.widget.winfo_width(),height = self.bordersize)
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def MotionDragBorder(self,event):
      formx = self.widget.winfo_x()
      formy = self.widget.winfo_y()
      formw = self.widget.winfo_width()
      formh = self.widget.winfo_height()
      x = event.x_root - formx
      y = event.y_root - formy
      if event.widget == self.left_drag:
            if y >=0 and y <= self.bordersize:
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
            if y >=(formh-self.bordersize) and y <= formh:
                if self.bottom_drag == None:
                  self.bottom_drag = tkinter.Label(self.widget)
                self.bottom_drag.place(x = 0,y = formh-self.bordersize,width = formw,height = self.bordersize)
                self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
                self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BL)
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder_BL)
      if event.widget == self.right_drag:
            if y >=0 and y <= self.bordersize:
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder_TR)
                if self.right_drag == None:
                  self.right_drag = tkinter.Label(self.widget)
                self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.right_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
                self.right_drag.bind('<Leave>',self.LeaveDragBorder_TR)
            if y >=(formh-self.bordersize) and y <= formh:
                if self.bottom_drag == None:
                  self.bottom_drag = tkinter.Label(self.widget)
                self.bottom_drag.place(x = 0,y = formh-self.bordersize,width = formw,height = self.bordersize)
                self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
                self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BR)
                if self.right_drag == None:
                  self.right_drag = tkinter.Label(self.widget)
                self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.right_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
                self.right_drag.bind('<Leave>',self.LeaveDragBorder_BR)
      if event.widget == self.top_drag:
            if x >=0 and x <= self.bordersize:
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
            if x >=(formw-self.bordersize) and x <= formw:
                if self.top_drag == None:
                  self.top_drag = tkinter.Label(self.widget)
                self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
                self.top_drag.bind('<Leave>',self.LeaveDragBorder_TR)
                if self.right_drag == None:
                  self.right_drag = tkinter.Label(self.widget)
                self.right_drag.place(x = formw-self.bordersize,y = 0,width = self.bordersize,height = formh)
                self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.right_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
                self.right_drag.bind('<Leave>',self.LeaveDragBorder_TR)
      if event.widget == self.bottom_drag:
            if x >=0 and x <= self.bordersize:
                if self.bottom_drag == None:
                  self.bottom_drag = tkinter.Label(self.widget)
                self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
                self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BL)
                if self.left_drag == None:
                  self.left_drag = tkinter.Label(self.widget)
                self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
                self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.left_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
                self.left_drag.bind('<Leave>',self.LeaveDragBorder_BL)
            if x >=(formw-self.bordersize) and x <= formw:
                if self.bottom_drag == None:
                  self.bottom_drag = tkinter.Label(self.widget)
                self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
                self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BR)
                if self.right_drag == None:
                  self.right_drag = tkinter.Label(self.widget)
                self.right_drag.place(x = formw-self.bordersize,y = 0,width = self.bordersize,height = formh)
                self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
                self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
                self.right_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
                self.right_drag.bind('<Leave>',self.LeaveDragBorder_BR)
    def LeaveDragBorder(self,event):
      event.widget.place_forget()
    def MoveDragSize_TL(self,event):
      deltaX = event.x_root - self.x
      deltaY = event.y_root - self.y
      formx = self.widget.winfo_x() + deltaX
      newW = self.widget.winfo_width() - deltaX
      formy = self.widget.winfo_y() + deltaY
      newH = self.widget.winfo_height() - deltaY
      geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
      self.widget.geometry(geoinfo)
      self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
      self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
      self.x = event.x_root
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def LeaveDragBorder_TL(self,event):
      self.left_drag.place_forget()
      self.top_drag.place_forget()
      self.widget.configure(cursor='arrow')
    def MoveDragSize_TR(self,event):
      deltaX = event.x_root - self.x
      deltaY = event.y_root - self.y
      formx = self.widget.winfo_x()
      newW = self.widget.winfo_width() + deltaX
      formy = self.widget.winfo_y() + deltaY
      newH = self.widget.winfo_height() - deltaY
      geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
      self.widget.geometry(geoinfo)
      self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = self.widget.winfo_height())
      self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
      self.x = event.x_root
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def LeaveDragBorder_TR(self,event):
      self.right_drag.place_forget()
      self.top_drag.place_forget()
      self.widget.configure(cursor='arrow')
    def MoveDragSize_BL(self,event):
      deltaX = event.x_root - self.x
      deltaY = event.y_root - self.y
      formx = self.widget.winfo_x() + deltaX
      newW = self.widget.winfo_width() - deltaX
      formy = self.widget.winfo_y()
      newH = self.widget.winfo_height() + deltaY
      geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
      self.widget.geometry(geoinfo)
      self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
      self.bottom_drag.place(x = 0,y = newH-self.bordersize,width = self.widget.winfo_width(),height = self.bordersize)
      self.x = event.x_root
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def LeaveDragBorder_BL(self,event):
      self.left_drag.place_forget()
      self.bottom_drag.place_forget()
      self.widget.configure(cursor='arrow')
    def MoveDragSize_BR(self,event):
      deltaX = event.x_root - self.x
      deltaY = event.y_root - self.y
      formx = self.widget.winfo_x()
      newW = self.widget.winfo_width() + deltaX
      formy = self.widget.winfo_y()
      newH = self.widget.winfo_height() + deltaY
      geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
      self.widget.geometry(geoinfo)
      self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = self.widget.winfo_height())
      self.bottom_drag.place(x = 0,y = newH-self.bordersize,width = self.widget.winfo_width(),height = self.bordersize)
      self.x = event.x_root
      self.y = event.y_root
      self.widget.configure(cursor='plus')
    def LeaveDragBorder_BR(self,event):
      self.right_drag.place_forget()
      self.bottom_drag.place_forget()
      self.widget.configure(cursor='arrow')
======================================================================
#设置TK root 的圆角参数,支持跨平台。
def SetRootRoundRectangle(canvas,x1, y1, x2, y2, radius=25,**kwargs):
    points = [x1+radius, y1,
            x1+radius, y1,
            x2-radius, y1,
            x2-radius, y1,
            x2, y1,
            x2, y1+radius,
            x2, y1+radius,
            x2, y2-radius,
            x2, y2-radius,
            x2, y2,
            x2-radius, y2,
            x2-radius, y2,
            x1+radius, y2,
            x1+radius, y2,
            x1, y2,
            x1, y2-radius,
            x1, y2-radius,
            x1, y1+radius,
            x1, y1+radius,

    return canvas.create_polygon(points, **kwargs, smooth=True)
======================================================================
#从文件中读取内容
def ReadFromFile(filePath):
    content = None
    if filePath != None:
      if os.path.exists(filePath) == True:
            f = open(filePath,mode='r',encoding='utf-8')
            if f != None:
                content = f.read()
                f.close()
    return content
======================================================================
#将内容写入到文件中
def WriteToFile(filePath,content):
    if filePath != None:
      f = open(filePath,mode='w',encoding='utf-8')
      if f != None:
            if content != None:
                f.write(content)
            f.close()
            return True
    return False
======================================================================
#读取样式文件
def ReadStyleFile(filePath):
    StyleArray = {}
    if len(filePath)==0 :
      return StyleArray
    if os.path.exists(filePath) == False:
      return StyleArray
    f = open(filePath,encoding='utf-8')
    line =""
    while True:
      line = f.readline()
      if not line:
            break
      text = line.strip()
      if not text:
            continue
      if text.find('style = tkinter.ttk.Style()') >= 0:
            continue
      if text.find('style.configure(') >= 0:
            splitarray1 = text.partition('style.configure(')
            stylename = None
            splitarray2 = None
            if splitarray1.find(',') >= 0:
                splitarray2 = splitarray1.partition(',')
                stylename = splitarray2.replace('"','')
            else:
                splitarray2 = splitarray1.partition(')')
                stylename = splitarray2.replace('"','')
            sytleValueText = splitarray2
            fontindex_begin = sytleValueText.find('font=(')
            fontindex_end = fontindex_begin
            StyleArray = {}
            othertext = sytleValueText
            if fontindex_begin >= 0:
                fontindex_end = sytleValueText.find(')')
                fonttext = sytleValueText
                fontsplitarray = fonttext.split(',')
                StyleArray['font'] = tkinter.font.Font(family=fontsplitarray.replace('"','').strip(), size=int(fontsplitarray.replace('"','').strip()),weight=fontsplitarray.replace('"','').strip())
                othertext = sytleValueText + sytleValueText
            else:
                splitarray4 = sytleValueText.partition(')')
                othertext = splitarray4
            splitarray3 = othertext.split(',')
            for stylecfgtext in splitarray3:
                if stylecfgtext.find('=') > 0:
                  splitarray4 = stylecfgtext.partition('=')
                  key = splitarray4.replace('"','').strip()
                  value = splitarray4.replace('"','').strip()
                  StyleArray = value
            continue
      if text.find('style.map(') >= 0:
            continue
    f.close()
    return StyleArray







页: [1]
查看完整版本: FUN函数库API说明