暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Tk教程

原创 yBmZlQzJ 2023-08-09
1983

Tk教程

TK指工具包,它提供了跨平台的GUI控件,它可以建立一个图形用户界面。它开发者是John Ousterhout,以Tcl脚本语言的扩展。 TK仍然是开发独立于Tcl的版本,它在同步使用TCL V8.0。

Tk的特点

它可在Linux,Mac OS,Unix和Microsoft Windows操作系统运行,支持跨平台。

  • 它是开源的。
  • 它提供了较高水平的可扩展。
  • 它是可定制的。
  • 它是可配置的。
  • 它提供了大量的小部件。
  • 它可与多个其他动态语言中使用,而不只是Tcl。
  • GUI看起来完全跨平台。

建于Tk的应用

大量成功的应用使用Tcl/Tk构建成。

  • 仪表板软件用户界面
  • 构成GUI的关系数据库
  • 专案GUI的关系数据库
  • 软件/硬件系统设计
  • Xtask - 任务管理
  • 音乐学使用Tcl和Tk
  • 日历应用程序
  • Tk mail
  • Tk Debugger

TK环境设置 - Tk教程

一般所有Mac和Linux MAC配备了预装Tk。如果它不可用,或者需要最新版本,那么可能需要安装它。Windows上没有预装Tcl/Tk,可能需要使用特定的二进制安装它。

Tk解释器

这仅仅是一个小程序,可以键入Tk命令,并逐行执行。它停止执行的情况下,它遇到错误不能执行编译一个TCL文件。

让我们创建一个 helloWorld.tcl文件,如下所示。运行在选择的平台上的第一个程序。

#!/usr/bin/wish

grid [ttk::button .mybutton -text "Hello World"]

下面的部分仅说明如何在每个可用的平台上安装Tcl/Tk。

在Windows上安装

从可用有效的Tcl/Tk二进制文件列表下载最新版本的Windows安装程序。活跃的Tcl / Tk社区版可供免费供个人使用。

运行下载的可执行文件安装Tcl和Tk,可以按照屏幕上的说明进行。

现在我们可以构建并切换到包含该文件的文件夹中,然后使用以下步骤运行Tcl文件helloWorld.tcl

C:\Tcl> wish helloWorld.tcl

按回车键,我们会看到一个输出,如下图所示。

Hello World Windows

在Linux上安装

大多数Linux操作系统自带的内置Tk,可以马上在这些系统使用。在一些情况下,它可能不可用,那可以使用下面的命令来下载和安装Tcl-TK。

$ yum install tcl tk

现在我们可以构建并通过使用cd命令切换到文件夹包含该文件,然后使用以下步骤运行Tcl文件helloWorld.tcl

$ wish helloWorld.tcl

按回车键,我们会看到类似以下的输出。

Hello World

在基于Debian的系统安装

在情况下,如果无法提供预建在操作系统,可以使用下面的命令来下载和安装Tcl-TK。

$ sudo apt-get install tcl tk

现在我们可以构建并通过使用cd命令切换到文件夹包含该文件,然后使用以下步骤来运行一个Tcl文件表示helloWorld.tcl

$ wish helloWorld.tcl

按回车键,我们会看到类似以下的输出。

Hello World

在Mac OS X安装

从可用有效的Tcl/Tk二进制文件列表下载最新版本的Mac OS X包。有效Tcl社区版可免费供个人使用。

运行下载的可执行文件安装Active Tcl,可以按照屏幕上的说明进行。

现在我们可以构建并通过使用cd命令切换到文件夹包含该文件,然后使用以下步骤运行Tcl文件helloWorld.tcl

$ wish helloWorld.tcl

按回车键,我们会看到一个输出,如下图所示。

Hello World

从安装源文件

可以从源文件安装时的二进制包不可用的选项。所以一般最好使用Tk的二进制文件适用于Windows和Mac OS X,在UNIX的系统资源所以只有编译如下所示。

  • 下载源文件
  • 现在,使用下面的命令来提取,编译和构建切换到下载的文件夹。

$ tar zxf tk8.6.1-src.tar.gz
$ cd tcl8.6.1
$ cd unix
$ ./configure —with-tcl=../../tcl8.6.1/unix —prefix=/opt —enable-gcc
$ make
$ sudo make install

注:请确保更改文件名,在上面的命令1和2下载的版本。

TK特殊变量 - Tk教程

在tk中,我们将一些变量进行分类作为特殊变量,它们有一个预定义的用法/功能。特殊变量的列表如下。

特变

描述

tk_library

用于设置标准Tk库的位置。

tk_patchLevel

参照Tk解释当前补丁级别。

tk_strictMotif

当非零,TK试图尽可能接近遵循Motif外观。

tk_version

显示Tk的版本。

上述特殊变量都有各自的Tk解释特殊的含义。

使用Tk特殊变量的例子

让我们来看看特殊变量的例子。

TK版本

#!/usr/bin/wish

puts $tk_version

当运行程序,会得到一个相似的输出,如下图所示。

8.5

TK库路径

#!/usr/bin/wish

puts $tk_library

当运行程序,会得到一个相似的输出,如下图所示。

/Library/Frameworks/Tk.framework/Versions/8.6/Resources/Scripts

TK补丁级别

#!/usr/bin/wish

puts $tk_patchLevel

当运行程序,会得到一个相似的输出,如下图所示。

8.6.1

TK STRICTMOTIF

#!/usr/bin/wish

puts $tk_strictMotif

当运行程序,会得到一个相似的输出,如下图所示。

0

TK Widget概述 - Tk教程

一个基于Tcl的应用程序的基本组成部分被称为窗口小部件。成分有时也被称为窗口,由于在Tk的“window”和“widget”经常互换使用。 Tk是一个软件包,提供了一组图形组件的丰富来使用Tcl创建图形的应用程序。

TK提供了一系列的部件,从基本的GUI控件如按钮和菜单数据显示窗口小部件。窗口小部件是非常可配置的,因为它们的默认配置使它们易于使用。

Tk程序遵循一个部件widget的层次结构,其中任何数量的部件可以被放置在另一小窗口,并在另一小窗口的部件。在一个Tk的程序所述主窗口部件被称为根部件,并且可以通过使TkRoot类的新实例被创建。

创建一个小部件

创建插件widget语法下面给出。

type variableName arguments options

这里的类型指的是按钮,标记等小部件的类型。参数是可选的,并且基于每个widget语法所必需的。选项范围大小到每个组件的格式。

Widget 命名约定

Widget使用类似命名的包结构。Tk的根窗口被命名为用句点(.)和在窗口中的元素,例如按钮命名.myButton1。变量名称应该以小写字母,数字或标点符号(除了一个时期)。第一个字符后,其它字符可以是大写或小写字母,数字或标点符号(除了时间)。建议使用小写字母开始的标签。

颜色命名约定

颜色可以使用名称,如red, green等声明。它也可以用十六进制表示与#。十六进制数字的数目可以是3,6,9或12。

维度约定

默认单位是像素,它是用来当指定大小。其他尺寸i表示英寸,m表示毫米,c表示厘米,以及p表示点。

常用选项

有提供给所有的部件,以便许多共同的选项和它们被列于下表中。

SN

语法

描述

1

-background color

用于设置小部件背景色。

2

-borderwidth width

用于绘制在3D效果边界。

3

-font fontDescriptor

用来设置部件字体。

4

-foreground color

用于设置部件的前景色。

5

-height number

用于设置部件高度。

6

-highlightbackground color

用于设置颜色矩形周围画一个小部件时,窗口小部件不具有输入焦点。

7

-highlightcolor color

用于设置颜色矩形周围画一个小部件时,窗口小部件有输入焦点。

8

-padx number

设置padx的部件。

9

-pady number

设置pady的部件。

10

-relief condition

设置这个小程序的3D浮雕。条件得到提升,凹陷,扁平,起垄,固体或凹槽。

11

-text text

设置小部件的文本。

12

-textvariable varName

变量与小部件关联。当小部件的文本改变,该变量设置控件的文本。

13

-width number

设置widget的宽度。

一个简单的例子选择如下所示。

#!/usr/bin/wish

grid [label .myLabel -background red -text "Hello World" -relief ridge -borderwidth 3] -padx 100 -pady 100

当我们运行上面的程序,会得到下面的输出。

Hello World Options

可用窗口小部件的列表如下分类。

基础widgets

SN

Widget

描述

1

Label

窗口小部件,用于显示文本的单行。

2

Button

小部件是可以点击的,并触发一个动作。

3

Entry

窗口小部件用于接受文字输入的一行。

4

Message

小部件显示多行文本。

5

Text

小部件显示和可选编辑多行文本。

6

Toplevel

由窗口管理器提供的所有边框和装饰。

widgets布局

SN

Widget

描述

1

Frame

容器部件持有其他部件。

2

Place

窗口小部件持有特定的地方的其他部件,其起源坐标和精确的尺寸。

3

Pack

简单的小工具,以将它们放置在父控件之前组织块部件。

4

Grid

窗口小部件嵌套小部件包装在不同的方向。

选择widgets

SN

Widget

描述

1

Radiobutton

窗口小部件具有一组开/关按钮和标签,其中一个可被选择。

2

Checkbutton

窗口小部件具有一组开/关按钮和标签,其中许多可被选择.

3

Menu

窗口小部件为菜单项充当支架。

4

Listbox

窗口小部件,显示一个或多个单元格,其中的列表可以被选择。

大型widgets

SN

Widget

描述

1

Dialog

部件显示对话框。

2

Spinbox

窗口小部件允许用户选择数字。

3

Combobox

窗口小部件,它结合了可供利用的选择列表中的一个条目。

4

Notebook

标签窗口小部件,有助于几个页面之一之间切换,使用索引选项卡。

5

Progressbar

窗口小部件提供视觉反馈的一个长期操作,如文件上传进度。

6

Treeview

窗口小部件用来显示,并允许通过项目的层次结构浏览更多的树的形式。

7

Scrollbar

滚动部件没有文字或canvas小部件。

8

Scale

缩放小部件选择通过滑块的数值。

其它 widgets

SN

Widget

描述

1

Canvas

绘制部件显示图形和图像..

我们将介绍有关各窗口小部件在下几个章节。

TK 基本Widget - Tk教程

基本部件widget是在几乎所有的Tk应用程序中提供常用的小工具。可用的基本部件的列表如下所示。

1

Label

窗口小部件,用于显示文本的单行。

2

Button

小部件是可以点击的,并触发一个动作。

3

Entry

窗口小部件用于接受文字输入的一行。

4

Message

小部件显示多行文本。

5

Text

小部件显示和可选编辑多行文本。

6

Toplevel

窗口小部件用于创建一个帧是一个新的顶层窗口。

一个简单Tk的示例如下所示使用基本部件。

#!/usr/bin/wish

grid [label .myLabel -text "Label Widget" -textvariable labelText]
grid [text .myText -width 20 -height 5]
.myText insert 1.0 "Text\nWidget\n"
grid [entry .myEntry -text "Entry Widget"]
grid [message .myMessage -background red -foreground white -text "Message\nWidget"]
grid [button .myButton1 -text "Button" -command "set labelText clicked"]

当我们运行上面的程序,会得到下面的输出。

Basic Widgets Example

TK Widget布局 - Tk教程

布局部件被用于处理Tk应用程序布局。Frame控件是用来组其他部件和位置,包装和网格是布局管理器,完全控制添加到Windows。可用布局窗口小部件的列表,如下所示。

1

Frame

容器部件持有其他部件。

2

Place

窗口小部件持有特定的地方的其他部件,其起源坐标和精确的尺寸。

3

Pack

简单的小工具,以将它们放置在父控件之前组织块部件。

4

Grid

窗口小部件嵌套小部件包装在不同的方向。

一个简单的Tk的部件布局示例,如下所示。

#!/usr/bin/wish

frame .myFrame1 -background red -relief ridge -borderwidth 8 -padx 10 -pady 10 -height 100 -width 100
frame .myFrame2 -background blue -relief ridge -borderwidth 8 -padx 10 -pady 10 -height 100 -width 50
pack .myFrame1
pack .myFrame2

当我们运行上面的程序,会得到下面的输出。

Frame Widget Example

TK选择Widget - Tk教程

选择窗口小部件用于选择在一个Tk应用程序不同的选项。可用的选择窗口小部件的列表,如下所示。

1

Radiobutton

窗口小部件具有一组开/关按钮和标签,其中一个可被选择

2

Checkbutton

窗口小部件具有一组开/关按钮和标签,其中许多可被选择。

3

Menu

窗口小部件为菜单项充当支架。

4

Listbox

窗口小部件,显示一个或多个单元格,其中的列表可以被选择。

一个简单的Tk选择部件使用的示例如下所示。

#!/usr/bin/wish

grid [frame .gender ]
grid [label .label1 -text "Male" -textvariable myLabel1 ]
grid [radiobutton .gender.maleBtn -text "Male" -variable gender -value "Male" -command "set myLabel1 Male"] -row 1 -column 2
grid [radiobutton .gender.femaleBtn -text "Female" -variable gender -value "Female" -command "set myLabel1 Female"] -row 1 -column 3
.gender.maleBtn select
grid [label .myLabel2 -text "Range 1 not selected" -textvariable myLabelValue2 ]
grid [checkbutton .chk1 -text "Range 1" -variable occupied1 -command {if {$occupied1 } {
set myLabelValue2 {Range 1 selected}
} else {
set myLabelValue2 {Range 1 not selected}
} }]
proc setLabel {text} {
.label configure -text $text
}

当我们运行上面的程序,会得到下面的输出。

Selection Widget Example

Tk Canvas Widget - Tk教程

Canvas 用于提供画图区。Canvas 组件的语法如下所示。

canvas canvasName options

选项

可用于canvas widget的选项列于下表中。

SN

语法

描述

1

-background color

用于设置小部件背景色。

2

-closeenough distance

设置鼠标光标移动到一个可显示项目接近程度。默认值是1.0像素。该值可以是一个分数,并必须为正。

3

-scrollregion boundingBox

所述边界框为这个画布canvas的总面积。

4

-height number

用于设置部件widget的高度。

5

-width number

设置widget的宽度。

6

-xscrollincrement size

用于滚动请求水平滚动的数量值。

7

-yscrollincrement size

垂直滚动时,滚动请求数量值。

一个简单的例子canvas widget如下所示。

#!/usr/bin/wish

canvas .myCanvas -background red -width 100 -height 100
pack .myCanvas

当我们运行上面的程序,会得到下面的输出。

Canvas Widget Example

Widget小工具在canvas上绘图

可用小部件在画布canvas上绘制列表如下。

SN

Widget

描述

1

Line

绘制一条线。

2

Arc

绘制弧形。

3

Rectangle

绘制一个矩形。

4

Oval

绘制一个椭圆。

5

Polygon

绘制多边形。

6

Text

绘制文本。

7

Bitmap

绘制一个位图。

8

Image

绘制图像。

使用不同的canvas widgets 的一个例子如下所示。

#!/usr/bin/wish

canvas .myCanvas -background red -width 200 -height 200
pack .myCanvas
.myCanvas create arc 10 10 50 50 -fill yellow
.myCanvas create line 10 30 50 50 100 10 -arrow both -fill yellow -smooth true -splinesteps 2
.myCanvas create oval 50 50 100 80 -fill yellow
.myCanvas create polygon 50 150 100 80 120 120 100 190 -fill yellow -outline green
.myCanvas create rectangle 150 150 170 170 -fill yellow
.myCanvas create text 170 20 -fill yellow -text "Hello" -font {Helvetica -18 bold}
.myCanvas create bitmap 180 50 -bitmap info

当我们运行上面的程序,会得到下面的输出。

Canvas Widget Example2

TK 大型Widget - Tk教程

大型部件,其中包括许多复杂的部件是经常需要在一些大型Tk的应用。可用大型部件的列表,如下所示。

SN

Widget

描述

1

Dialog

小部件显示对话框。

2

Spinbox

小工具,允许用户选择数字。

3

Combobox

窗口小部件,它结合了可供利用的选择列表中的一个条目。

4

Notebook

标签窗口小部件,有助于几个页面之一之间切换,使用索引选项卡。

5

Progressbar

窗口小部件提供视觉反馈的一个长操作,如文件上传进度。

6

Treeview

窗口小部件来显示,并允许通过项目的层次结构浏览更多的树的形式。

7

Scrollbar

滚动部件不带文字或canvas小部件。

8

Scale

缩放小部件选择通过滑块的数值。

一个简单的Tk的使用一些大型部件的示例如下所示。

#!/usr/bin/wish

ttk::treeview .tree -columns "Creator Year" -displaycolumns "Year Creator"
.tree heading Creator -text "Creator" -anchor center
.tree heading Year -text "Year" -anchor center
pack .tree
.tree insert {} end -id Languages -text "Languages"
.tree insert Languages end -text C -values [list "Dennis Ritchie" "1990"]
proc scaleMe {mywidget scaleValue} {
$mywidget configure -length $scaleValue
}
pack [scale .s2 -from 100.0 -to 200.0 -length 100 -background yellow -borderwidth 5 -font {Helvetica -18 bold} -foreground red -width 40 -relief ridge -orien horizontal -variable a -command "scaleMe .s2" ]
pack [ttk::progressbar .p1 -orient horizontal -length 200 -mode indeterminate -value 90]
pack [ttk::progressbar .p2 -orient horizontal -length 200 -mode determinate -variable a -maximum 75 -value 20]

当我们运行上面的程序,会得到下面的输出。

Mega Widget Example

TK图片 - Tk教程

图像小部件,用于创建和处理图像。创建图像的语法如下。

image create type name options

另外,在上述的语法类型是照片、位图或名称是图像标识符。

选项

可用于图像的选项创建列于下表中。

SN

语法

描述

1

-file fileName

图像文件名的名称。

2

-height number

用于设置部件widget的高度。

3

-width number

设置widget的宽度。

4

-data string

图像中基本64编码字符串。

一个简单图像小部件的例子如下所示。

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/Desktop/F Drive/pictur/vb/Forests/680049.png" -width 400 -height 400
pack [label .myLabel]
.myLabel configure -image imgobj

当我们运行上面的程序,会得到下面的输出。

Image Example

可用函数用于图像列于下表中。

SN

语法

描述

1

image delete imageName

删除从存储器和相关的小窗口在视觉上的图像。

2

image height imageName

返回高度的图像。

3

image width imageName

返回图像的宽度。

4

image type imageName

返回图像的类型。

5

image names

返回存在存储器中的图像列表。

一个简单的例子,使用上面图像小部件的命令如下所示。

#!/usr/bin/wish

image create photo imgobj -file "/Users/rajkumar/images/680049.png" -width 400 -height 400
pack [label .myLabel]
.myLabel configure -image imgobj
puts [image height imgobj]
puts [image width imgobj]
puts [image type imgobj]
puts [image names]
image delete imgobj

图像将视觉和记忆,一旦“image delete imgobj”命令执行删除。在控制台,输出会像下面。

400
400
photo
imgobj ::tk::icons::information ::tk::icons::error ::tk::icons::warning ::tk::icons::question

TK事件 - Tk教程

事件是最简单的形式与命令的交互处理过程。一个简单的例子,事件处理-按钮事件,如下图所示。

#!/usr/bin/wish

proc myEvent { } {
puts "Event triggered"
}
pack [button .myButton1 -text "Button 1" -command myEvent]

当我们运行上面的程序,会得到下面的输出。

Event Example

一个简单的程序,以显示延迟的文字动画事件如下所示。

#!/usr/bin/wish

proc delay {} {
for {set j 0} {$j < 100000} {incr j} {
}
}
label .myLabel -text "Hello................" -width 25
pack .myLabel
set str "Hello................"
for {set i [string length $str]} {$i > -2} {set i [expr $i-1]} {
.myLabel configure -text [string range $str 0 $i]
update
delay
}

当我们运行程序,会得到动画如下面的输出。

Event Example3

延后事件

延后事件的语法如下所示。

after milliseconds number command

一个简单的程序,以显示如下图所示延迟事件之后。

#!/usr/bin/wish

proc addText {} {
label .myLabel -text "Hello................" -width 25
pack .myLabel
}
after 1000 addText

当我们运行程序,将在一秒钟后得到以下输出。

Event Example2

可以在使用后,取消命令,如下图所示取消的事件。

#!/usr/bin/wish

proc addText {} {
label .myLabel -text "Hello................" -width 25
pack .myLabel
}
after 1000 addText
after cancel addText

事件绑定

事件绑定的语法如下所示。

bind arguments

键盘事件的例子

#!/usr/bin/wish

bind . {puts "Key Pressed: %K "}

当我们运行程序,并按下一个字母X,会得到下面的输出。

Key Pressed: X

鼠标事件的例子

#!/usr/bin/wish

bind . {puts "Button %b Pressed : %x %y "}

当我们运行程序,并按下鼠标左键,会得到类似以下的输出。

Button 1 Pressed : 89 90

具有按钮事件例如链接

#!/usr/bin/wish

proc myEvent { } {
puts "Event triggered"
}
pack [button .myButton1 -text "Button 1" -command myEvent]
bind . ".myButton1 invoke"

当我们运行程序,然后按回车,会得到下面的输出。

Event triggered

TK窗口管理器 - Tk教程

窗口管理器是用来处理顶层窗口。它有助于在控制大小,位置和窗口的其他属性。在传统知识。用于指主窗口。窗口命令的语法如下所示。

wm option window arguments

可用于Tk wm命令选项的列表如下表所示。

SN

语法

描述

1

aspect windowName a b c d

尽量保持width/height的比率是a/b 和 c/d之间。

2

geometry windowName geometryParams

用于设置几何窗口。

3

grid windowName w h dx dy

设置网格的大小。

4

group windowName leaderName

leaderName给出了一组相关的窗口

5

deiconify windowName

使画面正常,如果是最小化。

6

iconify windowName

最小化窗口。

7

state windowName

返回窗口的当前状态。

8

withdraw windowName

将取消该窗口,并在内存中删除其详细信息。

9

iconbitmap windowName image

设置或返回图标位图。

10

iconPhoto windowName image

设置或返回图标照片。

11

command windowName commandString

记录WM_COMMAND属性启动命令。

12

protocol windowName arguments

寄存器命令来处理协议请求名称,这可以是WM_DELETE_WINDOW, WM_SAVE_YOURSELF, WM_TAKE_FOCUS. Eg: wm协议。 WM_DELETE_WINDOW退出

13

minsize windowName size

确定最小窗口尺寸。

14

maxsize windowName size

确定最大窗口大小。

15

title windowName titleText

确定用于窗口的标题。

16

attributes subOptions

很多可用的如,字母,全屏等属性。

上述的一些命令被用在下面的例子。

#!/usr/bin/wish

wm maxsize . 800 800
wm minsize . 300 300
wm title . "Hello"
wm attributes . -alpha ".90"
wm geometry . 300x200+100+100

当我们运行上面的程序,会得到下面的输出。

Window Manager

正如所看到alpha是可用的属性之一。常用子命令的列表在下面列出。

SN

语法

描述

1

-alpha number

设置字母窗口。

2

-fullscreen number

数字可以是:0-正常屏幕或1-全屏。

3

-topmost number

设置或返回窗口topmost.Value是否为0或1。

创建窗口

我们可以使用顶层命令用来创建一个窗口和一个示例如下所示。

#!/usr/bin/wish

toplevel .t

当我们运行上面的程序,会得到下面的输出。

Window Manager2

销毁窗口

我们可以用destroy命令销毁的窗口和一个示例如下所示。

#!/usr/bin/wish

destroy .t

上面的命令会销毁名为.t的窗口。

TK几何图形管理器 - Tk教程

几何图形管理器用于管理窗口和其他框架的几何形状。我们可以用它来处理的窗口和框架的位置和大小。布局部件被用于此目的。

定位和尺寸

窗口的定位和大小的语法如下所示。

wm geometry . wxh+/-x+/-y

在这里,w特是指宽度和h指高度。其次是一个“+”或“ - ”符号与下一个编号参照在屏幕上的x位置。同样地,下面的“+”或“ - ”符号及使用的数字是指在屏幕上的y位置

一个简单的例子显示如下上述。

#!/usr/bin/wish

wm geometry . 300x200+100+100

当我们运行上面的程序,会得到下面的输出。

GeometryManager1 Example

网格几何图形

网格几何的语法如下所示。

grid gridName -column number -row number -columnspan number -rowspan number

column, row, columnspan, rowspan有助于提供网格几何形状。

一个简单的例子显示如下上述。

#!/usr/bin/wish

frame .myFrame1 -background red -height 100 -width 100
frame .myFrame2 -background blue -height 100 -width 50
grid .myFrame1 -columnspan 10 -rowspan 10 -sticky w
grid .myFrame2 -column 10 -row 2

当我们运行上面的程序,会得到下面的输出。

Grid Geometry </center>

</center>

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论