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]