效果

双击开始播放,继续双击可以加速播放

右键可以弹出菜单:播放、暂停、退出

左键可以拖动窗口

代码

from tkinter import *
import timeimport tkinter as tkfile = "待播放文本.txt"
text=" "bgcolor = '#000000'
fgcolor = '#FFFFFF'def getText():global text# 读with open(file, "r",encoding='utf-8') as f:# 按字节读text = f.read()
#获取一行
getText()
root = Tk()
# 窗口设定为无边框
root.overrideredirect(True)
# 窗口前置
root.wm_attributes("-topmost", 1)
# 窗口属性 透明度设置
root.attributes("-alpha", 0.8)
# 窗口标题
# root.title("文本播放器")
# 窗口大小
root.geometry("200x35+100+100")
# 更新显示文本
show_str = StringVar(root)
# 初始显示文本
show_str.set("双击播放")
# 源字符
source_str = text
# 播放标记
playflag = True# 播放位置
pos = 0
# 滚动
def marquee(widget):#字符宽度textwidth = 18# 源字符长度strlen = len(source_str)# 引用全局变量global pos# 如果字符长度-播放位置<textwidthif strlen - pos < textwidth:# 设定显示的字符串为源字符串的(播放位置,播放位置+文本宽度)+ 源字符串的(0,10-字符串长度+播放位置)show_str.set(source_str[pos:pos+textwidth] + source_str[0:textwidth - strlen + pos])else:# 如果大于textwidth,则播放(播放位置,播放位置+文本宽度)的字符show_str.set(source_str[pos:pos+textwidth])#播放位置+1pos += 1#如果播放位置大于字符串长度if pos > strlen:#播放位置设为0pos = 0# 引用全局变量global stopflag# 如果当前为播放状态if playflag:# 睡眠0.3秒后执行滚动函数widget.after(300, marquee, widget)# 创建标签
show_lb = Label(root, textvariable=show_str,width=300, fg=fgcolor, bg=bgcolor, text=text, font=("Consolas", 10))
# 设定标签位置
show_lb.place(x=0, y=0, width=200, height=35)def doubleClicktoPlay(event):global playflag# 播放playflag = Truemarquee(show_lb)def playStart():global playflag# 播放playflag = Truemarquee(show_lb)def playStop():global playflag# 暂停播放playflag = False# 创建弹出式菜单
menu = tk.Menu(root, tearoff=0)
# 为菜单添加命令标签
menu.add_command(label="播放", command=playStart)
menu.add_command(label="暂停", command=playStop)
menu.add_command(label="退出", command=exit)def popUpMenu(event):#在鼠标点击的位置弹出菜单menu.post(event.x_root, event.y_root)# 为消息事件(按键、点击)绑定函数
root.bind_all("<ButtonRelease-3>", popUpMenu) def moveStart(event):global startX, startY#获取鼠标的点击位置的x、ystartX = event.xstartY = event.ydef move(event):#新坐标=鼠标点击坐标+窗口坐标-初始坐标new_x = (event.x) + root.winfo_x() - startXnew_y = (event.y) + root.winfo_y() - startYs = "200x35+" + str(new_x) + "+" + str(new_y)# 重新设置窗口大小及其位置root.geometry(s)# 为消息事件(按键、点击)绑定函数
root.bind_all("<Button-1>", moveStart)
root.bind_all("<B1-Motion>", move)
root.bind_all("<Double-Button-1>", doubleClicktoPlay)
root.mainloop()

注:

如果文本有换行符,切换不会很流畅

可用此方法删除换行符

更新

新增了设定文本、全屏模式、调节大小、保存位置、恢复位置的功能

import time
import tkinter as tk
from tkinter import *file = "playtext.txt"
text=" "bgcolor = '#000000'
fgcolor = '#FFFFFF'def getText():global text# 读with open(file, "r",encoding='utf-8') as f:# 按字节读text = f.read()#获取一行
getText()
root = Tk()
# 窗口设定为无边框
root.overrideredirect(True)
# 窗口前置
root.wm_attributes("-topmost", 1)
# 窗口属性 透明度设置
root.attributes("-alpha", 0.8)# 窗口大小,字体
w,h,fs=200,35,10#得到屏幕宽度
sw = root.winfo_screenwidth()
#得到屏幕高度
sh = root.winfo_screenheight()def Center(root,w,h):# 居中偏移量# 需要取整dx = int((sw-w) / 2)dy = int((sh-h) / 2)return str(w) + "x" + str(h) +"+"+str(dx)+"+"+str(dy)# 窗口大小
root.geometry(Center(root,w,h))
# 更新显示文本
show_str = StringVar(root)
# 初始显示文本
show_str.set("双击播放")
# 源字符
source_str = text
#字符宽度
textwidth = 20
det=textwidth-len(source_str)
if len(source_str) - textwidth < 0:print(" "*int(det/2)+source_str+" "*int(det/2))source_str=" "*int(det/2)+source_str+" "*int(det/2)# 播放标记
playflag = Truedef replay():global source_str,pos# 从头播放pos=0# 重新获取文字getText()source_str = textplayStop()playStart()# 播放位置
pos = 0
# 滚动
def marquee(widget):global source_str# 源字符长度strlen = len(source_str)det=textwidth-len(source_str)if len(source_str) - textwidth < 0:source_str=" "*int(det/2)+source_str+" "*int(det/2)strlen = len(source_str)# 引用全局变量global pos# 如果字符长度-播放位置<textwidthif strlen - pos < textwidth:# 设定显示的字符串为源字符串的(播放位置,播放位置+文本宽度)+ 源字符串的(0,10-字符串长度+播放位置)show_str.set(source_str[pos:pos+textwidth] + source_str[0:textwidth - strlen + pos])else:# 如果大于textwidth,则播放(播放位置,播放位置+文本宽度)的字符show_str.set(source_str[pos:pos+textwidth])#播放位置+1pos += 1#如果播放位置大于字符串长度if pos > strlen:#播放位置设为0pos = 0#重新播放replay()# 引用全局变量global playflag# 如果当前为播放状态if playflag:# 睡眠0.3秒后执行滚动函数widget.after(300, marquee, widget)# 创建标签
showlabel = Label(root, textvariable=show_str,width=200, fg=fgcolor, bg=bgcolor, text=text, font=("苹方", 10))
# 设定标签位置
showlabel.place(x=0, y=0, width=200, height=35)def doubleClicktoPlay(event):global playflag# 播放playflag = Truemarquee(showlabel)def playStart():global playflag# 播放playflag = Truemarquee(showlabel)def playStop():global playflag# 暂停播放playflag = Falsedef setPosition(dx,dy):s = str(w) + "x" + str(h) +"+"+ str(dx) + "+" + str(dy)root.geometry(s)def getPosition():dx=root.winfo_x()dy=root.winfo_y()s = str(w) + "x" + str(h) +"+"+ str(dx) + "+" + str(dy)# 配置格式:位置 播放速度 with open("偏好配置.txt", "w",encoding='utf-8') as f:f.write(s+" "+str(fs))def Preference():global root,showlabel,fs,wtry:with open("偏好配置.txt", "r",encoding='utf-8') as f:setting=f.readlines()settinglist = setting[0].split(" ")temp=settinglist[0].split("x")w=temp[0]print("huifu:"+settinglist[0])fs=int(settinglist[1])showlabel['font']=("苹方",fs)# 设定标签位置showlabel.place(x=0, y=0, width=200, height=35)root.geometry(settinglist[0])except OSError as reason:# 如果不处理错误,打包的程序将无法运行      # 窗口居中s=Center(root,w,h)# 窗口大小root.geometry(s)print('没有配置文件,将使用默认配置\n'+ str(reason))def setSize_old(h):global w,fs#缩放窗口时,保持左上角位置不变x = root.winfo_x() y = root.winfo_y() w = int(h*5.71)fs = int(h/2.14)global showlabel#限制最大和最小尺寸if 20<h<4000:g=Center(root,w,h)#g = f'{w}x{h}+{x}+{y}'root.geometry(g)showlabel['font']=("苹方",fs)showlabel.place(x=0, y=0, width=w, height=h)def setSize(s,fs):# 根据指定参数设定窗口大小global showlabelroot.geometry(s)showlabel['font']=("苹方",fs)def FullScreen():getPosition()# 创建一个窗口global backback = tk.Tk()# 窗口设定为无边框back.overrideredirect(True)back.configure(background='black')#得到屏幕宽度sw = root.winfo_screenwidth()#得到屏幕高度sh = root.winfo_screenheight()# 窗口大小,字体w,h=sw,sh# 居中偏移量# 需要取整dx = int((sw-w) / 2)dy = int((sh-h) / 2)# 窗口大小back.geometry(str(w) + "x" + str(h) +"+"+str(dx)+"+"+str(dy))tk.Button(back,text='退出全屏',command=notFullScreen).pack()setSize_old(407)back.mainloop()def notFullScreen():back.destroy()Preference()# 传值变量
tf=tk.StringVar()
# 设置默认值
tf.set("")
def Input():# 创建顶级窗口,才可以获取文本框的值# 但是顶级窗口上亦可接收鼠标拖动,这是一个bugframe = tk.Toplevel()frame.title(" ")# 创建标签L1 = tk.Label(frame,text="键入弹幕:")L1.pack(side='left')# 创建文本框textfield=tk.Entry(frame,bd=5,width=20,textvariable=tf)textfield.pack(side='left')# 绑定文本框textfield.bind('<Return>',ChangeText)# 按钮button = tk.Button(frame, text="确定")# 按钮布局button.pack(side='right')# 绑定按钮button.bind('<Button-1>',ChangeText)frame.mainloop()def ChangeText(event):global show_str# 接收文本框的值res=tf.get()print(res)if len(res) - textwidth < 0:res=" "*int(det/2)+res+" "*int(det/2)res=res*20with open(file, "w",encoding='utf-8') as f:f.write(res)replay()# 创建弹出式菜单
menu = tk.Menu(root, tearoff=0)
# 为菜单添加命令标签
menu.add_command(label="设定文本", command=Input)
menu.add_command(label="全屏模式", command=FullScreen)
menu.add_command(label="播放", command=playStart)
menu.add_command(label="暂停", command=playStop)
menu.add_command(label="保存配置", command=getPosition)
menu.add_command(label="恢复配置", command=Preference)
menu.add_command(label="退出", command=sys.exit)def popUpMenu(event):#在鼠标点击的位置弹出菜单menu.post(event.x_root, event.y_root)# 为消息事件(按键、点击)绑定函数
root.bind_all("<ButtonRelease-3>", popUpMenu) def moveStart(event):global startX, startY#获取鼠标的点击位置的x、ystartX = event.xstartY = event.ydef move(event):#新坐标=鼠标点击坐标+窗口坐标-初始坐标new_x = (event.x) + root.winfo_x() - startXnew_y = (event.y) + root.winfo_y() - startYs = str(w) + "x" + str(h) +"+"+ str(new_x) + "+" + str(new_y)print(s+" "+str(fs))# 重新设置窗口大小及其位置root.geometry(s)w,h,fs=200,35,10
#鼠标滚轮调整窗口大小
def onMouseWheel(event):global w, h,fs#缩放窗口时,保持左上角位置不变x = root.winfo_x() y = root.winfo_y() if event.delta > 0:h = int(h*1.05)w = int(h*5.71)fs = int(h/2.14)else:h = int(h*0.95)w = int(h*5.71)fs = int(h/2.14)if fs<=10:fs=10elif fs>300:fs=300global showlabelprint(w,h,fs)#限制最大和最小尺寸if 20<h<4000:g = f'{w}x{h}+{x}+{y}'root.geometry(g)showlabel['font']=("苹方",fs)showlabel.place(x=0, y=0, width=w, height=h)elif h<20:w,h,fs=130,20,10# 为消息事件(按键、点击)绑定函数
root.bind_all("<Button-1>", moveStart)
root.bind_all("<B1-Motion>", move)
root.bind_all("<Double-Button-1>", doubleClicktoPlay)
root.bind_all("<MouseWheel>",onMouseWheel)
root.mainloop()

弹幕版

移除了读写文件的操作,需手动设定文本,优化了对短文本的播放

import time
import tkinter as tk
from tkinter import *text="双击播放"bgcolor = '#000000'
fgcolor = '#FFFFFF'root = Tk()
# 窗口设定为无边框
root.overrideredirect(True)
# 窗口前置
root.wm_attributes("-topmost", 1)
# 窗口属性 透明度设置
root.attributes("-alpha", 0.8)# 窗口大小,字体
w,h,fs=200,35,10#得到屏幕宽度
sw = root.winfo_screenwidth()
#得到屏幕高度
sh = root.winfo_screenheight()def Center(root,w,h):# 居中偏移量# 需要取整dx = int((sw-w) / 2)dy = int((sh-h) / 2)return str(w) + "x" + str(h) +"+"+str(dx)+"+"+str(dy)# 窗口大小
root.geometry(Center(root,w,h))
# 更新显示文本
show_str = StringVar(root)
# 初始显示文本
show_str.set("双击播放")
# 源字符
source_str = text
#字符宽度
textwidth = 20
det=textwidth-len(source_str)
if len(source_str) - textwidth < 0:print(" "*int(det/2)+source_str+" "*int(det/2))source_str=" "*int(det/2)+source_str+" "*int(det/2)# 播放标记
playflag = Truedef replay():global source_str,pos# 从头播放pos=0# 重新获取文字source_str = textplayStop()playStart()# 播放位置
pos = 0
# 滚动
def marquee(widget):global source_str# 源字符长度strlen = len(source_str)det=textwidth-len(source_str)if len(source_str) - textwidth < 0:source_str=" "*int(det/2)+source_str+" "*int(det/2)strlen = len(source_str)# 引用全局变量global pos# 如果字符长度-播放位置<textwidthif strlen - pos < textwidth:# 设定显示的字符串为源字符串的(播放位置,播放位置+文本宽度)+ 源字符串的(0,10-字符串长度+播放位置)show_str.set(source_str[pos:pos+textwidth] + source_str[0:textwidth - strlen + pos])else:# 如果大于textwidth,则播放(播放位置,播放位置+文本宽度)的字符show_str.set(source_str[pos:pos+textwidth])#播放位置+1pos += 1#如果播放位置大于字符串长度if pos > strlen:#播放位置设为0pos = 0# 引用全局变量global playflag# 如果当前为播放状态if playflag:# 睡眠0.3秒后执行滚动函数widget.after(300, marquee, widget)# 创建标签
showlabel = Label(root, textvariable=show_str,width=200, fg=fgcolor, bg=bgcolor, text=text, font=("苹方", 10))
# 设定标签位置
showlabel.place(x=0, y=0, width=200, height=35)def doubleClicktoPlay(event):global playflag# 播放playflag = Truemarquee(showlabel)def playStart():global playflag# 播放playflag = Truemarquee(showlabel)def playStop():global playflag# 暂停播放playflag = Falsedef setPosition(dx,dy):s = str(w) + "x" + str(h) +"+"+ str(dx) + "+" + str(dy)root.geometry(s)def getPosition():dx=root.winfo_x()dy=root.winfo_y()s = str(w) + "x" + str(h) +"+"+ str(dx) + "+" + str(dy)# 配置格式:位置 播放速度 with open("偏好配置.txt", "w",encoding='utf-8') as f:f.write(s+" "+str(fs))def Preference():global root,showlabel,fs,wtry:with open("偏好配置.txt", "r",encoding='utf-8') as f:setting=f.readlines()settinglist = setting[0].split(" ")temp=settinglist[0].split("x")w=temp[0]print("huifu:"+settinglist[0])fs=int(settinglist[1])showlabel['font']=("苹方",fs)# 设定标签位置showlabel.place(x=0, y=0, width=200, height=35)root.geometry(settinglist[0])except OSError as reason:# 如果不处理错误,打包的程序将无法运行      # 窗口居中s=Center(root,w,h)# 窗口大小root.geometry(s)print('没有配置文件,将使用默认配置\n'+ str(reason))def setSize_old(h):global w,fs#缩放窗口时,保持左上角位置不变x = root.winfo_x() y = root.winfo_y() w = int(h*5.71)fs = int(h/2.14)global showlabel#限制最大和最小尺寸if 20<h<4000:g=Center(root,w,h)#g = f'{w}x{h}+{x}+{y}'root.geometry(g)showlabel['font']=("苹方",fs)showlabel.place(x=0, y=0, width=w, height=h)def setSize(s,fs):# 根据指定参数设定窗口大小global showlabelroot.geometry(s)showlabel['font']=("苹方",fs)def FullScreen():getPosition()# 创建一个窗口global backback = tk.Tk()# 窗口设定为无边框back.overrideredirect(True)back.configure(background='black')#得到屏幕宽度sw = root.winfo_screenwidth()#得到屏幕高度sh = root.winfo_screenheight()# 窗口大小,字体w,h=sw,sh# 居中偏移量# 需要取整dx = int((sw-w) / 2)dy = int((sh-h) / 2)# 窗口大小back.geometry(str(w) + "x" + str(h) +"+"+str(dx)+"+"+str(dy))tk.Button(back,text='退出全屏',command=notFullScreen).pack()setSize_old(407)back.mainloop()def notFullScreen():back.destroy()Preference()# 传值变量
tf=tk.StringVar()
# 设置默认值
tf.set("")
def Input():# 创建顶级窗口,才可以获取文本框的值# 但是顶级窗口上亦可接收鼠标拖动,这是一个bugframe = tk.Toplevel()frame.title(" ")# 创建标签L1 = tk.Label(frame,text="键入弹幕:")L1.pack(side='left')# 创建文本框textfield=tk.Entry(frame,bd=5,width=20,textvariable=tf)textfield.pack(side='left')# 绑定文本框textfield.bind('<Return>',ChangeText)# 按钮button = tk.Button(frame, text="确定")# 按钮布局button.pack(side='right')# 绑定按钮button.bind('<Button-1>',ChangeText)frame.mainloop()def ChangeText(event):global show_str,text,source_str# 接收文本框的值res=tf.get()print(res)if len(res) - textwidth < 0:res=" "*int(det/2)+res+" "*int(det/2)res=res*20text=ressource_str=resreplay()# 创建弹出式菜单
menu = tk.Menu(root, tearoff=0)
# 为菜单添加命令标签
menu.add_command(label="设定文本", command=Input)
menu.add_command(label="全屏模式", command=FullScreen)
menu.add_command(label="播放", command=playStart)
menu.add_command(label="暂停", command=playStop)
menu.add_command(label="保存配置", command=getPosition)
menu.add_command(label="恢复配置", command=Preference)
menu.add_command(label="退出", command=sys.exit)def popUpMenu(event):#在鼠标点击的位置弹出菜单menu.post(event.x_root, event.y_root)# 为消息事件(按键、点击)绑定函数
root.bind_all("<ButtonRelease-3>", popUpMenu) def moveStart(event):global startX, startY#获取鼠标的点击位置的x、ystartX = event.xstartY = event.ydef move(event):#新坐标=鼠标点击坐标+窗口坐标-初始坐标new_x = (event.x) + root.winfo_x() - startXnew_y = (event.y) + root.winfo_y() - startYs = str(w) + "x" + str(h) +"+"+ str(new_x) + "+" + str(new_y)print(s+" "+str(fs))# 重新设置窗口大小及其位置root.geometry(s)w,h,fs=200,35,10
#鼠标滚轮调整窗口大小
def onMouseWheel(event):global w, h,fs#缩放窗口时,保持左上角位置不变x = root.winfo_x() y = root.winfo_y() if event.delta > 0:h = int(h*1.05)w = int(h*5.71)fs = int(h/2.14)else:h = int(h*0.95)w = int(h*5.71)fs = int(h/2.14)if fs<=10:fs=10elif fs>300:fs=300global showlabelprint(w,h,fs)#限制最大和最小尺寸if 20<h<4000:g = f'{w}x{h}+{x}+{y}'root.geometry(g)showlabel['font']=("苹方",fs)showlabel.place(x=0, y=0, width=w, height=h)elif h<20:w,h,fs=130,20,10# 为消息事件(按键、点击)绑定函数
root.bind_all("<Button-1>", moveStart)
root.bind_all("<B1-Motion>", move)
root.bind_all("<Double-Button-1>", doubleClicktoPlay)
root.bind_all("<MouseWheel>",onMouseWheel)
root.mainloop()

Python 文本滚动播放相关推荐

  1. python气象卫星云图解析_使用 PyQt 滚动播放卫星云图

    自从 和 GNOME 开发者接触过 之后,我决定放弃断断续续学了一段时间的 GTK 而转向 Qt 了.看了两三天的 PyQt4 tutorial ,恰好遇到一需要界面的脚本,本来我会搞成 Web 的, ...

  2. 转载博客 htm5l实现滚动播放

    Yorhom's Game Box 用自己的双手绘画自己的游戏天地,用自己的智慧换取成功的喜悦 目录视图 摘要视图 订阅 [免费公开课]Gulp前端自动化教程   [专家问答]陈绍英:大型IT系统性能 ...

  3. python实现音乐播放和下载小程序功能

    更多编程教程请到:菜鸟教程 https://www.piaodoo.com/ 友情链接: 高州阳光论坛https://www.hnthzk.com/ 人人影视http://www.sfkyty.com ...

  4. html滑动直播,HTML5 canvas实现的静态循环滚动播放弹幕

    本文主要介绍了HTML5 canvas实现的静态循环滚动播放弹幕,分享给大家,具体如下: 使用方法和API 语法如下: canvasBarrage(canvas, data); 其中: canvas ...

  5. 功能强大的滚动播放插件JQ-Slide

    查看效果:http://keleyi.com/keleyi/phtml/jqplug/4.htm JQ-Slide插件功能强大,滚动方式自由多样 全部滚动方式 方式一 方式二 方式三 方式四 方式五  ...

  6. untiy实现文本滚动

    关键代码(初学) if (Isplayers){if (speed != 0 && anxia == false){//将文本框的自适应高度 赋值给 txtheighttxtheigh ...

  7. 如何在大屏幕上滚动播放视频、图片和文字

    传统方法 在各种大屏上滚动播放视频.图片和文字的方法通常有如下两种: 1)使用视频播放软件,创建播放列表进行播放 2)使用信息发布系统,创建播放列表进行播放 第1种方法相对比较Low,需要到连接屏幕的 ...

  8. python文本数据分析-新闻分类任务

    python文本数据分析-新闻分类任务 文本分析 文本数据 停用词:1.语料中大量出现:2.没啥大用:3.留着过年嘛?所以根据停用词表进行筛选,去掉这些停用词. Tf-idf:关键词提取 <中国 ...

  9. 30天数据分析与机器学习实践之Day16——Python文本数据分析:新闻分类任务

    30天数据分析与机器学习实践之Day16--Python文本数据分析:新闻分类任务 一.文本分析与关键词提取 1.1文本数据 1.2停用词 1.语料中大量出现2.没啥大用3.留着过年嘛? 1.3Tf- ...

  10. vue 上实现无缝滚动播放文字系统公告

    首先实现效果,当时的需求做的系统公告框设定一个宽度,超宽滚动播放,没超宽则静态展示, 有了需求,想了下实现原理,最开始打算js更改字体内容的方式,但是想了下感觉会有点麻烦,想起之前做了表格的左侧边固定 ...

最新文章

  1. 寒假每日一题(提高组)【Week 1 完结】
  2. C# 中的数字分隔符 _
  3. spring安全性_具有PreAuthorize的Spring方法安全性
  4. 小米手机硬改技术_小米11手机爆料:首发骁龙875 或采用屏下摄像头技术
  5. Axure高保真智慧校园管理系统/校园管理/人事管理/学籍管理/教学管理/流程审批/备课管理/考务管理/成绩管理/排课管理/选课管理/选课系统/调课申请/教师考评管理/web端管理系统
  6. oa系统服务器数据库,oa数据库和服务器
  7. python避障小车_基于树莓派的超声波避障小车
  8. seaweedfs使用说明
  9. 海湾主机汉字注释表打字出_海湾消防主机字根表-海湾消防主机
  10. ​linux 添加开机启动项的三种方法
  11. java面试项目中遇到难题,大量教程
  12. Java 线程 基础知识总结
  13. 阿里巴巴Java开发手册免费下载
  14. linux文件赋予用户权限,Linux 给用户赋予操作权限
  15. 浅析IT运维监控技术
  16. 【Node.js】 npm与包
  17. ds6708 symbol 驱动_SymbolDS6708
  18. 【一】、创建虚拟机Linux系统Centos镜像并且配置静态IP
  19. 滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(12月17日)...
  20. 做无盘网吧系统的详细步骤(四)

热门文章

  1. Smart SVN客户端使用
  2. python烟花代码
  3. 凭证反过账 金蝶k3_金蝶K3总账凭证过账等处理方式
  4. 老男孩linux学习笔记第一课安装Linux
  5. python基本数据类型
  6. 优控触摸屏使用手册_中达优控plc触摸屏一体机说明书资料
  7. 三星530换固态硬盘_也许是目前性价比最高的固态硬盘!三星870 QVO快速体验
  8. Hadoop大数据原理与应用
  9. Arcgis使用DEM数据计算坡度
  10. MIT-JOS系列5:用户环境(一)