diff --git a/assets/root/intrologin.py b/assets/root/intrologin.py index 239d8920..bd1dba42 100644 --- a/assets/root/intrologin.py +++ b/assets/root/intrologin.py @@ -325,30 +325,30 @@ class LoginWindow(ui.ScriptWindow): def __SaveChannelInfo(self): try: - file=open("channel.inf", "w") - file.write("%d %d %d" % (self.__GetServerID(), self.__GetChannelID(), self.__GetRegionID())) + with open("channel.inf", "w") as file: + file.write("%d %d %d" % (self.__GetServerID(), self.__GetChannelID(), self.__GetRegionID())) except: print "LoginWindow.__SaveChannelInfo - SaveError" def __LoadChannelInfo(self): try: - file=open("channel.inf") - lines=file.readlines() - - if len(lines)>0: - tokens=lines[0].split() + with open("channel.inf") as file: + lines=file.readlines() - selServerID=int(tokens[0]) - selChannelID=int(tokens[1]) - - if len(tokens) == 3: - regionID = int(tokens[2]) + if len(lines)>0: + tokens=lines[0].split() - return regionID, selServerID, selChannelID + selServerID=int(tokens[0]) + selChannelID=int(tokens[1]) + + if len(tokens) == 3: + regionID = int(tokens[2]) + + return regionID, selServerID, selChannelID except: print "LoginWindow.__LoadChannelInfo - OpenError" - return -1, -1, -1 + return -1, -1, -1 def __ExitGame(self): app.Exit() diff --git a/assets/root/mousemodule.py b/assets/root/mousemodule.py index 1413f4b8..711febcb 100644 --- a/assets/root/mousemodule.py +++ b/assets/root/mousemodule.py @@ -27,7 +27,8 @@ class CursorImage(object): self.LoadImage(imageName) def __del__(self): - grpImage.Delete(self.handle) + if grpImage and self.handle: + grpImage.Delete(self.handle) def LoadImage(self, imageName): try: diff --git a/assets/root/musicinfo.py b/assets/root/musicinfo.py index 2b980fbf..4eb8ff05 100644 --- a/assets/root/musicinfo.py +++ b/assets/root/musicinfo.py @@ -9,21 +9,19 @@ def SaveLastPlayFieldMusic(): global fieldMusic try: - lastPlayFile=open("BGM/lastplay.inf", "w") + with open("BGM/lastplay.inf", "w") as lastPlayFile: + lastPlayFile.write(fieldMusic) except IOError: return - lastPlayFile.write(fieldMusic) - def LoadLastPlayFieldMusic(): global fieldMusic try: - lastPlayFile=open("BGM/lastplay.inf", "r") + with open("BGM/lastplay.inf", "r") as lastPlayFile: + fieldMusic=lastPlayFile.read() except IOError: return - fieldMusic=lastPlayFile.read() - diff --git a/assets/root/system.py b/assets/root/system.py index 79df485d..9f2a8ec2 100644 --- a/assets/root/system.py +++ b/assets/root/system.py @@ -22,7 +22,8 @@ class LogBoxFile: self.restore() def restore(self): - sys.stderr = self.stderrSave + if sys: + sys.stderr = self.stderrSave def write(self, msg): self.msg = self.msg + msg diff --git a/assets/root/ui.py b/assets/root/ui.py index 36645afc..c5c8cc0a 100644 --- a/assets/root/ui.py +++ b/assets/root/ui.py @@ -98,7 +98,8 @@ class Window(object): self.Hide() def __del__(self): - wndMgr.Destroy(self.hWnd) + if wndMgr and self.hWnd: + wndMgr.Destroy(self.hWnd) def RegisterWindow(self, layer): self.hWnd = wndMgr.Register(self, layer) diff --git a/assets/root/uitaskbar.py b/assets/root/uitaskbar.py index d413e3df..d0b2f644 100644 --- a/assets/root/uitaskbar.py +++ b/assets/root/uitaskbar.py @@ -26,11 +26,13 @@ def GetMouseButtonSettings(): def SaveMouseButtonSettings(): global MOUSE_SETTINGS - open("mouse.cfg", "w").write("%s\t%s" % tuple(MOUSE_SETTINGS)) + with open("mouse.cfg", "w") as f: + f.write("%s\t%s" % tuple(MOUSE_SETTINGS)) def LoadMouseButtonSettings(): global MOUSE_SETTINGS - tokens = open("mouse.cfg", "r").read().split() + with open("mouse.cfg", "r") as f: + tokens = f.read().split() if len(tokens) != 2: raise RuntimeError, "MOUSE_SETTINGS_FILE_ERROR" diff --git a/assets/root/uiuploadmark.py b/assets/root/uiuploadmark.py index a0defa0b..cfcaa962 100644 --- a/assets/root/uiuploadmark.py +++ b/assets/root/uiuploadmark.py @@ -6,11 +6,14 @@ import uiScriptLocale class MarkItem(ui.ListBoxEx.Item): def __init__(self, fileName): ui.ListBoxEx.Item.__init__(self) - self.imgWidth=0 - self.imgHeight=0 - self.canLoad=0 - self.textLine=self.__CreateTextLine(fileName) - self.imgBox=self.__CreateImageBox("upload/"+fileName) + self.fileName = fileName + self.fullPath = "upload/" + fileName + self.imgWidth = 0 + self.imgHeight = 0 + self.canLoad = 0 + self.imgBox = None + self.imageLoaded = False + self.textLine = self.__CreateTextLine(fileName) def __del__(self): ui.ListBoxEx.Item.__del__(self) @@ -22,35 +25,47 @@ class MarkItem(ui.ListBoxEx.Item): ui.ListBoxEx.Item.SetSize(self, 20 + 6*len(self.textLine.GetText()) + 4, height) def __CreateTextLine(self, fileName): - textLine=ui.TextLine() + textLine = ui.TextLine() textLine.SetParent(self) textLine.SetPosition(20, 0) textLine.SetText(fileName) textLine.Show() return textLine - def __CreateImageBox(self, fileName): - (self.canLoad, self.imgWidth, self.imgHeight)=app.GetImageInfo(fileName) + def LoadImageInfo(self): + """Load image info lazily when needed (e.g., when selected or validated)""" + if self.imageLoaded: + return - if 1==self.canLoad: - if 16==self.imgWidth and 12==self.imgHeight: - imgBox=ui.ImageBox() - imgBox.AddFlag("not_pick") - imgBox.SetParent(self) - imgBox.SetPosition(0, 2) - imgBox.LoadImageFromFile(fileName) - imgBox.Show() - return imgBox - else: - return 0 - else: - return 0 + self.imageLoaded = True + (self.canLoad, self.imgWidth, self.imgHeight) = app.GetImageInfo(self.fullPath) + + if self.canLoad == 1 and self.imgWidth == 16 and self.imgHeight == 12: + imgBox = ui.ImageBox() + imgBox.AddFlag("not_pick") + imgBox.SetParent(self) + imgBox.SetPosition(0, 2) + imgBox.LoadImageFromFile(self.fullPath) + imgBox.Show() + self.imgBox = imgBox + + def OnRender(self): + # Load image when item becomes visible (rendered) + if not self.imageLoaded: + self.LoadImageInfo() + # Call parent to draw selection bar + ui.ListBoxEx.Item.OnRender(self) class SymbolItem(ui.ListBoxEx.Item): def __init__(self, fileName): ui.ListBoxEx.Item.__init__(self) - self.textLine=self.__CreateTextLine(fileName) - (self.canLoad, self.imgWidth, self.imgHeight)=app.GetImageInfo("upload/"+fileName) + self.fileName = fileName + self.fullPath = "upload/" + fileName + self.imgWidth = 0 + self.imgHeight = 0 + self.canLoad = 0 + self.imageLoaded = False + self.textLine = self.__CreateTextLine(fileName) def __del__(self): ui.ListBoxEx.Item.__del__(self) @@ -62,13 +77,28 @@ class SymbolItem(ui.ListBoxEx.Item): ui.ListBoxEx.Item.SetSize(self, 6*len(self.textLine.GetText()) + 4, height) def __CreateTextLine(self, fileName): - textLine=ui.TextLine() + textLine = ui.TextLine() textLine.SetParent(self) textLine.SetPosition(1, 2) textLine.SetText(fileName) textLine.Show() return textLine + def LoadImageInfo(self): + """Load image info lazily when needed""" + if self.imageLoaded: + return + + self.imageLoaded = True + (self.canLoad, self.imgWidth, self.imgHeight) = app.GetImageInfo(self.fullPath) + + def OnRender(self): + # Load image when item becomes visible (rendered) + if not self.imageLoaded: + self.LoadImageInfo() + # Call parent to draw selection bar + ui.ListBoxEx.Item.OnRender(self) + class PopupDialog(ui.ScriptWindow): def __init__(self, parent): print "NEW POPUP WINDOW ----------------------------------------------------------------------------" @@ -193,13 +223,16 @@ class MarkSelectDialog(ui.ScriptWindow): self.popupDialog.Open(msg) def __OnOK(self): - selItem=self.markListBox.GetSelectedItem() + selItem = self.markListBox.GetSelectedItem() if selItem: - if selItem.canLoad!=1: + # Ensure image info is loaded before validation + selItem.LoadImageInfo() + + if selItem.canLoad != 1: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_FILE_FORMAT) - elif selItem.imgWidth!=16: + elif selItem.imgWidth != 16: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_16_WIDTH) - elif selItem.imgHeight!=12: + elif selItem.imgHeight != 12: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_12_HEIGHT) else: self.selectEvent(selItem.GetText()) @@ -215,20 +248,22 @@ class MarkSelectDialog(ui.ScriptWindow): def __RefreshFileList(self): self.__ClearFileList() - self.__AppendFileList("bmp") - self.__AppendFileList("tga") - self.__AppendFileList("jpg") - self.__AppendFileList("jpeg") - self.__AppendFileList("png") + # Collect all files first, then batch add to avoid multiple UI updates + allFiles = [] + for ext in ("bmp", "tga", "jpg", "jpeg", "png"): + fileNameList = app.GetFileList("upload/*." + ext) + allFiles.extend(fileNameList) + + # Sort alphabetically for consistent display + allFiles.sort() + + # Add all files at once + for fileName in allFiles: + self.__AppendFile(fileName) def __ClearFileList(self): self.markListBox.RemoveAllItems() - def __AppendFileList(self, filter): - fileNameList=app.GetFileList("upload/*."+filter) - for fileName in fileNameList: - self.__AppendFile(fileName) - def __AppendFile(self, fileName): self.markListBox.AppendItem(MarkItem(fileName)) @@ -318,13 +353,16 @@ class SymbolSelectDialog(ui.ScriptWindow): self.popupDialog.Open(msg) def __OnOK(self): - selItem=self.symbolListBox.GetSelectedItem() + selItem = self.symbolListBox.GetSelectedItem() if selItem: - if selItem.canLoad!=1: + # Ensure image info is loaded before validation + selItem.LoadImageInfo() + + if selItem.canLoad != 1: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_FILE_FORMAT) - elif selItem.imgWidth!=64: + elif selItem.imgWidth != 64: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_64_WIDTH) - elif selItem.imgHeight!=128: + elif selItem.imgHeight != 128: self.__PopupMessage(localeInfo.GUILDMARK_UPLOADER_ERROR_128_HEIGHT) else: self.selectEvent(selItem.GetText()) diff --git a/assets/root/utils.py b/assets/root/utils.py index 7906f29c..90c0b2e3 100644 --- a/assets/root/utils.py +++ b/assets/root/utils.py @@ -46,10 +46,10 @@ class Sandbox(object): sys.modules[prevented_module_name] = None try: - f = open(filename, 'rb') - data = f.read() - code = compile(data, filename, 'exec') - exec code in dic + with open(filename, 'rb') as f: + data = f.read() + code = compile(data, filename, 'exec') + exec code in dic except Exception, e: sys.stderr.write(e) finally: