|
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[uiName]={}
- G_UIElementArray[uiName][elementName]=element
复制代码
======================================================================
#通过控件名称访问控件实体。
- def GetElement(uiName,elementName):
- global G_UIElementArray
- if uiName in G_UIElementArray:
- return G_UIElementArray[uiName][elementName]
- return None
复制代码
======================================================================
#为控件增加TKinter变量
- def AddTKVariable(uiName,elementName,defaultValue = None):
- if uiName not in G_UIElementVariableArray:
- G_UIElementVariableArray[uiName]={}
- NameLower = elementName.lower()
- if NameLower.find('combobox_') >= 0:
- G_UIElementVariableArray[uiName][elementName]=tkinter.IntVar()
- elif NameLower.find('group_') >= 0:
- G_UIElementVariableArray[uiName][elementName]=tkinter.IntVar()
- elif NameLower.find('checkbutton_') >= 0:
- G_UIElementVariableArray[uiName][elementName]=tkinter.BooleanVar()
- else:
- G_UIElementVariableArray[uiName][elementName]=tkinter.StringVar()
- if defaultValue:
- G_UIElementVariableArray[uiName][elementName].set(defaultValue)
- return G_UIElementVariableArray[uiName][elementName]
复制代码
======================================================================- #设置控件的Tkinter变量值
- def SetTKVariable(uiName,elementName,value):
- if uiName in G_UIElementVariableArray:
- if elementName in G_UIElementVariableArray[uiName]:
- G_UIElementVariableArray[uiName][elementName].set(value)
复制代码
======================================================================
#取得控件的Tkinter变量
- def GetTKVariable(uiName,elementName):
- if uiName in G_UIElementVariableArray:
- if elementName in G_UIElementVariableArray[uiName]:
- return G_UIElementVariableArray[uiName][elementName].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[uiName]={}
- if elementName not in G_UIElementUserDataArray[uiName]:
- G_UIElementUserDataArray[uiName][elementName]=[]
- G_UIElementUserDataArray[uiName][elementName].append([dataName,datatype,datavalue,isMapToText])
复制代码
======================================================================
#设置用户绑定数据的值
- def SetUserData(uiName,elementName,dataName,datavalue):
- global G_UIElementArray
- global G_UIElementUserDataArray
- if uiName in G_UIElementUserDataArray:
- if elementName in G_UIElementUserDataArray[uiName]:
- for EBData in G_UIElementUserDataArray[uiName][elementName]:
- if EBData[0] == dataName:
- EBData[2] = datavalue
- if EBData[3] == 1:
- SetText(uiName,elementName,datavalue)
- return
复制代码
======================================================================
#取得用户绑定数据的值
- def GetUserData(uiName,elementName,dataName):
- global G_UIElementUserDataArray
- if uiName in G_UIElementUserDataArray:
- if elementName in G_UIElementUserDataArray[uiName]:
- for EBData in G_UIElementUserDataArray[uiName][elementName]:
- if EBData[0] == dataName:
- if EBData[1]=='int':
- return int(EBData[2])
- elif EBData[1]=='float':
- return float(EBData[2])
- else:
- return EBData[2]
- return None
复制代码
======================================================================
#设置控件的Tkinter属性,就等于是调用configure。
- def SetTKAttrib(uiName,elementName,AttribName,attribValue):
- global G_UIElementArray
- if uiName in G_UIElementArray:
- if AttribName in G_UIElementArray[uiName][elementName].configure().keys():
- G_UIElementArray[uiName][elementName][AttribName]=attribValue
复制代码
======================================================================
#取得控件的Tkinter属性值
- def GetTKAttrib(uiName,elementName,AttribName):
- global G_UIElementArray
- if uiName in G_UIElementArray:
- return G_UIElementArray[uiName][elementName].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[uiName]:
- G_UIElementVariableArray[uiName][elementName].set(showtext)
- return
- if uiName in G_UIElementArray:
- if elementName in G_UIElementArray[uiName]:
- if elementName.find('Text_') >= 0:
- G_UIElementArray[uiName][elementName].delete('0.0',tkinter.END)
- G_UIElementArray[uiName][elementName].insert(tkinter.END,showtext)
- else:
- G_UIElementArray[uiName][elementName].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[uiName]:
- return G_UIElementVariableArray[uiName][elementName].get()
- if uiName in G_UIElementArray:
- if elementName in G_UIElementArray[uiName]:
- if elementName.find('Text_') >= 0:
- return G_UIElementArray[uiName][elementName].get('0.0', tkinter.END)
- elif elementName.find('Spinbox_') >= 0:
- return str(G_UIElementArray[uiName][elementName].get())
- else:
- return G_UIElementArray[uiName][elementName].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[uiName]:
- for EBData in G_UIElementUserDataArray[uiName][elementName]:
- if EBData[0] == 'image':
- EBData[1] = 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[2] = ImageTk.PhotoImage(image_Resize)
- Control.configure(image = EBData[2])
- 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[uiName]:
- for EBData in G_UIElementUserDataArray[uiName][elementName]:
- if EBData[0] == 'image':
- return EBData[1]
- return str("")
复制代码
======================================================================
#初始化所有的用户绑定数据,无须手动调用。
- def InitElementData(uiName):
- global G_UIElementUserDataArray
- if uiName in G_UIElementUserDataArray:
- for elementName in G_UIElementUserDataArray[uiName].keys():
- for EBData in G_UIElementUserDataArray[uiName][elementName]:
- if EBData[3] == 1:
- SetText(uiName,elementName,EBData[2])
- SetText(uiName,elementName,EBData[2])
复制代码
======================================================================
#初始化样式,无须手动调用。
- def InitElementStyle(uiName,Style):
- StyleArray = ReadStyleFile(Style+".py")
- global G_UIElementArray
- if uiName in G_UIElementArray:
- for elementName in G_UIElementArray[uiName].keys():
- Widget = G_UIElementArray[uiName][elementName]
- try:
- if Widget.winfo_exists() == 1:
- WinClass = Widget.winfo_class()
- StyleName = ".T"+WinClass
- if StyleName == '.TLabel':
- Root = GetElement(uiName,'root')
- Root['background'] = StyleArray[StyleName]['background']
- for attribute in StyleArray[StyleName].keys():
- Widget[attribute] = StyleArray[StyleName][attribute]
- 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[uiName].keys():
- G_UIInputDataArray[elementName] = []
- Widget = G_UIElementArray[uiName][elementName]
- if elementName.find('Text_') >= 0:
- content = Widget.get('0.0', tkinter.END)
- G_UIInputDataArray[elementName].append(content)
- elif elementName.find('Entry_') >= 0:
- content = G_UIElementVariableArray[uiName][elementName].get()
- G_UIInputDataArray[elementName].append(content)
- if uiName in G_UIElementVariableArray:
- for elementName in G_UIElementVariableArray[uiName].keys():
- if elementName.find('Group_') >= 0:
- ElementIntValue = G_UIElementVariableArray[uiName][elementName].get()
- G_UIInputDataArray[elementName] = []
- G_UIInputDataArray[elementName].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)[1].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[2].find(',') >= 0:
- splitarray2 = splitarray1[2].partition(',')
- stylename = splitarray2[0].replace('"','')
- else:
- splitarray2 = splitarray1[2].partition(')')
- stylename = splitarray2[0].replace('"','')
- sytleValueText = splitarray2[2]
- fontindex_begin = sytleValueText.find('font=(')
- fontindex_end = fontindex_begin
- StyleArray[stylename] = {}
- othertext = sytleValueText
- if fontindex_begin >= 0:
- fontindex_end = sytleValueText.find(')')
- fonttext = sytleValueText[fontindex_begin+6:fontindex_end]
- fontsplitarray = fonttext.split(',')
- StyleArray[stylename]['font'] = tkinter.font.Font(family=fontsplitarray[0].replace('"','').strip(), size=int(fontsplitarray[1].replace('"','').strip()),weight=fontsplitarray[2].replace('"','').strip())
- othertext = sytleValueText[0:fontindex_begin] + sytleValueText[fontindex_end+1:-1]
- else:
- splitarray4 = sytleValueText.partition(')')
- othertext = splitarray4[0]
- splitarray3 = othertext.split(',')
- for stylecfgtext in splitarray3:
- if stylecfgtext.find('=') > 0:
- splitarray4 = stylecfgtext.partition('=')
- key = splitarray4[0].replace('"','').strip()
- value = splitarray4[2].replace('"','').strip()
- StyleArray[stylename][key] = value
- continue
- if text.find('style.map(') >= 0:
- continue
- f.close()
- return StyleArray
复制代码
|
|