Python-使用tkinter實現的Django服務進程管理工具

来源:https://www.cnblogs.com/ywfft/archive/2020/06/02/a20200531.html
-Advertisement-
Play Games

1 import tkinter 2 import subprocess 3 import os 4 import time 5 import re 6 import sys 7 from tkinter import Label, Button, StringVar 8 from tkinter. ...


  1 import tkinter
  2 import subprocess
  3 import os
  4 import time
  5 import re
  6 import sys
  7 from tkinter import Label, Button, StringVar
  8 from tkinter.messagebox import *
  9 
 10 
 11 MGR_FILE = "manage.py"
 12 MGR_DIR = "your Django project root directory" # Django項目根目錄
 13 MGR_PATH = os.path.join(MGR_DIR, MGR_FILE)
 14 
 15 
 16 root = tkinter.Tk()
 17 setWidth, setHeight = root.maxsize()
 18 root.geometry('320x220+%d+%d' % ((setWidth-320)/2, (setHeight)/2-220))
 19 root.title('運行助手')
 20 root.resizable(width=False, height=False)
 21 
 22 
 23 def open_explo(url):
 24     subprocess.Popen('chrome %s' % url)
 25 
 26 
 27 def find_process():
 28     proc = subprocess.Popen('netstat -ano | findstr "8000"', shell=True, stdout=subprocess.PIPE).stdout.read()
 29     return proc
 30 
 31 
 32 def kill_process(res:str):
 33     try:
 34         pid_value = re.findall(r'LISTENING\s+?(\d+)', res.decode())[0]
 35     except:
 36         if "TIME_WAIT" in res.decode():
 37             showwarning(title='提示信息', message='8000 埠未完全釋放,請稍候重試。')
 38         else:
 39             showwarning(title='提示信息', message='Error: 未知錯誤')
 40         root.destroy()
 41         sys.exit(0)
 42     subprocess.Popen('taskkill /F /pid %s' % pid_value, shell=True, stdout=subprocess.PIPE)
 43 
 44 
 45 def check_btn():
 46     if bvar1.get()=="停止":
 47         button_index.config(state=tkinter.ACTIVE)
 48         button_admin.config(state=tkinter.ACTIVE)
 49     else:
 50         button_index.config(state=tkinter.DISABLED)
 51         button_admin.config(state=tkinter.DISABLED)
 52     root.update()
 53 
 54 
 55 def state_sw():
 56     if switch_btn['text'] != "停止":
 57         run_shell('python manage.py runserver')
 58         bvar1.set('停止')
 59         switch_btn['background'] = "#32A084"
 60         # showinfo(title='提示信息', message='開始運行')
 61         bottom_message['text'] = "開始運行"
 62         check_btn()
 63         time.sleep(0.5)
 64         bottom_message['text'] = "服務已啟動"
 65     else:
 66         if askyesno('操作提示', '是否停止服務?', default='no'):
 67             search_res = find_process()
 68             if search_res:
 69                 kill_process(search_res)
 70                 bvar1.set('運行')
 71                 bottom_message['text'] = "停止服務"
 72                 check_btn()
 73                 switch_btn['background'] = "#EBEDEF"
 74                 time.sleep(0.5)
 75                 bottom_message['text'] = "就緒"
 76             else:
 77                 bottom_message['text'] = "未就緒"
 78                 showwarning(title='提示信息', message='服務進程不存在!')
 79                 bvar1.set('運行')
 80                 bottom_message['text'] = "就緒"
 81                 check_btn()
 82                 switch_btn['background'] = "#EBEDEF"
 83 
 84 
 85 def run_shell(run_param):
 86     mark = time.strftime('RA+%Y%m%d %H:%M:%S', time.localtime()) # 用於進程名稱的特征字元串,方便過濾
 87     cmd = 'start run_assistant.bat "%s" %s' % (mark, run_param)
 88     console = subprocess.Popen(cmd, shell=True)
 89     if run_param == "python manage.py runserver":
 90         return
 91     root.withdraw()
 92     console.wait()
 93     while True:
 94         task_info = subprocess.Popen('tasklist /V | findstr /C:"%s"' % mark, shell=True, stdout=subprocess.PIPE)
 95         if not task_info.stdout.read():
 96             root.deiconify()
 97             break
 98 
 99 
100 bvar1 = StringVar()
101 bvar1.set('運行')
102 
103 label1 = Label(root, text='web服務',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
104 switch_btn = Button(root, textvariable=bvar1,background='#EBEDEF',command=state_sw)
105 label1.grid(row=0,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
106 switch_btn.grid(row=0,column=5,padx=30,pady=10,ipadx=5,ipady=2)
107 
108 label2 = Label(root, text='管理終端',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
109 button2 = Button(root, text='運行',background='#EBEDEF',command=lambda:run_shell('python manage.py shell'))
110 label2.grid(row=1,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
111 button2.grid(row=1,column=5,padx=30,pady=10,ipadx=5,ipady=2)
112 
113 label3 = Label(root, text='資料庫終端',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
114 button3 = Button(root, text='運行',background='#EBEDEF',command=lambda:run_shell('python manage.py dbshell'))
115 label3.grid(row=3,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
116 button3.grid(row=3,column=5,padx=30,pady=10,ipadx=5,ipady=2)
117 
118 button_index = Button(root, text='首頁',command=lambda:open_explo('127.0.0.1:8000/index'))
119 button_index.grid(row=4,column=3,padx=10,ipadx=5,ipady=2)
120 button_admin = Button(root, text='控制台',command=lambda:open_explo('127.0.0.1:8000/admin'))
121 button_admin.grid(row=4,column=4,ipady=2)
122 
123 bottom_message = Label(foreground='blue',width=36,anchor='w',font=('Arial', 8))
124 bottom_message.grid(row=5,column=0,columnspan=6,padx=15,ipadx=5,sticky='W')
125 
126 ifSetup = find_process()
127 check_btn()
128 if ifSetup:
129     root.withdraw()
130     if askyesno(title='提示信息', message='8000 埠已被占用,是否幫您停止對應服務?'):
131         kill_process(ifSetup)
132         bottom_message['text'] = "就緒"
133     else:
134         switch_btn.config(state=tkinter.DISABLED)
135         bottom_message['text'] = "未就緒"
136     root.deiconify()
137 
138 
139 if __name__ == '__main__':
140     root.mainloop()

run_assistant.bat文件:

1 @echo off
2 :: %pyenv% 為python虛擬環境根目錄
3 cd "%pyenv%\Scripts"
4 call activate.bat
5 :: %project% 為Django項目根目錄
6 cd "%project%"
7 :: %2 %3 %4 接收的3個參數為要執行的命令行語句
8 %2 %3 %4

界面截圖:


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 深克隆和淺克隆 淺克隆 arr.slice(0) arr.concat() let obj2 = {... obj} 深克隆 function deepClone(obj){ //判斷參數是不是一個對象 let objClone = new obj.constructor(); if(obj && ...
  • 前端的前景怎麼樣,以下是我的分享: 隨著互聯網的高速發展,不知不覺中我們的生活已被互聯網從四面八方給包圍,不管是網上點餐,網上購物、網上購票,還是網上學習,這都表明瞭現在就是互聯網的天下。因此,也就越來越多的選擇互聯網行業,選擇學習前端開發,但是大家也有擔心的問題,最近幾年web前端發展趨勢良好,但 ...
  • HTTP 請求中,空格應該被編碼為什麼?今天我們走進 RFC 文檔和 W3C 文檔,瞭解一下這個「史詩級」大坑。 ...
  • 面向介面編程能非常有效地提高代碼質量,可以將介面和實現相分離,封裝不穩定的實現,暴露穩定的介面。上游系統面向介面而非實現編程,不依賴不穩定的實現細節,這樣當實現發生變化的時候,上游系統的代碼基本上不需要做改動,以此來降低耦合性,提高擴展性。 ...
  • 背景 最近瞭解到很多朋友對限流、熔斷、降級、隔離、超時重試的概念和應用場景理解的不是很到位,所以想用五篇的篇幅稍微系統的介紹一下。 本篇是第一篇,是限流做詳解,如果反饋好的話,我會繼續寫下麵四篇。不好的話就算了,算我理解不夠,再自己總結總結。 限流的概念 有朋友問我限流和熔斷有什麼區別,我的理解很簡 ...
  • 老孟導讀:歷時1年的時間,整理完成了330+組件的詳細用法,不僅包含UI組件,還包含了功能性的組件。 雖然整理了 330+的組件基本用法,但並不是讓你每一個都學習一遍,任何技術基本都是掌握 20%就可以解決 80%的問題,因此只需學會基礎組件就可以上手項目了,至於其他的控制項只需大概瀏覽一下,做項目的 ...
  • 19. 文件讀寫 19.1 文件操作 數據持久化,是將程式中的對象以數據的方式保存到磁碟上,在程式下次運行時,可以將數據從磁碟上恢復到記憶體中。數據持久化的方式有很多,而最為常見的方式是將數據以文件的形式保存。在Python中,可以通過內置函數的方法進行文件的讀、寫、刪除等操作。 19.1.1 文件的 ...
  • 18.目錄與文件 18.1 os和shutil 日常使用過程中,難免需要使用跟文件系統相關的標準庫。在使用Python文件系統中,常用的庫為os和shutil標準庫,方法如下所示: import os import shutil 18.1.1 遍歷文件夾 os.getcwd():獲取當前工作目錄,返 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...