如何向linux shell指令碼新增gui

您可以在Bash指令碼中使用GUI視窗、滑塊、單選按鈕、進度條等。學習如何使用zenity工具箱,並對Bash指令碼進行整容。我們會教你怎麼做。...

如何向linux shell指令碼新增gui

您可以在Bash指令碼中使用GUI視窗、滑塊、單選按鈕、進度條等。學習如何使用zenity工具箱,並對Bash指令碼進行整容。我們會教你怎麼做。

Bash指令碼是一種功能強大的程式語言,由於它內建在Bash shell中,因此每個人都可以隨時使用它。這是一種很容易開始程式設計的語言。因為它是解釋的,所以不需要編譯指令碼。一旦編輯了指令碼檔案並使其可執行,就可以執行它。這使得編碼、執行和調試周期非常高效。

人們對Bash指令碼的抱怨主要有兩個,第一個是速度。因為bashshell解釋指令碼中的命令,所以它們的執行速度不如編譯後的程式碼快。然而,這就像抱怨拖拉機不如汽車快;它們的用途不同。

不過,有兩種速度。通常,您可以組合一個快速指令碼並使用它來執行任務,這比用編譯語言(如C)開發解決方案要快得多。

人們對Bash指令碼的第二個抱怨是使用者介面,它是一個終端視窗。當然,有時介面並不重要。如果唯一會使用指令碼的人是它的作者,那麼介面可能就沒那麼重要了。對於執行後臺和批處理型別處理的指令碼也不重要。通常,這樣的指令碼不需要太多(如果有的話)使用者互動。

有時你確實需要一些比終端視窗更直觀、更現代的東西。大多數人都熟悉圖形使用者介面(GUI)。為了給人們一種儘可能無摩擦的體驗,您必須從指令碼中建立和使用GUI元素。

zenity應用程式

zenity允許您在Bash指令碼中合併大量的圖形介面元素。它是一個強大的工具包,可以給你的指令碼一個現代的感覺和一個現代的,熟悉的外觀。

zenity預裝在Ubuntu、Fedora和Manjaro發行版上。它是侏儒的一部分。如果您使用KDE,那麼您可能希望改為簽出kdialog,儘管zenity確實在任何桌面環境中執行。

本文中的示例向您展示瞭如何從命令列建立不同的對話方塊視窗,如何在變數中捕獲它們的返回值和使用者選擇,以及如何在指令碼中使用對話方塊視窗。

最後是一個小應用程式,它使用了所有三種類型的對話方塊視窗。

日曆對話方塊視窗

日曆對話方塊視窗允許使用者選擇日期。要建立一個具有zenity的命令,需要兩個單詞:

zenity --calendar007Ys3FFgy1gp66kfvoj8j30hy01lt8k

此時將顯示“日曆”對話方塊視窗。它具有標準日期選取器的所有功能。您可以更改月份和年份,然後單擊某一天來選擇該日期。預設情況下,今天的日期在窗口出現時高亮顯示。

如何向linux shell指令碼新增gui

單擊“確定”關閉對話方塊視窗並選擇突出顯示的日期。雙擊一個日期做同樣的事情。

如果不想選擇日期,請單擊“取消”,按鍵盤上的“Esc”鍵,或關閉對話方塊視窗。

如何向linux shell指令碼新增gui

在上例中,選擇2019年8月19日。如果使用者單擊“確定”,日曆將關閉,所選日期將在終端視窗中列印。

如何向linux shell指令碼新增gui

您可以忽略行“GTKDialog mapped without a transient parent。這是不鼓勵的。”

GTK代表GIMP工具箱,它是用來開發GNOME介面的工具箱。它最初是由GNU影象處理程式(GIMP)的作者設計的。GNU代表GNU不是Unix。

GTK引擎警告zenity的作者,他們以非標準的方式使用了GTK元件。

捕獲日期值

把日期列印到終端上對我們沒什麼用。如果要從指令碼中呼叫此日曆,則需要捕獲選定的日期值,以便在指令碼中使用它做一些有用的事情。我們還將稍微自定義日曆。

我們將在日曆中使用以下選項。它們必須與雙破折號“–”標誌一起使用:

  • –text:指定要在日曆中顯示的文字字串。它將替換預設值“從下面選擇日期”
  • –title:設定日曆對話方塊視窗的標題。
  • –day:設定日曆開啟時選擇的日期。
  • –month:設定日曆開啟時選擇的月份。
  • –year:設定日曆開啟時選擇的年份。

我們使用一個名為ChosenDate的變數來捕獲從日曆返回的日期。我們使用echo$ChosenDate將日期列印到終端視窗。

是的,我們在上一個示例中獲得了相同的結果,但是在這裡,我們將選定的日期儲存在一個變數中。在上一個示例中,它被列印並遺忘。

ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 -- month 9 --year 2019); echo $ChosenDate

如何向linux shell指令碼新增gui

現在,日曆顯示我們的提示和視窗標題。日期設定為我們選擇的開始日期,而不是今天的日期。

如何向linux shell指令碼新增gui

我們還可以自定義選擇時返回的日期字串的格式。--date format選項後面必須跟一個格式說明符。這是一個令牌字串,用於定義要包含在輸出中的資料和格式。這些標記與strftime()C語言函式中使用的標記相同,並且有大量的選擇。

我們使用的代幣是:

  • %A:一週中某一天的全稱。
  • %d:以數字表示的一個月的哪一天。
  • %m:以數字表示的月份。
  • %年是兩位數(沒有世紀)。
ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 -- month 9 --year 2019); echo $ChosenDate

如何向linux shell指令碼新增gui

某人選擇日期:

如何向linux shell指令碼新增gui

使用我們的格式返回日期。它顯示一週中某一天的名稱,後跟按歐洲順序排列的日期:日、月、年。

如何向linux shell指令碼新增gui

檔案選擇對話方塊視窗:選擇檔案

檔案選擇對話方塊視窗相當複雜。人們可以瀏覽檔案系統,突出顯示一個或多個檔案,然後單擊“確定”來選擇這些檔案或完全取消選擇。

zenity提供了所有這些功能,等等。它和日曆對話方塊視窗一樣易於使用。

我們將使用的新選項有:

  • –檔案選擇:告訴zenity我們要使用檔案選擇對話方塊視窗。
  • –多個:允許使用者選擇多個檔案。
  • –檔案過濾器:告訴檔案對話方塊視窗要顯示的檔案型別。
zenity --file-selection --tile "How-To Geek" --multiple --file-filter='*.mm *.png *.page *.sh *.txt'

如何向linux shell指令碼新增gui

“檔案選擇”對話方塊視窗的功能與其他任何檔案選擇視窗相同。

如何向linux shell指令碼新增gui

使用者可以瀏覽檔案系統並選擇自己選擇的檔案。

如何向linux shell指令碼新增gui

我們已經瀏覽到一個新目錄並選擇了一個名為“button”的檔案_混合.png.”

單擊“確定”後,檔案選擇對話方塊視窗關閉,檔名和路徑在終端視窗中列印。

如何向linux shell指令碼新增gui

如果需要在任何進一步處理中使用檔名,可以將其捕獲到變數中,就像從日曆中獲取日期一樣。

檔案選擇對話方塊視窗:儲存檔案

如果新增一個選項,則可以將“檔案選擇”對話方塊視窗變成“檔案儲存”對話方塊視窗。選項是--save。我們還將使用--confirm overwrite選項。這將提示使用者確認要覆蓋現有檔案。

Resp***e=$(zenity --file-selection --save --confirm-overwrite); echo $Resp***e

如何向linux shell指令碼新增gui

將顯示“檔案儲存”對話方塊視窗。注意,有一個文字欄位,使用者可以在其中鍵入檔名。

如何向linux shell指令碼新增gui

使用者可以瀏覽到檔案系統中他選擇的位置,提供檔名,或者單擊現有檔案以覆蓋它。

如何向linux shell指令碼新增gui

在上面的示例中,使用者突出顯示了一個現有檔案。

當他單擊“確定”時,會出現一個確認對話方塊視窗,要求他確認是否要替換現有檔案。注意:檔名將出現在警告對話方塊中。正是這種對細節的關注賦予了zenity專業的外觀。

如果我們沒有使用--confirm overwrite選項,檔案將被自動覆蓋。

如何向linux shell指令碼新增gui

檔名儲存在變數響應中,該響應將列印到終端視窗。

如何向linux shell指令碼新增gui

通知對話方塊視窗

有了zenity,在指令碼中包含光滑的通知對話方塊視窗是很容易的。您可以呼叫stock對話方塊視窗為使用者提供資訊、警告、錯誤訊息和問題。

要建立錯誤訊息對話方塊視窗,請使用以下命令:

zenity --error --width 300 --text "Permission denied. Cannot write to the file."

我們使用的新選項有:

  • –錯誤:告訴zenity我們要使用錯誤對話方塊視窗。
  • –寬度:設定視窗的初始寬度。

如何向linux shell指令碼新增gui

錯誤對話方塊視窗以指定的寬度出現。它使用標準的GTK錯誤圖示。

如何向linux shell指令碼新增gui

要建立資訊對話方塊視窗,請使用以下命令:

zenity --info --width 300 --text "Update complete. Click OK to continue."

我們使用的新選項是--info,它告訴zenity建立一個資訊對話方塊視窗。

如何向linux shell指令碼新增gui

要建立問題對話方塊視窗,請使用以下命令:

zenity --question --width 300 --text "Are you happy to proceed?"; echo $?

我們使用的新選項是--question,它告訴zenity建立一個問題對話方塊視窗。

如何向linux shell指令碼新增gui

美元?是一個特殊引數。它儲存最近執行的前臺管道的返回值。一般來說,這是最近關閉的程序的值。零值表示“確定”,一個或多個值表示“取消”

這是一種可以應用於任何zenity對話方塊視窗的通用技術。透過在指令碼中檢查此值,可以確定是否應處理或忽略從對話方塊視窗返回的資料。

如何向linux shell指令碼新增gui

我們單擊了“是”,所以返回程式碼是一個零,表示“確定”

如何向linux shell指令碼新增gui

要建立警告對話方塊視窗,請使用以下命令:

zenity --warning --title "Low Hard Drive Space" --width 300 --text "There may not be enough hard drive space to save the backup."

我們使用的新選項是--warning,它告訴zenity建立一個警告對話方塊視窗。

如何向linux shell指令碼新增gui

出現警告對話方塊視窗。這不是問題,所以只有一個按鈕。

如何向linux shell指令碼新增gui

“進度”對話方塊視窗

您可以使用zenity progress對話方塊視窗來顯示一個進度條,該進度條指示指令碼的完成時間。

進度條將根據從指令碼傳入的值進行高階處理。要演示該原理,請使用以下命令:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done)

如何向linux shell指令碼新增gui

命令如下所示:

  • seq命令以10步為單位逐步執行從0到100的序列。
  • 在每個步驟中,值都儲存在變數i中。這將列印到終端視窗。
  • 由於sleep 1命令,該命令暫停一秒鐘。

我們可以使用zenity進度對話方塊視窗來演示進度條。注意,我們正在將上一個命令的輸出管道化到zenity中:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close

如何向linux shell指令碼新增gui

我們使用的新選項有:

  • –progress:告訴zenity我們要使用進度對話方塊視窗。
  • –自動關閉:當進度條達到100%時關閉對話方塊。

此時將顯示“進度”對話方塊視窗,條形圖將向100%前進,並在每個步驟之間暫停一秒鐘。

如何向linux shell指令碼新增gui

我們可以使用將值管道化到zenity的概念,在指令碼中包含進度對話方塊視窗。

在編輯器中輸入此文字並將其另存為“進度.sh.”

!/bin/bash function work-list () { echo "# First work item" echo "25" sleep 1 echo "# Second work item" echo "50" sleep 1 echo "# Third work item" echo "75" sleep 1 echo "# Last work item" echo "100" sleep 1 } work-list | zenity --progress --title "How-To Geek" --auto-close exit 0

下面是劇本的細目:

  • 這個指令碼定義了一個名為worklist的函式。這是你把你的命令和指示,以執行真正的工作。將每個sleep 1命令替換為真實的命令。
  • zenity接受回顯“#…”行,並在進度對話方塊視窗中顯示它們。更改這些行的文字,以便它們向用戶傳遞資訊性訊息。
  • 包含數字的回顯行(如回顯“25”)也被zenity接受並設定進度條的值。
  • 工作列表函式被呼叫並透過管道傳輸到zenity。

使用此命令使指令碼可執行:

chmod +x progress.sh

如何向linux shell指令碼新增gui

使用以下命令執行指令碼:

./progress.sh

如何向linux shell指令碼新增gui

指令碼執行,文字訊息隨著指令碼的每個階段的執行而改變。進度條以100%的步幅移動。

如何向linux shell指令碼新增gui

縮放對話方塊視窗

“縮放”對話方塊視窗允許使用者移動滑塊來選擇數值。這意味著她不能輸入太高或太低的值。

我們使用的新選項有:

  • –scale:告訴zenity我們要使用一個scale對話方塊視窗。
  • –最小值:設定刻度的最小值。
  • –最大值:設定刻度的最大值。
  • –步驟:設定使用箭頭鍵時滑塊的移動量。如果有人使用滑鼠,這不會影響滑塊的移動。
  • –value:設定滑塊的初始值和位置。

這是我們正在使用的命令:

Resp***e=$(zenity --scale --title "How-To Geek" --text "Select magnification." --min-value=0 --max-value=30 --step=3 --value15); echo $Resp***e

如何向linux shell指令碼新增gui

“滑塊”對話方塊窗口出現,滑塊設定為15。

如何向linux shell指令碼新增gui

使用者可以移動滑塊以選擇新值。

如何向linux shell指令碼新增gui

當她單擊“確定”時,值被傳輸到變數響應並列印到終端視窗。

如何向linux shell指令碼新增gui

輸入對話方塊視窗

輸入對話方塊視窗允許使用者輸入文字。

我們使用的新選項有:

  • –entry:告訴zenity我們要使用一個entry對話方塊視窗。
  • –輸入文字:如果要在文字輸入欄位中鍵入建議值,可以使用此選項。我們用“”強制一個空欄位。這不是嚴格要求的,但是我們想記錄下這個選項。

完整命令如下所示:

Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***e

如何向linux shell指令碼新增gui

將出現一個簡單的對話方塊視窗,其中包含一個文字輸入欄位。

如何向linux shell指令碼新增gui

有人可以輸入和編輯文字。

如何向linux shell指令碼新增gui

當他單擊“確定”時,他輸入的值被分配給變數響應。我們使用echo在終端視窗中列印變數的值。

如何向linux shell指令碼新增gui

把它們放在一起

讓我們把這些技術放在一起,建立一個函式指令碼。指令碼將執行硬體資訊掃描,並在滾動文字視窗中向用戶顯示結果。她可以選擇長掃描或短掃描型別。

對於這個指令碼,我們將使用三種類型的對話方塊視窗,其中兩種對我們來說是新的:

  • 第一個是列表對話方塊視窗。它允許人們做出選擇。
  • 第二個是一個進度對話方塊視窗,讓使用者知道發生了什麼,她應該等待。
  • 第三個是文字資訊視窗,向用戶顯示結果。

在編輯器中輸入此文字並將其另存為“硬體”-資訊.sh.”

#!/bin/bash # Display hardware listing for this computer TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"` if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi # search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile} # Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}" exit 0

使用此命令使其可執行:

chmod +x hardware-info.sh

如何向linux shell指令碼新增gui

此指令碼建立一個臨時檔案,檔名儲存在TempFile變數中:

TempFile=$(mktemp)

指令碼使用--list選項建立一個稱為list對話方塊視窗的zenity對話方塊視窗。行尾的“\”字元告訴指令碼將它們視為一條環繞的長線。過程如下:

  • 我們指定視窗的寬度和高度。
  • 列表對話方塊視窗支援列。--radiolist選項使第一列成為單選按鈕列。
  • 我們為視窗設定標題和文字提示。
  • 我們將第一列的標題設定為“選擇”。此列的內容將是單選按鈕。
  • 我們將第二列的標題設定為“Select”,並提供第二列的內容。此列包含兩個文字標籤:“Short”和“Long”。TRUE和FALSE指示符表示在出現對話方塊視窗時預設選中“Short”選項。
  • 我們將這個對話方塊視窗的結果儲存在一個名為ListType的變數中。
ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"`

如果使用者按下“Cancel”,我們不需要檢查ListType中的值,我們可以簡單地退出。如果他按“確定”,我們需要知道他是選擇了“短”還是“長”單選按鈕:

  • 特殊引數$?如果使用者按“確定”,則等於零;如果使用者按“取消”或關閉視窗,則等於1。
  • 如果它等於1,指令碼將顯示一個錯誤資訊對話方塊視窗並退出。如果他按“OK”,我們將繼續測試ListType變數中的值。
  • 如果ListType變數的值為“Short”,則指令碼會將名為Flag的變數設定為等於“–Short”
  • 如果ListType變數不包含值“Short”,則必須包含值“Long”。指令碼將名為Flag的變數設定為等於“”,這是一個空字串。
  • 指令碼將在下一節中使用Flag變數。
if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi

既然指令碼知道使用者需要哪種型別的掃描,我們就可以執行硬體資訊掃描:

  • 指令碼呼叫hwinfo命令並將Flag變數中的值傳遞給它。
  • 如果標誌包含“-short”,hwinfo命令將執行短掃描。如果Flag的值為“”,則不向hwinfo傳遞任何資訊,並且執行預設的長掃描。
  • 該指令碼將hwinfo的輸出透過管道傳輸到tee中。tee將輸出傳送到zenity和TempFile中。
  • 指令碼將建立一個進度條對話方塊視窗。它設定對話方塊視窗的寬度和高度,以及標題和提示文字。
  • 指令碼無法預先知道hwinfo命令將產生多少資訊,因此無法將進度條正確設定為100%。--pulsate選項使“進度”對話方塊顯示移動指示器。這會通知使用者發生了什麼,他應該等待。
  • 如果有人單擊“取消”,則--auto kill選項將終止指令碼
  • --auto-close選項使進度對話方塊在其監視的程序完成時自動關閉。
# search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile}

當hwinfo掃描完成時,指令碼呼叫zenity建立一個帶有--text info選項的文字資訊對話方塊視窗。文字資訊對話方塊視窗顯示TempFile檔案的內容:

  • 指令碼設定對話方塊視窗的寬度和高度以及標題文字。
  • --flename選項用於讀取TempFIle變數中儲存的檔案的內容。
# Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}"

當用戶關閉文字資訊對話方塊視窗時,指令碼退出。

exit 0

我們把它點燃看看。

./hardware-info.sh

如何向linux shell指令碼新增gui

將顯示列表框。預設情況下選擇“Short”選項。

如何向linux shell指令碼新增gui

讓我們選擇“Long”,然後單擊“OK”

如何向linux shell指令碼新增gui

“進度”視窗將顯示一個滑動指示器。在硬體掃描完成之前,它一直顯示在螢幕上。

如何向linux shell指令碼新增gui

硬體掃描完成後,將顯示文字資訊對話方塊視窗,其中包含掃描的詳細資訊。

如何向linux shell指令碼新增gui

單擊“確定”

即使是一個死硬的命令列騎師也不得不承認,幾個GUI對話方塊視窗可以讓一個不起眼的Bash指令碼有一種專業的感覺。

 

  • 發表於 2021-04-03 07:01
  • 閱讀 ( 48 )
  • 分類:網際網路

你可能感興趣的文章

使用簡單的shell指令碼修復html格式

...補補,你會喜歡shell指令碼,因為總是有調整要做。關於如何使用這些模式作為其他指令碼的基礎的一些想法包括: ...

  • 發佈於 2021-03-13 00:12
  • 閲讀 ( 47 )

什麼是shell指令碼,為什麼要使用它

... 如何執行shell指令碼?很簡單。只需將指令碼路徑作為引數傳遞給shell: ...

  • 發佈於 2021-03-13 04:53
  • 閲讀 ( 54 )

頂級網站和書籍,讓您成為linux命令列英雄

...bash是什麼、不同的模式(互動式和非互動式)以及它是如何產生的基礎知識開始,這個站點提供了一個全面的背景知識來幫助您理解命令列的機制。 ...

  • 發佈於 2021-03-14 07:04
  • 閲讀 ( 58 )

在linux中如何方便地在文件格式之間轉換

...注意上面的參考檔案中配置的字型(標題1為Arial Black等)如何顯示在下面的轉換檔案中。您可以根據需要建立任意數量的這些引用檔案(例如,每個客戶機一個)。然後在編寫時完全忽略格式,並在轉換時一步應用樣式。 ...

  • 發佈於 2021-03-14 18:46
  • 閲讀 ( 75 )

如何使用applescript將bash指令碼轉換為可單擊的應用程式

...為輸入執行它。這些特殊的應用程式被稱為水滴。下面是如何建立一個: ...

  • 發佈於 2021-03-21 09:39
  • 閲讀 ( 51 )

在linux中,“bash”是什麼意思?

...在這篇短文中,我們將探討Bash是什麼,它做什麼,以及如何開始使用它。 ...

  • 發佈於 2021-03-28 13:14
  • 閲讀 ( 61 )

哪個linux shell最好?比較了5種常見的貝殼

...你的計算機需要一個翻譯層。這介於你告訴它做什麼和它如何理解之間。 ...

  • 發佈於 2021-03-30 18:45
  • 閲讀 ( 49 )

如何使用受限shell來限制linux使用者可以做什麼

...改其目錄,您可以控制他們可以訪問哪些命令。下面介紹如何在Linux上設定受限shell。 受限炮彈 受限shell不是另一個shell。這是標準外殼的另一種模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下啟動。在本文中,我們將...

  • 發佈於 2021-03-31 10:57
  • 閲讀 ( 55 )

如何使用chsh在linux上更改預設shell

Bash不是唯一的Linux shell。很容易嘗試其他的shell,比如非常流行的Zsh。找到一個您喜歡的shell後,使用chsh命令將其設定為預設shell。我們會教你怎麼做。 為什麼貝殼很重要 shell位於您和作業系統之間。它在終端視窗內提供環境...

  • 發佈於 2021-04-02 06:04
  • 閲讀 ( 64 )

如何在linux上的bash中設定環境變數

Linux上有多種型別的環境變數。瞭解如何檢視它們,為本地和遠端登入建立它們,並使它們在重新啟動後仍然有效。 環境變數的工作原理 啟動終端視窗及其內部的shell時,會引用一組變數,以確保shell配置正確。這些變數還確...

  • 發佈於 2021-04-02 06:44
  • 閲讀 ( 57 )
m27674624
m27674624

0 篇文章

作家榜

  1. admin 0 文章
  2. 孫小欽 0 文章
  3. JVhby0 0 文章
  4. fvpvzrr 0 文章
  5. 0sus8kksc 0 文章
  6. zsfn1903 0 文章
  7. w91395898 0 文章
  8. SuperQueen123 0 文章

相關推薦