TkinterDesigner

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 9043|回复: 0

FUN函数库API说明

[复制链接]

42

主题

119

帖子

525

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
525
发表于 2021-6-16 11:35:40 | 显示全部楼层 |阅读模式
FUN函数库API说明
===============================================
在逻辑代码中,我们经常要访问控件,或者反复实现一些常用功能,比如打开文件对话框,将对话框移动到某个位置等。为了方便这些操作,我提供了FUN.py来提供这些函数。在这里我会对Fun.py进行逐一说明。


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


======================================================================
然后是函数:
#注册控件,也就是将名字与控件实体进行绑定,后续如果想通过名字访问控件实体,必须是已注册的。这里通过uiName来区分是属于哪一个界面实例的控件,因为有可能工程里有多个界面,就使用uiName来区分。
  1. def Register(uiName,elementName,element):
  2.     if uiName not in G_UIElementArray:
  3.         G_UIElementArray[uiName]={}
  4.     G_UIElementArray[uiName][elementName]=element
复制代码

======================================================================
#通过控件名称访问控件实体。

  1. def GetElement(uiName,elementName):
  2.     global G_UIElementArray
  3.     if uiName in G_UIElementArray:
  4.         return G_UIElementArray[uiName][elementName]
  5.     return None
复制代码

======================================================================
#为控件增加TKinter变量

  1. def AddTKVariable(uiName,elementName,defaultValue = None):
  2.     if uiName not in G_UIElementVariableArray:
  3.         G_UIElementVariableArray[uiName]={}
  4.     NameLower = elementName.lower()
  5.     if NameLower.find('combobox_') >= 0:
  6.         G_UIElementVariableArray[uiName][elementName]=tkinter.IntVar()
  7.     elif NameLower.find('group_') >= 0:
  8.         G_UIElementVariableArray[uiName][elementName]=tkinter.IntVar()
  9.     elif NameLower.find('checkbutton_') >= 0:
  10.         G_UIElementVariableArray[uiName][elementName]=tkinter.BooleanVar()
  11.     else:
  12.         G_UIElementVariableArray[uiName][elementName]=tkinter.StringVar()
  13.     if defaultValue:
  14.         G_UIElementVariableArray[uiName][elementName].set(defaultValue)
  15.     return G_UIElementVariableArray[uiName][elementName]
复制代码

======================================================================
  1. #设置控件的Tkinter变量值
  2. def SetTKVariable(uiName,elementName,value):
  3.     if uiName in G_UIElementVariableArray:
  4.         if elementName in G_UIElementVariableArray[uiName]:
  5.             G_UIElementVariableArray[uiName][elementName].set(value)
复制代码

======================================================================
#取得控件的Tkinter变量

  1. def GetTKVariable(uiName,elementName):
  2.     if uiName in G_UIElementVariableArray:
  3.         if elementName in G_UIElementVariableArray[uiName]:
  4.             return G_UIElementVariableArray[uiName][elementName].get()
复制代码

======================================================================
#为控件增加一个用户绑定类型的数据

#参数dataName是数据名称,datatype是数据类型,可以包括int,float,string,list,dictory等,一般在设计软件中对控件进行鼠标右键操作,在弹出的“绑定数据变量”中设置。
#参数datavalue是数据值 ,isMapToText是指是否直接将数据反映到控件的text文本变量
  1. def AddUserData(uiName,elementName,dataName,datatype,datavalue,isMapToText):
  2.     global G_UIElementUserDataArray
  3.     if uiName not in G_UIElementUserDataArray:
  4.         G_UIElementUserDataArray[uiName]={}
  5.     if elementName not in G_UIElementUserDataArray[uiName]:
  6.         G_UIElementUserDataArray[uiName][elementName]=[]
  7.     G_UIElementUserDataArray[uiName][elementName].append([dataName,datatype,datavalue,isMapToText])
复制代码

======================================================================
#设置用户绑定数据的值

  1. def SetUserData(uiName,elementName,dataName,datavalue):
  2.     global G_UIElementArray
  3.     global G_UIElementUserDataArray
  4.     if uiName in G_UIElementUserDataArray:
  5.         if elementName in G_UIElementUserDataArray[uiName]:
  6.             for EBData in G_UIElementUserDataArray[uiName][elementName]:
  7.                 if EBData[0] == dataName:
  8.                     EBData[2] = datavalue
  9.                     if EBData[3] == 1:
  10.                         SetText(uiName,elementName,datavalue)
  11.                     return
复制代码

======================================================================
#取得用户绑定数据的值

  1. def GetUserData(uiName,elementName,dataName):
  2.     global G_UIElementUserDataArray
  3.     if  uiName in G_UIElementUserDataArray:
  4.         if elementName in G_UIElementUserDataArray[uiName]:
  5.             for EBData in G_UIElementUserDataArray[uiName][elementName]:
  6.                 if EBData[0] == dataName:
  7.                     if EBData[1]=='int':
  8.                         return int(EBData[2])
  9.                     elif EBData[1]=='float':
  10.                         return float(EBData[2])
  11.                     else:
  12.                         return EBData[2]
  13.     return None
复制代码

======================================================================
#设置控件的Tkinter属性,就等于是调用configure。

  1. def SetTKAttrib(uiName,elementName,AttribName,attribValue):
  2.     global G_UIElementArray
  3.     if uiName in G_UIElementArray:
  4.         if AttribName in G_UIElementArray[uiName][elementName].configure().keys():
  5.             G_UIElementArray[uiName][elementName][AttribName]=attribValue
复制代码

======================================================================
#取得控件的Tkinter属性值

  1. def GetTKAttrib(uiName,elementName,AttribName):
  2.     global G_UIElementArray
  3.     if uiName in G_UIElementArray:
  4.         return G_UIElementArray[uiName][elementName].cget(AttribName)
  5.     return None
复制代码

======================================================================
#设置LABEL,BUTTON,ENTRY,TEXT的文本

  1. def SetText(uiName,elementName,textValue):
  2.     global G_UIElementArray
  3.     global G_UIElementVariableArray
  4.     showtext = str("%s"%textValue)
  5.     if uiName in G_UIElementVariableArray:
  6.         if elementName in G_UIElementVariableArray[uiName]:
  7.             G_UIElementVariableArray[uiName][elementName].set(showtext)
  8.             return
  9.     if uiName in G_UIElementArray:
  10.         if elementName in G_UIElementArray[uiName]:
  11.             if elementName.find('Text_') >= 0:
  12.                 G_UIElementArray[uiName][elementName].delete('0.0',tkinter.END)
  13.                 G_UIElementArray[uiName][elementName].insert(tkinter.END,showtext)
  14.             else:
  15.                 G_UIElementArray[uiName][elementName].configure(text=showtext)
复制代码

======================================================================
#取得LABEL,BUTTON,ENTRY,TEXT的文本

  1. def GetText(uiName,elementName):
  2.     global G_UIElementArray
  3.     global G_UIElementVariableArray
  4.     if uiName in G_UIElementVariableArray:
  5.         if elementName in G_UIElementVariableArray[uiName]:
  6.             return G_UIElementVariableArray[uiName][elementName].get()
  7.     if uiName in G_UIElementArray:
  8.         if elementName in G_UIElementArray[uiName]:
  9.             if elementName.find('Text_') >= 0:
  10.                 return G_UIElementArray[uiName][elementName].get('0.0', tkinter.END)
  11.             elif elementName.find('Spinbox_') >= 0:
  12.                 return str(G_UIElementArray[uiName][elementName].get())
  13.             else:
  14.                 return G_UIElementArray[uiName][elementName].cget('text')
  15.     return str("")
复制代码

======================================================================
#设置LABEL,BUTTON的背景图片

  1. def SetImage(uiName,elementName,imagePath):
  2.     global G_UIElementVariableArray
  3.     if elementName.find('Label_') == 0 or elementName.find('Button_') == 0 :
  4.         Control = GetElement(uiName,elementName)
  5.         if Control != None:
  6.             if uiName in G_UIElementUserDataArray:
  7.                 if elementName in G_UIElementUserDataArray[uiName]:
  8.                     for EBData in G_UIElementUserDataArray[uiName][elementName]:
  9.                         if EBData[0] == 'image':
  10.                             EBData[1] = imagePath
  11.                             from   PIL import Image,ImageTk
  12.                             image=Image.open(imagePath).convert('RGBA')
  13.                             image_Resize = image.resize((Control.winfo_width(), Control.winfo_height()),Image.ANTIALIAS)
  14.                             EBData[2] = ImageTk.PhotoImage(image_Resize)
  15.                             Control.configure(image = EBData[2])
  16.                             return
  17.             from   PIL import Image,ImageTk
  18.             image=Image.open(imagePath).convert('RGBA')
  19.             image_Resize = image.resize((Control.winfo_width(), Control.winfo_height()),Image.ANTIALIAS)
  20.             EBData2 = ImageTk.PhotoImage(image_Resize)
  21.             AddUserData(uiName,elementName,'image',imagePath,EBData2,0)
  22.             Control.configure(image = EBData2)
复制代码

======================================================================
#取得LABEL,BUTTON的背景图片

  1. def GetImage(uiName,elementName):
  2.     global G_UIElementVariableArray
  3.     if elementName.find('Label_') == 0 or elementName.find('Button_') == 0 :
  4.         Control = GetElement(uiName,elementName)
  5.         if Control != None:
  6.             if uiName in G_UIElementUserDataArray:
  7.                 if elementName in G_UIElementUserDataArray[uiName]:
  8.                     for EBData in G_UIElementUserDataArray[uiName][elementName]:
  9.                         if EBData[0] == 'image':
  10.                             return EBData[1]
  11.     return str("")
复制代码

======================================================================
#初始化所有的用户绑定数据,无须手动调用。

  1. def InitElementData(uiName):
  2.     global G_UIElementUserDataArray
  3.     if uiName in G_UIElementUserDataArray:
  4.         for elementName in G_UIElementUserDataArray[uiName].keys():
  5.             for EBData in G_UIElementUserDataArray[uiName][elementName]:
  6.                 if EBData[3] == 1:
  7.                     SetText(uiName,elementName,EBData[2])
  8.                     SetText(uiName,elementName,EBData[2])
复制代码

======================================================================
#初始化样式,无须手动调用。

  1. def InitElementStyle(uiName,Style):
  2.     StyleArray = ReadStyleFile(Style+".py")
  3.     global G_UIElementArray
  4.     if uiName in G_UIElementArray:
  5.         for elementName in G_UIElementArray[uiName].keys():
  6.             Widget = G_UIElementArray[uiName][elementName]
  7.             try:
  8.                 if  Widget.winfo_exists() == 1:
  9.                     WinClass = Widget.winfo_class()
  10.                     StyleName = ".T"+WinClass
  11.                     if  StyleName == '.TLabel':
  12.                         Root = GetElement(uiName,'root')
  13.                         Root['background'] = StyleArray[StyleName]['background']
  14.                     for attribute in StyleArray[StyleName].keys():
  15.                         Widget[attribute] = StyleArray[StyleName][attribute]
  16.             except BaseException:
  17.                 continue
复制代码

======================================================================
#取得一个界面的所有属入数据

  1. def GetInputDataArray(uiName):
  2.     global G_UIElementArray
  3.     global G_UIInputDataArray
  4.     global G_UIElementVariableArray
  5.     G_UIInputDataArray.clear()
  6.     if uiName in G_UIElementArray:
  7.         for elementName in G_UIElementArray[uiName].keys():
  8.             G_UIInputDataArray[elementName] = []
  9.             Widget = G_UIElementArray[uiName][elementName]
  10.             if elementName.find('Text_') >= 0:
  11.                 content = Widget.get('0.0', tkinter.END)
  12.                 G_UIInputDataArray[elementName].append(content)
  13.             elif elementName.find('Entry_') >= 0:
  14.                 content = G_UIElementVariableArray[uiName][elementName].get()
  15.                 G_UIInputDataArray[elementName].append(content)
  16.     if uiName in G_UIElementVariableArray:
  17.         for elementName in G_UIElementVariableArray[uiName].keys():
  18.            if elementName.find('Group_') >= 0:
  19.                 ElementIntValue = G_UIElementVariableArray[uiName][elementName].get()
  20.                 G_UIInputDataArray[elementName] = []
  21.                 G_UIInputDataArray[elementName].append(ElementIntValue)
  22.     return G_UIInputDataArray
复制代码

======================================================================
#将一个弹出的界面对话框居中显示

  1. def CenterDlg(uiName,popupDlg,dw=0,dh=0):
  2.     if dw == 0:
  3.         dw = popupDlg.winfo_width()
  4.     if dh == 0:
  5.         dh = popupDlg.winfo_height()
  6.     root = GetElement(uiName,'root')
  7.     if root != None:
  8.        sw = root.winfo_width()
  9.        sh = root.winfo_height()
  10.        sx = root.winfo_x()
  11.        sy = root.winfo_y()
  12.        popupDlg.geometry('%dx%d+%d+%d'%(dw,dh,sx+(sw-dw)/2,sy+(sh-dh)/2))
  13.     else:
  14.        import ctypes
  15.        user32 = ctypes.windll.user32
  16.        sw = user32.GetSystemMetrics(0)
  17.        sh = user32.GetSystemMetrics(1)
  18.        sx = 0
  19.        sy = 0
  20.        popupDlg.geometry('%dx%d+%d+%d'%(dw,dh,sx+(sw-dw)/2,sy+(sh-dh)/2))
复制代码

======================================================================
#设置控件的圆角属性,在界面的py中调用,但因为界面尚未创建,所以要稍候二次调用ShowRoundedRectangle,注意:这个函数不跨平台

  1. def SetRoundedRectangle(control,WidthEllipse=20,HeightEllipse=20):
  2.     if control != None:
  3.        control.after(10, lambda: ShowRoundedRectangle(control,WidthEllipse,HeightEllipse))
复制代码

======================================================================
#立即设置控件的圆角属性,注意:这个函数不跨平台

  1. def ShowRoundedRectangle(control,WidthEllipse,HeightEllipse):
  2.     import win32gui
  3.     HRGN = win32gui.CreateRoundRectRgn(0,0,control.winfo_width(),control.winfo_height(),WidthEllipse,HeightEllipse)
  4.     win32gui.SetWindowRgn(control.winfo_id(), HRGN,1)
复制代码

======================================================================
#弹出对话框

  1. def MessageBox(text):
  2.     tkinter.messagebox.showwarning('info',text)
复制代码

======================================================================
#弹出输入框

  1. def InputBox(title,text):
  2.     res = tkinter.simpledialog.askstring(title,'Input Box',initialvalue=text)
  3.     return res
复制代码

======================================================================
#弹出选择是与否对话框

  1. def AskBox(title,text):
  2.     res = tkinter.messagebox.askyesno(title,text)
  3.     return res
复制代码

======================================================================
#返回目录里的所有文件

  1. def WalkAllResFiles(parentPath,alldirs=True,extName=None):
  2.     ResultFilesArray = []
  3.     if os.path.exists(parentPath) == True:
  4.         for fileName in os.listdir(parentPath):
  5.             if '__pycache__' not in fileName:
  6.                 if '.git' not in fileName:
  7.                     newPath = parentPath +'\\'+ fileName
  8.                     if os.path.isdir(newPath):
  9.                         if extName == None:
  10.                            ResultFilesArray.append(newPath)
  11.                         if alldirs == True:
  12.                             ResultFilesArray.extend(WalkAllResFiles(newPath,alldirs,extName))
  13.                     else:
  14.                         if extName == None:
  15.                             ResultFilesArray.append(newPath)
  16.                         else:
  17.                             file_extension = os.path.splitext(fileName)[1].replace('.','')
  18.                             file_extension_lower = file_extension.lower().strip()
  19.                             file_extName_lower = extName.lower().strip()
  20.                             if file_extension_lower == file_extName_lower:
  21.                                 ResultFilesArray.append(newPath)
  22.     return ResultFilesArray
复制代码

======================================================================
#对事件响应函数进行重新定义

  1. def EventFunction_Adaptor(fun,  **params):
  2.     return lambda event, fun=fun, params=params: fun(event, **params)
复制代码

======================================================================
#设置控件的绝对或相对位置

  1. def SetControlPlace(control,x,y,w,h):
  2.     control.place(x=0,y=0,width=0,height=0)
  3.     control.place(relx=0,rely=0,relwidth=0,relheight=0)
  4.     if type(x) == type(1.0):
  5.         if type(y) == type(1.0):
  6.             if type(w) == type(1.0):
  7.                 if type(h) == type(1.0):
  8.                    control.place(relx=x,rely=y,relwidth=w,relheight=h)
  9.                 else:
  10.                    control.place(relx=x,rely=y,relwidth=w,height=h)
  11.             else:
  12.                 if type(h) == type(1.0):
  13.                    control.place(relx=x,rely=y,width=w,relheight=h)
  14.                 else:
  15.                    control.place(relx=x,rely=y,width=w,height=h)
  16.         else:
  17.             if type(w) == type(1.0):
  18.                 if type(h) == type(1.0):
  19.                    control.place(relx=x,y=y,relwidth=w,relheight=h)
  20.                 else:
  21.                    control.place(relx=x,y=y,relwidth=w,height=h)
  22.             else:
  23.                 if type(h) == type(1.0):
  24.                    control.place(relx=x,y=y,relwidth=w,relheight=h)
  25.                 else:
  26.                    control.place(relx=x,y=y,relwidth=w,height=h)
  27.     else:
  28.         if type(y) == type(1.0):
  29.             if type(w) == type(1.0):
  30.                 if type(h) == type(1.0):
  31.                    control.place(x=x,rely=y,relwidth=w,relheight=h)
  32.                 else:
  33.                    control.place(x=x,rely=y,relwidth=w,height=h)
  34.             else:
  35.                 if type(h) == type(1.0):
  36.                    control.place(x=x,rely=y,width=w,relheight=h)
  37.                 else:
  38.                    control.place(x=x,rely=y,width=w,height=h)
  39.         else:
  40.             if type(w) == type(1.0):
  41.                 if type(h) == type(1.0):
  42.                    control.place(x=x,y=y,relwidth=w,relheight=h)
  43.                 else:
  44.                    control.place(x=x,y=y,relwidth=w,height=h)
  45.             else:
  46.                 if type(h) == type(1.0):
  47.                    control.place(x=x,y=y,width=w,relheight=h)
  48.                 else:
  49.                    control.place(x=x,y=y,width=w,height=h)
复制代码

======================================================================
#窗口的可拖拽类实现

  1. class WindowDraggable():
  2.     def __init__(self,widget,bordersize = 6,bordercolor = '#444444'):
  3.         self.widget = widget
  4.         widget.bind('<Enter>',self.Enter)
  5.         widget.bind('<Motion>',self.Motion)
  6.         widget.bind('<Leave>',self.Leave)
  7.         widget.bind('<ButtonPress-1>',self.StartDrag)
  8.         widget.bind('<ButtonRelease-1>',self.StopDrag)
  9.         widget.bind('<B1-Motion>',self.MoveDragPos)
  10.         self.bordersize = bordersize
  11.         self.bordercolor = bordercolor
  12.         self.top_drag = None
  13.         self.left_drag = None
  14.         self.right_drag = None
  15.         self.bottom_drag = None
  16.         self.topleft_drag = None
  17.         self.bottomleft_drag = None
  18.         self.topright_drag = None
  19.         self.bottomright_drag = None
  20.         widget.after(10, lambda: self.ShowWindowIcoToBar(widget))
  21.     def ShowWindowIcoToBar(self,widget):
  22.         GWL_EXSTYLE=-20
  23.         WS_EX_APPWINDOW=0x00040000
  24.         WS_EX_TOOLWINDOW=0x00000080
  25.         from ctypes import windll
  26.         hwnd = windll.user32.GetParent(widget.winfo_id())
  27.         style = windll.user32.GetWindowLongPtrW(hwnd, GWL_EXSTYLE)
  28.         style = style & ~WS_EX_TOOLWINDOW
  29.         style = style | WS_EX_APPWINDOW
  30.         res = windll.user32.SetWindowLongPtrW(hwnd, GWL_EXSTYLE, style)
  31.         widget.wm_withdraw()
  32.         widget.after(10, lambda: widget.wm_deiconify())
  33.     def Enter(self,event):
  34.         if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
  35.             formx = self.widget.winfo_x()
  36.             formy = self.widget.winfo_y()
  37.             formw = self.widget.winfo_width()
  38.             formh = self.widget.winfo_height()
  39.             x = event.x_root - formx
  40.             y = event.y_root - formy
  41.     def Motion(self,event):
  42.         if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
  43.             formx = self.widget.winfo_x()
  44.             formy = self.widget.winfo_y()
  45.             formw = self.widget.winfo_width()
  46.             formh = self.widget.winfo_height()
  47.             x = event.x_root - formx
  48.             y = event.y_root - formy
  49.             if ((x >= 0) and (x <= self.bordersize) and (y >= 0) and (y <= self.bordersize)):
  50.                 if self.top_drag == None:
  51.                     self.top_drag = tkinter.Label(self.widget)
  52.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  53.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  54.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  55.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  56.                 if self.left_drag == None:
  57.                     self.left_drag = tkinter.Label(self.widget)
  58.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  59.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  60.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  61.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  62.                 self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
  63.                 self.top_drag.configure(bg = self.bordercolor)
  64.                 self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
  65.                 self.left_drag.configure(bg = self.bordercolor)
  66.             if ((y >= 0) and (y <= self.bordersize)):
  67.                 if self.top_drag == None:
  68.                     self.top_drag = tkinter.Label(self.widget)
  69.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  70.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  71.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_V1)
  72.                 self.top_drag.bind('<Motion>',self.MotionDragBorder)
  73.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder)
  74.                 self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
  75.                 self.top_drag.configure(bg = self.bordercolor)
  76.             if ((y >= (formh - self.bordersize)) and (y <= formh)):
  77.                 if self.bottom_drag == None:
  78.                     self.bottom_drag = tkinter.Label(self.widget)
  79.                 self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
  80.                 self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
  81.                 self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_V2)
  82.                 self.bottom_drag.bind('<Motion>',self.MotionDragBorder)
  83.                 self.bottom_drag.bind('<Leave>',self.LeaveDragBorder)
  84.                 self.bottom_drag.place(x = 0,y = (formh - self.bordersize),width = formw,height = self.bordersize)
  85.                 self.bottom_drag.configure(bg = self.bordercolor)
  86.             if ((x >= 0 ) and (x <= self.bordersize)):
  87.                 if self.left_drag == None:
  88.                     self.left_drag = tkinter.Label(self.widget)
  89.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  90.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  91.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_H1)
  92.                 self.left_drag.bind('<Motion>',self.MotionDragBorder)
  93.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder)
  94.                 self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
  95.                 self.left_drag.configure(bg = self.bordercolor)
  96.             if ((x >= (formw - self.bordersize)) and (x <= formw)):
  97.                 if self.right_drag == None:
  98.                     self.right_drag = tkinter.Label(self.widget)
  99.                 self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
  100.                 self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
  101.                 self.right_drag.bind('<B1-Motion>',self.MoveDragSize_H2)
  102.                 self.right_drag.bind('<Motion>',self.MotionDragBorder)
  103.                 self.right_drag.bind('<Leave>',self.LeaveDragBorder)
  104.                 self.right_drag.place(x = (formw - self.bordersize),y = 0,width = self.bordersize,height = formh)
  105.                 self.right_drag.configure(bg = self.bordercolor)
  106.     def Leave(self,event):
  107.         if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
  108.             pass
  109.     def StartDrag(self,event):
  110.         self.x = event.x_root
  111.         self.y = event.y_root
  112.     def StopDrag(self,event):
  113.         self.x = None
  114.         self.y = None
  115.         self.widget.configure(cursor='arrow')
  116.     def MoveDragPos(self,event):
  117.         if self.widget == event.widget or event.widget.winfo_class() =="Canvas":
  118.             formx = self.widget.winfo_x()
  119.             formy = self.widget.winfo_y()
  120.             formw = self.widget.winfo_width()
  121.             formh = self.widget.winfo_height()
  122.             x = event.x_root - formx
  123.             y = event.y_root - formy
  124.             deltaX = event.x_root - self.x
  125.             deltaY = event.y_root - self.y
  126.             newX = self.widget.winfo_x() + deltaX
  127.             newY = self.widget.winfo_y() + deltaY
  128.             geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width(),self.widget.winfo_height(),newX,newY))
  129.             self.widget.geometry(geoinfo)
  130.             self.x = event.x_root
  131.             self.y = event.y_root
  132.     def MoveDragSize_H1(self,event):
  133.         deltaX = event.x_root - self.x
  134.         formx = self.widget.winfo_x() + deltaX
  135.         newW = self.widget.winfo_width() - deltaX
  136.         geoinfo = str('%dx%d+%d+%d'%(newW,self.widget.winfo_height(),formx,self.widget.winfo_y()))
  137.         self.widget.geometry(geoinfo)
  138.         self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
  139.         self.x = event.x_root
  140.         self.widget.configure(cursor='plus')
  141.     def MoveDragSize_H2(self,event):
  142.         deltaX = event.x_root - self.x
  143.         formw = self.widget.winfo_width()
  144.         formh = self.widget.winfo_height()
  145.         newW = self.widget.winfo_width() + deltaX
  146.         geoinfo = str('%dx%d+%d+%d'%(newW,self.widget.winfo_height(),self.widget.winfo_x(),self.widget.winfo_y()))
  147.         self.widget.geometry(geoinfo)
  148.         self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = formh)
  149.         self.x = event.x_root
  150.         self.widget.configure(cursor='plus')
  151.     def MoveDragSize_V1(self,event):
  152.         deltaY = event.y_root - self.y
  153.         formy = self.widget.winfo_y() + deltaY
  154.         newH = self.widget.winfo_height() - deltaY
  155.         geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width() ,newH,self.widget.winfo_x(),formy))
  156.         self.widget.geometry(geoinfo)
  157.         self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
  158.         self.y = event.y_root
  159.         self.widget.configure(cursor='plus')
  160.     def MoveDragSize_V2(self,event):
  161.         deltaY = event.y_root - self.y
  162.         newH = self.widget.winfo_height() + deltaY
  163.         geoinfo = str('%dx%d+%d+%d'%(self.widget.winfo_width(),newH,self.widget.winfo_x(),self.widget.winfo_y()))
  164.         self.widget.geometry(geoinfo)
  165.         self.bottom_drag.place(x = 0,y = (newH - self.bordersize),width = self.widget.winfo_width(),height = self.bordersize)
  166.         self.y = event.y_root
  167.         self.widget.configure(cursor='plus')
  168.     def MotionDragBorder(self,event):
  169.         formx = self.widget.winfo_x()
  170.         formy = self.widget.winfo_y()
  171.         formw = self.widget.winfo_width()
  172.         formh = self.widget.winfo_height()
  173.         x = event.x_root - formx
  174.         y = event.y_root - formy
  175.         if event.widget == self.left_drag:
  176.             if y >=0 and y <= self.bordersize:
  177.                 if self.top_drag == None:
  178.                     self.top_drag = tkinter.Label(self.widget)
  179.                 self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
  180.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  181.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  182.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  183.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  184.                 if self.left_drag == None:
  185.                     self.left_drag = tkinter.Label(self.widget)
  186.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  187.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  188.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  189.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  190.             if y >=(formh-self.bordersize) and y <= formh:
  191.                 if self.bottom_drag == None:
  192.                     self.bottom_drag = tkinter.Label(self.widget)
  193.                 self.bottom_drag.place(x = 0,y = formh-self.bordersize,width = formw,height = self.bordersize)
  194.                 self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
  195.                 self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
  196.                 self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
  197.                 self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BL)
  198.                 if self.left_drag == None:
  199.                     self.left_drag = tkinter.Label(self.widget)
  200.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  201.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  202.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
  203.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder_BL)
  204.         if event.widget == self.right_drag:
  205.             if y >=0 and y <= self.bordersize:
  206.                 if self.top_drag == None:
  207.                     self.top_drag = tkinter.Label(self.widget)
  208.                 self.top_drag.place(x = 0,y = 0,width = formw,height = self.bordersize)
  209.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  210.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  211.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
  212.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder_TR)
  213.                 if self.right_drag == None:
  214.                     self.right_drag = tkinter.Label(self.widget)
  215.                 self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
  216.                 self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
  217.                 self.right_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
  218.                 self.right_drag.bind('<Leave>',self.LeaveDragBorder_TR)
  219.             if y >=(formh-self.bordersize) and y <= formh:
  220.                 if self.bottom_drag == None:
  221.                     self.bottom_drag = tkinter.Label(self.widget)
  222.                 self.bottom_drag.place(x = 0,y = formh-self.bordersize,width = formw,height = self.bordersize)
  223.                 self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
  224.                 self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
  225.                 self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
  226.                 self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BR)
  227.                 if self.right_drag == None:
  228.                     self.right_drag = tkinter.Label(self.widget)
  229.                 self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
  230.                 self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
  231.                 self.right_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
  232.                 self.right_drag.bind('<Leave>',self.LeaveDragBorder_BR)
  233.         if event.widget == self.top_drag:
  234.             if x >=0 and x <= self.bordersize:
  235.                 if self.top_drag == None:
  236.                     self.top_drag = tkinter.Label(self.widget)
  237.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  238.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  239.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  240.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  241.                 if self.left_drag == None:
  242.                     self.left_drag = tkinter.Label(self.widget)
  243.                 self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
  244.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  245.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  246.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_TL)
  247.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder_TL)
  248.             if x >=(formw-self.bordersize) and x <= formw:
  249.                 if self.top_drag == None:
  250.                     self.top_drag = tkinter.Label(self.widget)
  251.                 self.top_drag.bind('<ButtonPress-1>',self.StartDrag)
  252.                 self.top_drag.bind('<ButtonRelease-1>',self.StopDrag)
  253.                 self.top_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
  254.                 self.top_drag.bind('<Leave>',self.LeaveDragBorder_TR)
  255.                 if self.right_drag == None:
  256.                     self.right_drag = tkinter.Label(self.widget)
  257.                 self.right_drag.place(x = formw-self.bordersize,y = 0,width = self.bordersize,height = formh)
  258.                 self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
  259.                 self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
  260.                 self.right_drag.bind('<B1-Motion>',self.MoveDragSize_TR)
  261.                 self.right_drag.bind('<Leave>',self.LeaveDragBorder_TR)
  262.         if event.widget == self.bottom_drag:
  263.             if x >=0 and x <= self.bordersize:
  264.                 if self.bottom_drag == None:
  265.                     self.bottom_drag = tkinter.Label(self.widget)
  266.                 self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
  267.                 self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
  268.                 self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
  269.                 self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BL)
  270.                 if self.left_drag == None:
  271.                     self.left_drag = tkinter.Label(self.widget)
  272.                 self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = formh)
  273.                 self.left_drag.bind('<ButtonPress-1>',self.StartDrag)
  274.                 self.left_drag.bind('<ButtonRelease-1>',self.StopDrag)
  275.                 self.left_drag.bind('<B1-Motion>',self.MoveDragSize_BL)
  276.                 self.left_drag.bind('<Leave>',self.LeaveDragBorder_BL)
  277.             if x >=(formw-self.bordersize) and x <= formw:
  278.                 if self.bottom_drag == None:
  279.                     self.bottom_drag = tkinter.Label(self.widget)
  280.                 self.bottom_drag.bind('<ButtonPress-1>',self.StartDrag)
  281.                 self.bottom_drag.bind('<ButtonRelease-1>',self.StopDrag)
  282.                 self.bottom_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
  283.                 self.bottom_drag.bind('<Leave>',self.LeaveDragBorder_BR)  
  284.                 if self.right_drag == None:
  285.                     self.right_drag = tkinter.Label(self.widget)
  286.                 self.right_drag.place(x = formw-self.bordersize,y = 0,width = self.bordersize,height = formh)
  287.                 self.right_drag.bind('<ButtonPress-1>',self.StartDrag)
  288.                 self.right_drag.bind('<ButtonRelease-1>',self.StopDrag)
  289.                 self.right_drag.bind('<B1-Motion>',self.MoveDragSize_BR)
  290.                 self.right_drag.bind('<Leave>',self.LeaveDragBorder_BR)
  291.     def LeaveDragBorder(self,event):
  292.         event.widget.place_forget()
  293.     def MoveDragSize_TL(self,event):
  294.         deltaX = event.x_root - self.x
  295.         deltaY = event.y_root - self.y
  296.         formx = self.widget.winfo_x() + deltaX
  297.         newW = self.widget.winfo_width() - deltaX
  298.         formy = self.widget.winfo_y() + deltaY
  299.         newH = self.widget.winfo_height() - deltaY
  300.         geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
  301.         self.widget.geometry(geoinfo)
  302.         self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
  303.         self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
  304.         self.x = event.x_root
  305.         self.y = event.y_root
  306.         self.widget.configure(cursor='plus')
  307.     def LeaveDragBorder_TL(self,event):
  308.         self.left_drag.place_forget()
  309.         self.top_drag.place_forget()
  310.         self.widget.configure(cursor='arrow')
  311.     def MoveDragSize_TR(self,event):
  312.         deltaX = event.x_root - self.x
  313.         deltaY = event.y_root - self.y
  314.         formx = self.widget.winfo_x()
  315.         newW = self.widget.winfo_width() + deltaX
  316.         formy = self.widget.winfo_y() + deltaY
  317.         newH = self.widget.winfo_height() - deltaY
  318.         geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
  319.         self.widget.geometry(geoinfo)
  320.         self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = self.widget.winfo_height())
  321.         self.top_drag.place(x = 0,y = 0,width = self.widget.winfo_width(),height = self.bordersize)
  322.         self.x = event.x_root
  323.         self.y = event.y_root
  324.         self.widget.configure(cursor='plus')
  325.     def LeaveDragBorder_TR(self,event):
  326.         self.right_drag.place_forget()
  327.         self.top_drag.place_forget()
  328.         self.widget.configure(cursor='arrow')
  329.     def MoveDragSize_BL(self,event):
  330.         deltaX = event.x_root - self.x
  331.         deltaY = event.y_root - self.y
  332.         formx = self.widget.winfo_x() + deltaX
  333.         newW = self.widget.winfo_width() - deltaX
  334.         formy = self.widget.winfo_y()
  335.         newH = self.widget.winfo_height() + deltaY
  336.         geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
  337.         self.widget.geometry(geoinfo)
  338.         self.left_drag.place(x = 0,y = 0,width = self.bordersize,height = self.widget.winfo_height())
  339.         self.bottom_drag.place(x = 0,y = newH-self.bordersize,width = self.widget.winfo_width(),height = self.bordersize)
  340.         self.x = event.x_root
  341.         self.y = event.y_root
  342.         self.widget.configure(cursor='plus')
  343.     def LeaveDragBorder_BL(self,event):
  344.         self.left_drag.place_forget()
  345.         self.bottom_drag.place_forget()
  346.         self.widget.configure(cursor='arrow')
  347.     def MoveDragSize_BR(self,event):
  348.         deltaX = event.x_root - self.x
  349.         deltaY = event.y_root - self.y
  350.         formx = self.widget.winfo_x()
  351.         newW = self.widget.winfo_width() + deltaX
  352.         formy = self.widget.winfo_y()
  353.         newH = self.widget.winfo_height() + deltaY
  354.         geoinfo = str('%dx%d+%d+%d'%(newW,newH,formx,formy))
  355.         self.widget.geometry(geoinfo)
  356.         self.right_drag.place(x = newW-self.bordersize,y = 0,width = self.bordersize,height = self.widget.winfo_height())
  357.         self.bottom_drag.place(x = 0,y = newH-self.bordersize,width = self.widget.winfo_width(),height = self.bordersize)
  358.         self.x = event.x_root
  359.         self.y = event.y_root
  360.         self.widget.configure(cursor='plus')
  361.     def LeaveDragBorder_BR(self,event):
  362.         self.right_drag.place_forget()
  363.         self.bottom_drag.place_forget()
  364.         self.widget.configure(cursor='arrow')
复制代码

======================================================================
#设置TK root 的圆角参数,支持跨平台。

  1. def SetRootRoundRectangle(canvas,x1, y1, x2, y2, radius=25,**kwargs):
  2.     points = [x1+radius, y1,
  3.               x1+radius, y1,
  4.               x2-radius, y1,
  5.               x2-radius, y1,
  6.               x2, y1,
  7.               x2, y1+radius,
  8.               x2, y1+radius,
  9.               x2, y2-radius,
  10.               x2, y2-radius,
  11.               x2, y2,
  12.               x2-radius, y2,
  13.               x2-radius, y2,
  14.               x1+radius, y2,
  15.               x1+radius, y2,
  16.               x1, y2,
  17.               x1, y2-radius,
  18.               x1, y2-radius,
  19.               x1, y1+radius,
  20.               x1, y1+radius,

  21.     return canvas.create_polygon(points, **kwargs, smooth=True)
复制代码

======================================================================
#从文件中读取内容

  1. def ReadFromFile(filePath):
  2.     content = None
  3.     if filePath != None:
  4.         if os.path.exists(filePath) == True:
  5.             f = open(filePath,mode='r',encoding='utf-8')
  6.             if f != None:
  7.                 content = f.read()
  8.                 f.close()
  9.     return content
复制代码

======================================================================
#将内容写入到文件中

  1. def WriteToFile(filePath,content):
  2.     if filePath != None:
  3.         f = open(filePath,mode='w',encoding='utf-8')
  4.         if f != None:
  5.             if content != None:
  6.                 f.write(content)
  7.             f.close()
  8.             return True
  9.     return False
复制代码

======================================================================
#读取样式文件

  1. def ReadStyleFile(filePath):
  2.     StyleArray = {}
  3.     if len(filePath)==0 :
  4.         return StyleArray
  5.     if os.path.exists(filePath) == False:
  6.         return StyleArray
  7.     f = open(filePath,encoding='utf-8')
  8.     line =""
  9.     while True:
  10.         line = f.readline()
  11.         if not line:
  12.             break
  13.         text = line.strip()
  14.         if not text:
  15.             continue
  16.         if text.find('style = tkinter.ttk.Style()') >= 0:
  17.             continue
  18.         if text.find('style.configure(') >= 0:
  19.             splitarray1 = text.partition('style.configure(')
  20.             stylename = None
  21.             splitarray2 = None
  22.             if splitarray1[2].find(',') >= 0:
  23.                 splitarray2 = splitarray1[2].partition(',')
  24.                 stylename = splitarray2[0].replace('"','')
  25.             else:
  26.                 splitarray2 = splitarray1[2].partition(')')
  27.                 stylename = splitarray2[0].replace('"','')
  28.             sytleValueText = splitarray2[2]
  29.             fontindex_begin = sytleValueText.find('font=(')
  30.             fontindex_end = fontindex_begin
  31.             StyleArray[stylename] = {}
  32.             othertext = sytleValueText
  33.             if fontindex_begin >= 0:
  34.                 fontindex_end = sytleValueText.find(')')
  35.                 fonttext = sytleValueText[fontindex_begin+6:fontindex_end]
  36.                 fontsplitarray = fonttext.split(',')
  37.                 StyleArray[stylename]['font'] = tkinter.font.Font(family=fontsplitarray[0].replace('"','').strip(), size=int(fontsplitarray[1].replace('"','').strip()),weight=fontsplitarray[2].replace('"','').strip())
  38.                 othertext = sytleValueText[0:fontindex_begin] + sytleValueText[fontindex_end+1:-1]
  39.             else:
  40.                 splitarray4 = sytleValueText.partition(')')
  41.                 othertext = splitarray4[0]
  42.             splitarray3 = othertext.split(',')
  43.             for stylecfgtext in splitarray3:
  44.                 if stylecfgtext.find('=') > 0:
  45.                     splitarray4 = stylecfgtext.partition('=')
  46.                     key = splitarray4[0].replace('"','').strip()
  47.                     value = splitarray4[2].replace('"','').strip()
  48.                     StyleArray[stylename][key] = value
  49.             continue
  50.         if text.find('style.map(') >= 0:
  51.             continue
  52.     f.close()
  53.     return StyleArray
复制代码







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|TkinterDesigner ( 京ICP备2021008450号-1 )

GMT+8, 2024-5-4 20:35 , Processed in 0.083286 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表