目录

  • demo:a spreadsheet-like application
  • The end of the first section of the code
  • The Word Unkown

demo:a spreadsheet-like application

Setting the background color by the name of the color

Setting the background color through the RBG value

#!/usr/bin/env python3"""
SS1 -- a spreadsheet-like application.
"""import os
import re
import sys
from xml.parsers import expat
from xml.sax.saxutils import escapeLEFT, CENTER, RIGHT = "LEFT", "CENTER", "RIGHT"def ljust(x, n):return x.ljust(n)
def center(x, n):return x.center(n)
def rjust(x, n):return x.rjust(n)
align2action = {LEFT: ljust, CENTER: center, RIGHT: rjust}align2xml = {LEFT: "left", CENTER: "center", RIGHT: "right"}
xml2align = {"left": LEFT, "center": CENTER, "right": RIGHT}align2anchor = {LEFT: "w", CENTER: "center", RIGHT: "e"}def sum(seq):total = 0for x in seq:if x is not None:total += xreturn totalclass Sheet:def __init__(self):self.cells = {} # {(x, y): cell, ...}self.ns = dict(cell = self.cellvalue,cells = self.multicellvalue,sum = sum,)def cellvalue(self, x, y):cell = self.getcell(x, y)if hasattr(cell, 'recalc'):return cell.recalc(self.ns)else:return celldef multicellvalue(self, x1, y1, x2, y2):if x1 > x2:x1, x2 = x2, x1if y1 > y2:y1, y2 = y2, y1seq = []for y in range(y1, y2+1):for x in range(x1, x2+1):seq.append(self.cellvalue(x, y))return seqdef getcell(self, x, y):return self.cells.get((x, y))def setcell(self, x, y, cell):assert x > 0 and y > 0assert isinstance(cell, BaseCell)self.cells[x, y] = celldef clearcell(self, x, y):try:del self.cells[x, y]except KeyError:passdef clearcells(self, x1, y1, x2, y2):for xy in self.selectcells(x1, y1, x2, y2):del self.cells[xy]def clearrows(self, y1, y2):self.clearcells(0, y1, sys.maxsize, y2)def clearcolumns(self, x1, x2):self.clearcells(x1, 0, x2, sys.maxsize)def selectcells(self, x1, y1, x2, y2):if x1 > x2:x1, x2 = x2, x1if y1 > y2:y1, y2 = y2, y1return [(x, y) for x, y in self.cellsif x1 <= x <= x2 and y1 <= y <= y2]def movecells(self, x1, y1, x2, y2, dx, dy):if dx == 0 and dy == 0:returnif x1 > x2:x1, x2 = x2, x1if y1 > y2:y1, y2 = y2, y1assert x1+dx > 0 and y1+dy > 0new = {}for x, y in self.cells:cell = self.cells[x, y]if hasattr(cell, 'renumber'):cell = cell.renumber(x1, y1, x2, y2, dx, dy)if x1 <= x <= x2 and y1 <= y <= y2:x += dxy += dynew[x, y] = cellself.cells = newdef insertrows(self, y, n):assert n > 0self.movecells(0, y, sys.maxsize, sys.maxsize, 0, n)def deleterows(self, y1, y2):if y1 > y2:y1, y2 = y2, y1self.clearrows(y1, y2)self.movecells(0, y2+1, sys.maxsize, sys.maxsize, 0, y1-y2-1)def insertcolumns(self, x, n):assert n > 0self.movecells(x, 0, sys.maxsize, sys.maxsize, n, 0)def deletecolumns(self, x1, x2):if x1 > x2:x1, x2 = x2, x1self.clearcells(x1, x2)self.movecells(x2+1, 0, sys.maxsize, sys.maxsize, x1-x2-1, 0)def getsize(self):maxx = maxy = 0for x, y in self.cells:maxx = max(maxx, x)maxy = max(maxy, y)return maxx, maxydef reset(self):for cell in self.cells.values():if hasattr(cell, 'reset'):cell.reset()def recalc(self):self.reset()for cell in self.cells.values():if hasattr(cell, 'recalc'):cell.recalc(self.ns)def display(self):maxx, maxy = self.getsize()width, height = maxx+1, maxy+1colwidth = [1] * widthfull = {}# Add column heading labels in row 0for x in range(1, width):full[x, 0] = text, alignment = colnum2name(x), RIGHTcolwidth[x] = max(colwidth[x], len(text))# Add row labels in column 0for y in range(1, height):full[0, y] = text, alignment = str(y), RIGHTcolwidth[0] = max(colwidth[0], len(text))# Add sheet cells in columns with x>0 and y>0for (x, y), cell in self.cells.items():if x <= 0 or y <= 0:continueif hasattr(cell, 'recalc'):cell.recalc(self.ns)if hasattr(cell, 'format'):text, alignment = cell.format()assert isinstance(text, str)assert alignment in (LEFT, CENTER, RIGHT)else:text = str(cell)if isinstance(cell, str):alignment = LEFTelse:alignment = RIGHTfull[x, y] = (text, alignment)colwidth[x] = max(colwidth[x], len(text))# Calculate the horizontal separator line (dashes and dots)sep = ""for x in range(width):if sep:sep += "+"sep += "-"*colwidth[x]# Now print The full gridfor y in range(height):line = ""for x in range(width):text, alignment = full.get((x, y)) or ("", LEFT)text = align2action[alignment](text, colwidth[x])if line:line += '|'line += textprint(line)if y == 0:print(sep)def xml(self):out = ['<spreadsheet>']for (x, y), cell in self.cells.items():if hasattr(cell, 'xml'):cellxml = cell.xml()else:cellxml = '<value>%s</value>' % escape(cell)out.append('<cell row="%s" col="%s">\n  %s\n</cell>' %(y, x, cellxml))out.append('</spreadsheet>')return '\n'.join(out)def save(self, filename):text = self.xml()with open(filename, "w", encoding='utf-8') as f:f.write(text)if text and not text.endswith('\n'):f.write('\n')def load(self, filename):with open(filename, 'rb') as f:SheetParser(self).parsefile(f)class SheetParser:def __init__(self, sheet):self.sheet = sheetdef parsefile(self, f):parser = expat.ParserCreate()parser.StartElementHandler = self.startelementparser.EndElementHandler = self.endelementparser.CharacterDataHandler = self.dataparser.ParseFile(f)def startelement(self, tag, attrs):method = getattr(self, 'start_'+tag, None)if method:method(attrs)self.texts = []def data(self, text):self.texts.append(text)def endelement(self, tag):method = getattr(self, 'end_'+tag, None)if method:method("".join(self.texts))def start_cell(self, attrs):self.y = int(attrs.get("row"))self.x = int(attrs.get("col"))def start_value(self, attrs):self.fmt = attrs.get('format')self.alignment = xml2align.get(attrs.get('align'))start_formula = start_valuedef end_int(self, text):try:self.value = int(text)except (TypeError, ValueError):self.value = Noneend_long = end_intdef end_double(self, text):try:self.value = float(text)except (TypeError, ValueError):self.value = Nonedef end_complex(self, text):try:self.value = complex(text)except (TypeError, ValueError):self.value = Nonedef end_string(self, text):self.value = textdef end_value(self, text):if isinstance(self.value, BaseCell):self.cell = self.valueelif isinstance(self.value, str):self.cell = StringCell(self.value,self.fmt or "%s",self.alignment or LEFT)else:self.cell = NumericCell(self.value,self.fmt or "%s",self.alignment or RIGHT)def end_formula(self, text):self.cell = FormulaCell(text,self.fmt or "%s",self.alignment or RIGHT)def end_cell(self, text):self.sheet.setcell(self.x, self.y, self.cell)class BaseCell:__init__ = None # Must provide"""Abstract base class for sheet cells.Subclasses may but needn't provide the following APIs:cell.reset() -- prepare for recalculationcell.recalc(ns) -> value -- recalculate formulacell.format() -> (value, alignment) -- return formatted valuecell.xml() -> string -- return XML"""class NumericCell(BaseCell):def __init__(self, value, fmt="%s", alignment=RIGHT):assert isinstance(value, (int, float, complex))assert alignment in (LEFT, CENTER, RIGHT)self.value = valueself.fmt = fmtself.alignment = alignmentdef recalc(self, ns):return self.valuedef format(self):try:text = self.fmt % self.valueexcept:text = str(self.value)return text, self.alignmentdef xml(self):method = getattr(self, '_xml_' + type(self.value).__name__)return '<value align="%s" format="%s">%s</value>' % (align2xml[self.alignment],self.fmt,method())def _xml_int(self):if -2**31 <= self.value < 2**31:return '<int>%s</int>' % self.valueelse:return '<long>%s</long>' % self.valuedef _xml_float(self):return '<double>%r</double>' % self.valuedef _xml_complex(self):return '<complex>%r</complex>' % self.valueclass StringCell(BaseCell):def __init__(self, text, fmt="%s", alignment=LEFT):assert isinstance(text, str)assert alignment in (LEFT, CENTER, RIGHT)self.text = textself.fmt = fmtself.alignment = alignmentdef recalc(self, ns):return self.textdef format(self):return self.text, self.alignmentdef xml(self):s = '<value align="%s" format="%s"><string>%s</string></value>'return s % (align2xml[self.alignment],self.fmt,escape(self.text))class FormulaCell(BaseCell):def __init__(self, formula, fmt="%s", alignment=RIGHT):assert alignment in (LEFT, CENTER, RIGHT)self.formula = formulaself.translated = translate(self.formula)self.fmt = fmtself.alignment = alignmentself.reset()def reset(self):self.value = Nonedef recalc(self, ns):if self.value is None:try:self.value = eval(self.translated, ns)except:exc = sys.exc_info()[0]if hasattr(exc, "__name__"):self.value = exc.__name__else:self.value = str(exc)return self.valuedef format(self):try:text = self.fmt % self.valueexcept:text = str(self.value)return text, self.alignmentdef xml(self):return '<formula align="%s" format="%s">%s</formula>' % (align2xml[self.alignment],self.fmt,escape(self.formula))def renumber(self, x1, y1, x2, y2, dx, dy):out = []for part in re.split(r'(\w+)', self.formula):m = re.match('^([A-Z]+)([1-9][0-9]*)$', part)if m is not None:sx, sy = m.groups()x = colname2num(sx)y = int(sy)if x1 <= x <= x2 and y1 <= y <= y2:part = cellname(x+dx, y+dy)out.append(part)return FormulaCell("".join(out), self.fmt, self.alignment)def translate(formula):"""Translate a formula containing fancy cell names to valid Python code.Examples:B4 -> cell(2, 4)B4:Z100 -> cells(2, 4, 26, 100)"""out = []for part in re.split(r"(\w+(?::\w+)?)", formula):m = re.match(r"^([A-Z]+)([1-9][0-9]*)(?::([A-Z]+)([1-9][0-9]*))?$", part)if m is None:out.append(part)else:x1, y1, x2, y2 = m.groups()x1 = colname2num(x1)if x2 is None:s = "cell(%s, %s)" % (x1, y1)else:x2 = colname2num(x2)s = "cells(%s, %s, %s, %s)" % (x1, y1, x2, y2)out.append(s)return "".join(out)def cellname(x, y):"Translate a cell coordinate to a fancy cell name (e.g. (1, 1)->'A1')."assert x > 0 # Column 0 has an empty name, so can't use thatreturn colnum2name(x) + str(y)def colname2num(s):"Translate a column name to number (e.g. 'A'->1, 'Z'->26, 'AA'->27)."s = s.upper()n = 0for c in s:assert 'A' <= c <= 'Z'n = n*26 + ord(c) - ord('A') + 1return ndef colnum2name(n):"Translate a column number to name (e.g. 1->'A', etc.)."assert n > 0s = ""while n:n, m = divmod(n-1, 26)s = chr(m+ord('A')) + sreturn simport tkinter as Tkclass SheetGUI:"""Beginnings of a GUI for a spreadsheet.TO DO:- clear multiple cells- Insert, clear, remove rows or columns- Show new contents while typing- Scroll bars- Grow grid when window is grown- Proper menus- Undo, redo- Cut, copy and paste- Formatting and alignment"""def __init__(self, filename="sheet1.xml", rows=10, columns=5):"""Constructor.Load the sheet from the filename argument.Set up the Tk widget tree."""# Create and load the sheetself.filename = filenameself.sheet = Sheet()if os.path.isfile(filename):self.sheet.load(filename)# Calculate the needed grid sizemaxx, maxy = self.sheet.getsize()rows = max(rows, maxy)columns = max(columns, maxx)# Create the widgetsself.root = Tk.Tk()self.root.wm_title("Spreadsheet: %s" % self.filename)self.beacon = Tk.Label(self.root, text="A1",font=('helvetica', 16, 'bold'))self.entry = Tk.Entry(self.root)self.savebutton = Tk.Button(self.root, text="Save",command=self.save)self.cellgrid = Tk.Frame(self.root)# Configure the widget lay-outself.cellgrid.pack(side="bottom", expand=1, fill="both")self.beacon.pack(side="left")self.savebutton.pack(side="right")self.entry.pack(side="left", expand=1, fill="x")# Bind some eventsself.entry.bind("<Return>", self.return_event)self.entry.bind("<Shift-Return>", self.shift_return_event)self.entry.bind("<Tab>", self.tab_event)self.entry.bind("<Shift-Tab>", self.shift_tab_event)self.entry.bind("<Delete>", self.delete_event)self.entry.bind("<Escape>", self.escape_event)# Now create the cell gridself.makegrid(rows, columns)# Select the top-left cellself.currentxy = Noneself.cornerxy = Noneself.setcurrent(1, 1)# Copy the sheet cells to the GUI cellsself.sync()def delete_event(self, event):if self.cornerxy != self.currentxy and self.cornerxy is not None:self.sheet.clearcells(*(self.currentxy + self.cornerxy))else:self.sheet.clearcell(*self.currentxy)self.sync()self.entry.delete(0, 'end')return "break"def escape_event(self, event):x, y = self.currentxyself.load_entry(x, y)def load_entry(self, x, y):cell = self.sheet.getcell(x, y)if cell is None:text = ""elif isinstance(cell, FormulaCell):text = '=' + cell.formulaelse:text, alignment = cell.format()self.entry.delete(0, 'end')self.entry.insert(0, text)self.entry.selection_range(0, 'end')def makegrid(self, rows, columns):"""Helper to create the grid of GUI cells.The edge (x==0 or y==0) is filled with labels; the rest is real cells."""self.rows = rowsself.columns = columnsself.gridcells = {}# Create the top left corner cell (which selects all)cell = Tk.Label(self.cellgrid, relief='raised')cell.grid_configure(column=0, row=0, sticky='NSWE')cell.bind("<ButtonPress-1>", self.selectall)# Create the top row of labels, and configure the grid columnsfor x in range(1, columns+1):self.cellgrid.grid_columnconfigure(x, minsize=64)cell = Tk.Label(self.cellgrid, text=colnum2name(x), relief='raised')cell.grid_configure(column=x, row=0, sticky='WE')self.gridcells[x, 0] = cellcell.__x = xcell.__y = 0cell.bind("<ButtonPress-1>", self.selectcolumn)cell.bind("<B1-Motion>", self.extendcolumn)cell.bind("<ButtonRelease-1>", self.extendcolumn)cell.bind("<Shift-Button-1>", self.extendcolumn)# Create the leftmost column of labelsfor y in range(1, rows+1):cell = Tk.Label(self.cellgrid, text=str(y), relief='raised')cell.grid_configure(column=0, row=y, sticky='WE')self.gridcells[0, y] = cellcell.__x = 0cell.__y = ycell.bind("<ButtonPress-1>", self.selectrow)cell.bind("<B1-Motion>", self.extendrow)cell.bind("<ButtonRelease-1>", self.extendrow)cell.bind("<Shift-Button-1>", self.extendrow)# Create the real cellsfor x in range(1, columns+1):for y in range(1, rows+1):cell = Tk.Label(self.cellgrid, relief='sunken',bg='white', fg='black')cell.grid_configure(column=x, row=y, sticky='NSWE')self.gridcells[x, y] = cellcell.__x = xcell.__y = y# Bind mouse eventscell.bind("<ButtonPress-1>", self.press)cell.bind("<B1-Motion>", self.motion)cell.bind("<ButtonRelease-1>", self.release)cell.bind("<Shift-Button-1>", self.release)def selectall(self, event):self.setcurrent(1, 1)self.setcorner(sys.maxsize, sys.maxsize)def selectcolumn(self, event):x, y = self.whichxy(event)self.setcurrent(x, 1)self.setcorner(x, sys.maxsize)def extendcolumn(self, event):x, y = self.whichxy(event)if x > 0:self.setcurrent(self.currentxy[0], 1)self.setcorner(x, sys.maxsize)def selectrow(self, event):x, y = self.whichxy(event)self.setcurrent(1, y)self.setcorner(sys.maxsize, y)def extendrow(self, event):x, y = self.whichxy(event)if y > 0:self.setcurrent(1, self.currentxy[1])self.setcorner(sys.maxsize, y)def press(self, event):x, y = self.whichxy(event)if x > 0 and y > 0:self.setcurrent(x, y)def motion(self, event):x, y = self.whichxy(event)if x > 0 and y > 0:self.setcorner(x, y)release = motiondef whichxy(self, event):w = self.cellgrid.winfo_containing(event.x_root, event.y_root)if w is not None and isinstance(w, Tk.Label):try:return w.__x, w.__yexcept AttributeError:passreturn 0, 0def save(self):self.sheet.save(self.filename)def setcurrent(self, x, y):"Make (x, y) the current cell."if self.currentxy is not None:self.change_cell()self.clearfocus()self.beacon['text'] = cellname(x, y)self.load_entry(x, y)self.entry.focus_set()self.currentxy = x, yself.cornerxy = Nonegridcell = self.gridcells.get(self.currentxy)if gridcell is not None:gridcell['bg'] = 'yellow'def setcorner(self, x, y):if self.currentxy is None or self.currentxy == (x, y):self.setcurrent(x, y)returnself.clearfocus()self.cornerxy = x, yx1, y1 = self.currentxyx2, y2 = self.cornerxy or self.currentxyif x1 > x2:x1, x2 = x2, x1if y1 > y2:y1, y2 = y2, y1for (x, y), cell in self.gridcells.items():if x1 <= x <= x2 and y1 <= y <= y2:cell['bg'] = 'lightBlue'gridcell = self.gridcells.get(self.currentxy)if gridcell is not None:gridcell['bg'] = 'yellow'self.setbeacon(x1, y1, x2, y2)def setbeacon(self, x1, y1, x2, y2):if x1 == y1 == 1 and x2 == y2 == sys.maxsize:name = ":"elif (x1, x2) == (1, sys.maxsize):if y1 == y2:name = "%d" % y1else:name = "%d:%d" % (y1, y2)elif (y1, y2) == (1, sys.maxsize):if x1 == x2:name = "%s" % colnum2name(x1)else:name = "%s:%s" % (colnum2name(x1), colnum2name(x2))else:name1 = cellname(*self.currentxy)name2 = cellname(*self.cornerxy)name = "%s:%s" % (name1, name2)self.beacon['text'] = namedef clearfocus(self):if self.currentxy is not None:x1, y1 = self.currentxyx2, y2 = self.cornerxy or self.currentxyif x1 > x2:x1, x2 = x2, x1if y1 > y2:y1, y2 = y2, y1for (x, y), cell in self.gridcells.items():if x1 <= x <= x2 and y1 <= y <= y2:cell['bg'] = 'white'def return_event(self, event):"Callback for the Return key."self.change_cell()x, y = self.currentxyself.setcurrent(x, y+1)return "break"def shift_return_event(self, event):"Callback for the Return key with Shift modifier."self.change_cell()x, y = self.currentxyself.setcurrent(x, max(1, y-1))return "break"def tab_event(self, event):"Callback for the Tab key."self.change_cell()x, y = self.currentxyself.setcurrent(x+1, y)return "break"def shift_tab_event(self, event):"Callback for the Tab key with Shift modifier."self.change_cell()x, y = self.currentxyself.setcurrent(max(1, x-1), y)return "break"def change_cell(self):"Set the current cell from the entry widget."x, y = self.currentxytext = self.entry.get()cell = Noneif text.startswith('='):cell = FormulaCell(text[1:])else:for cls in int, float, complex:try:value = cls(text)except (TypeError, ValueError):continueelse:cell = NumericCell(value)breakif cell is None and text:cell = StringCell(text)if cell is None:self.sheet.clearcell(x, y)else:self.sheet.setcell(x, y, cell)self.sync()def sync(self):"Fill the GUI cells from the sheet cells."self.sheet.recalc()for (x, y), gridcell in self.gridcells.items():if x == 0 or y == 0:continuecell = self.sheet.getcell(x, y)if cell is None:gridcell['text'] = ""else:if hasattr(cell, 'format'):text, alignment = cell.format()else:text, alignment = str(cell), LEFTgridcell['text'] = textgridcell['anchor'] = align2anchor[alignment]def test_basic():"Basic non-gui self-test."a = Sheet()for x in range(1, 11):for y in range(1, 11):if x == 1:cell = NumericCell(y)elif y == 1:cell = NumericCell(x)else:c1 = cellname(x, 1)c2 = cellname(1, y)formula = "%s*%s" % (c1, c2)cell = FormulaCell(formula)a.setcell(x, y, cell)
##    if os.path.isfile("sheet1.xml"):
##        print "Loading from sheet1.xml"
##        a.load("sheet1.xml")a.display()a.save("sheet1.xml")def test_gui():"GUI test."if sys.argv[1:]:filename = sys.argv[1]else:filename = "sheet1.xml"g = SheetGUI(filename)g.root.mainloop()if __name__ == '__main__':#test_basic()test_gui()

The end of the first section of the code

The Word Unkown

The First Column The Second Column
metadata 元数据['metedeite]
ol ordered list 有序的表格
ul unordered list 无序的表格

转载于:https://www.cnblogs.com/hugeng007/p/9354095.html

demo:a spreadsheet-like application相关推荐

  1. 小程序-demo:知乎日报

    ylbtech-小程序-demo:知乎日报 1.返回顶部 0.         1.app.js //app.js App({onLaunch: function () {//调用API从本地缓存中获 ...

  2. SFB公开课:TMG/IISARR/Web Application Proxy/发布UC(Lync/SFB)-2-通知

    SFB公开课:TMG/IISARR/Web Application Proxy/发布UC(Lync/SFB)-2-通知 定于2016-04-08 20:00-22:00讲如下公开课. 1.TMG 20 ...

  3. Ember——在构建Ember应用程序时,我们会使用到六个主要部件:应用程序(Application)、模型(Model)、视图(View)、模板(Template)、路由(...

    在构建Ember应用程序时,我们会使用到六个主要部件: 模板(Template).应用程序(Application).视图(View).路由(Routing).控制器(Controller)和模型(M ...

  4. Demo:基于 Flink SQL 构建流式应用

    摘要:上周四在 Flink 中文社区钉钉群中直播分享了<Demo:基于 Flink SQL 构建流式应用>,直播内容偏向实战演示.这篇文章是对直播内容的一个总结,并且改善了部分内容,比如除 ...

  5. 小程序-demo:小程序示例-page/component

    ylbtech-小程序-demo:小程序示例-page/component 以下将展示小程序官方组件能力,组件样式仅供参考,开发者可根据自身需求自定义组件样式,具体属性参数详见小程序开发文档. 1. ...

  6. Tomcat6 Spring3 问题:严重: Error configuring application listener of class org.springframework.web.conte

    Tomcat6 Spring3 问题: 严重: Error configuring application listener of class org.springframework.web.cont ...

  7. Python简单的多线程demo:装逼写法

    Python简单的多线程demo:装逼写法 用面向对象来写多线程: import threadingclass MyThread(threading.Thread):def __init__(self ...

  8. 小程序-demo:小程序示例-page/api

    ylbtech-小程序-demo:小程序示例-page/api 以下将演示小程序接口能力,具体属性参数详见小程序开发文档. 1. page/component返回顶部 1. a) .js Page({ ...

  9. setTextColor的几种方式 CrashHandler使用demo:

    目录 setTextColor的几种方式 CrashHandler使用demo: setTextColor的几种方式 方式一:<.......android:color="#FFFFF ...

  10. 第四章第二十六题(金融应用:货币单位)(Financial application: monetary units)

    第四章第二十六题(金融应用:货币单位)(Financial application: monetary units) *4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为i ...

最新文章

  1. Apache+PHP+MySQL+phpMyAdmin+WordPress搭建
  2. Flutter State 的生命周期
  3. python json unicode_python2下解决json的unicode编码问题
  4. Qt-按钮无文本显示
  5. go mysql use 问题,Go语言使用MySql的方法
  6. JavaScript学习笔记:创建、添加与删除节点
  7. nginx mime.types php,使用重写和有效的mime类型配置NGINX的正确方法
  8. 第三章:数组[5常见算法]--[6反转]
  9. usb启动计算机boss设置方法,技嘉主板bios设置usb启动(图文教程)
  10. STM32HAL库使用RX8025
  11. 二台计算机 共享,两台电脑如何共享
  12. Spark视频王家林大神 第7课: Spark机器学习内幕剖析
  13. 【瑞吉外卖】学习笔记-day1:项目介绍及后台初识
  14. 容器编排的作用和要实现的内容
  15. git libpng warning: iCCP: cHRM chunk does not match sRGB
  16. SSD《一》-- 基础知识
  17. login.php 什么意思,php is_login()做什么用的;
  18. SELinux,查看 SELinux状态及关闭SELinux
  19. 【论文阅读】Compact and Malicious Private Set Intersection for Small Sets
  20. 关于operator bool () 和bool operator ==()

热门文章

  1. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)
  2. paip.语义分析--单字词名词表
  3. 如何使用Autopano Video Pro进行全景视频拼接?
  4. 高动态范围图像-单图
  5. VR是一场“大骗局”, 另一种声音
  6. 深度卷积网络CNN与图像语义分割
  7. 虚拟与现实的距离——VR产业链史上最全梳理收藏版本【上篇】
  8. Google 图片搜索的原理是什么?
  9. 开源ImageFilter库v0.2:新增7类滤镜,支持12种图片效果
  10. Spring AOP 源码分析 - 拦截器链的执行过程