# -*- coding: utf-8 -*- import wx from gui.item_sizer import ItemBoxSizer, format_byte import time import CommonVar as cv COLOR_OK = 1 COLOR_NORMAL = 2 COLOR_ERROR = 3 COLOR_RUN = 4 class FrameMain(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, id=wx.ID_ANY, title='视频下载器', pos=wx.DefaultPosition, size=wx.Size(-1, 420), style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL) self.SetSizeHints(wx.DefaultSize, wx.DefaultSize) self.SetBackgroundColour(wx.Colour(240, 240, 240)) self.SetMinSize(wx.Size(390, 420)) self.SetMaxSize(wx.Size(390, 420)) self.global_sizer = wx.BoxSizer(wx.VERTICAL) self.sizer_items = wx.BoxSizer(wx.VERTICAL) self.sizer_blocks = wx.WrapSizer(wx.HORIZONTAL) self.sizer_total = wx.BoxSizer(wx.HORIZONTAL) self.text_name = None self.gauge_total = None self.text_speed = None self.text_percent = None self.total = None self.text_progress = wx.StaticText(self, wx.ID_ANY, '', wx.DefaultPosition, wx.DefaultSize, wx.ALIGN_RIGHT) self.text_title = wx.StaticText(self, wx.ID_ANY, '', wx.DefaultPosition, wx.Size(150, -1), wx.ALIGN_LEFT) staticline1 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) staticline2 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) staticline3 = wx.StaticLine(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.LI_HORIZONTAL) self.sizer_top = wx.BoxSizer(wx.HORIZONTAL) # self.global_sizer.Add(self.text_title, 0, wx.EXPAND | wx.ALL, 5) self.sizer_top.Add(self.text_title, 2, wx.EXPAND | wx.ALL, 5) self.sizer_top.Add(self.text_progress, 1, wx.EXPAND | wx.ALL | wx.ALIGN_RIGHT, 5) self.global_sizer.Add(self.sizer_top, 0, wx.EXPAND | wx.ALL, 5) self.global_sizer.Add(staticline1, 0, wx.EXPAND | wx.ALL, 5) self.global_sizer.Add(self.sizer_items, 1, wx.ALL | wx.EXPAND, 3) self.global_sizer.Add(staticline2, 0, wx.EXPAND | wx.ALL, 5) self.global_sizer.Add(self.sizer_blocks, 0, wx.ALL | wx.EXPAND, 5) self.global_sizer.Add(staticline3, 0, wx.EXPAND | wx.ALL, 5) self.global_sizer.Add(self.sizer_total, 0, wx.ALL | wx.EXPAND, 5) self.menu_bar = MainMenuBar(0) self.SetMenuBar(self.menu_bar) self.SetSizer(self.global_sizer) self.Layout() self.Center(wx.BOTH) self.items_list = [] self.items_dict = {} self.block_list = [] self.timer = wx.Timer() self.timer.SetOwner(self, wx.ID_ANY) def initTotal(self, total): self.total = total if total > 0 else 0 self.gauge_total = wx.Gauge(self, wx.ID_ANY, 10000, wx.DefaultPosition, wx.DefaultSize, wx.GA_HORIZONTAL) self.gauge_total.SetValue(0) self.text_percent = wx.StaticText(self, wx.ID_ANY, '0%', wx.DefaultPosition, wx.Size(42, -1), wx.ALIGN_RIGHT) self.text_speed = wx.StaticText(self, wx.ID_ANY, '0B/s', wx.DefaultPosition, wx.Size(65, -1), wx.ALIGN_RIGHT) self.text_percent.Wrap(-1) self.text_speed.Wrap(-1) self.sizer_total.Add(self.text_percent, 0, wx.ALL, 5) self.sizer_total.Add(self.gauge_total, 5, wx.ALL | wx.EXPAND, 5) self.sizer_total.Add(self.text_speed, 0, wx.ALL, 5) def updateTotal(self, current_byte, speed_byte, total_byte=None): if total_byte: self.total = total_byte percent = current_byte * 100.0 / self.total progress = '[ %s/%s ]' % (format_byte(current_byte if current_byte > 0 else 0, '%.1f%s'), format_byte(self.total, '%.1f%s')) speed = format_byte(speed_byte if speed_byte > 0 else 0, '%.1f%s/s') self.text_percent.SetLabelText(str(round(percent, 1)) + '%') self.text_speed.SetLabelText(speed) self.gauge_total.SetValue(int(percent*100)) self.text_progress.SetLabelText(progress) # self.sizer_total.Layout() # self.sizer_top.Layout() def initTotal_Merge(self, total): self.total = total self.text_percent.SetLabelText('0%') self.gauge_total.SetValue(0) self.text_speed.SetLabelText('0/0') # self.sizer_total.Layout() # self.sizer_top.Layout() def updateMerge(self, cur_index): progress = '%d/%d' % (cur_index, self.total) percent = cur_index * 100.0 / self.total text_percent = str(round(percent, 1)) + '%' if text_percent != self.text_percent.GetLabelText(): self.text_percent.SetLabelText(text_percent) self.gauge_total.SetValue(int(percent*100)) if progress != self.text_speed.GetLabelText(): self.text_speed.SetLabelText(progress) # self.sizer_total.Layout() def insertItem(self, id, total_byte, cur_byte=0, speed_byte=0): item = ItemBoxSizer(self, cur_byte, total_byte, name=str(id), speed=speed_byte) self.items_list.append(item) self.items_dict[id] = item self.sizer_items.Add(item, 1, wx.ALL | wx.EXPAND, 1) # self.sizer_items.Layout() def getItem(self, id): return self.items_dict.get(id, None) def getItemsDict(self): return self.items_dict def insertBlock(self, id): block = wx.StaticText(self, wx.ID_ANY, str(id), wx.DefaultPosition, wx.Size(20, 20), wx.ALIGN_CENTER) block.SetBackgroundColour(wx.Colour(144, 144, 144, 255)) block.SetForegroundColour(wx.Colour(255, 255, 255, 255)) self.block_list.append(block) self.sizer_blocks.Add(block, 0, wx.ALL, 5) # self.sizer_items.Layout() # self.Layout() def updateBlock(self, id, type): if type == COLOR_NORMAL: self.block_list[id].SetBackgroundColour(wx.Colour(144, 144, 144, 255)) elif type == COLOR_OK: self.block_list[id].SetBackgroundColour(wx.Colour(0, 128, 0, 255)) elif type == COLOR_RUN: self.block_list[id].SetBackgroundColour(wx.Colour(0, 0, 255, 255)) else: self.block_list[id].SetBackgroundColour(wx.Colour(255, 0, 0, 255)) # self.Layout() def deleteItem(self, id, clear_widget=True): if self.items_list: item = self.items_dict[id] self.items_list.remove(item) del self.items_dict[id] if clear_widget: item.Clear(True) self.sizer_items.Remove(item) # self.Layout() def setTitleName(self, text): self.text_title.SetLabelText(text) class MainMenuBar(wx.MenuBar): def __init__(self, style): wx.MenuBar.__init__(self, style) self.file = Menu_File() self.help = Menu_Help() self.Append(self.file, 'File') self.Append(self.help, 'Help') class Menu_File(wx.Menu): def __init__(self, *args): wx.Menu.__init__(self, *args) self.logs = None self.settings = None self.exit = None self.initMenuItems() def initMenuItems(self): self.logs = wx.MenuItem(self, wx.ID_ANY, '&Logs\tF2', wx.EmptyString, wx.ITEM_NORMAL) # self.parse.Enable(False) self.settings = wx.MenuItem(self, wx.ID_ANY, 'Settings', wx.EmptyString, wx.ITEM_NORMAL) # self.settings.Enable(False) self.exit = wx.MenuItem(self, wx.ID_ANY, 'Exit', wx.EmptyString, wx.ITEM_NORMAL) self.Append(self.logs) self.AppendSeparator() self.Append(self.settings) self.AppendSeparator() self.Append(self.exit) class Menu_Help(wx.Menu): def __init__(self, *args): wx.Menu.__init__(self, *args) self.about = None self.initMenuItems() def initMenuItems(self): self.about = wx.MenuItem(self, wx.ID_ANY, '&About\tF1', wx.EmptyString, wx.ITEM_NORMAL) self.Append(self.about)