import tkinter
import subprocess
import os
import time
import re
import sys
from tkinter import Label, Button, StringVar
from tkinter.messagebox import * MGR_FILE = "manage.py"
MGR_DIR = "your Django project root directory" # Django项目根目录
MGR_PATH = os.path.join(MGR_DIR, MGR_FILE) root = tkinter.Tk()
setWidth, setHeight = root.maxsize()
root.geometry('320x220+%d+%d' % ((setWidth-320)/2, (setHeight)/2-220))
root.title('运行助手')
root.resizable(width=False, height=False) def open_explo(url):
subprocess.Popen('chrome %s' % url) def find_process():
proc = subprocess.Popen('netstat -ano | findstr "8000"', shell=True, stdout=subprocess.PIPE).stdout.read()
return proc def kill_process(res:str):
try:
pid_value = re.findall(r'LISTENING\s+?(\d+)', res.decode())[0]
except:
if "TIME_WAIT" in res.decode():
showwarning(title='提示信息', message='8000 端口未完全释放,请稍候重试。')
else:
showwarning(title='提示信息', message='Error: 未知错误')
root.destroy()
sys.exit(0)
subprocess.Popen('taskkill /F /pid %s' % pid_value, shell=True, stdout=subprocess.PIPE) def check_btn():
if bvar1.get()=="停止":
button_index.config(state=tkinter.ACTIVE)
button_admin.config(state=tkinter.ACTIVE)
else:
button_index.config(state=tkinter.DISABLED)
button_admin.config(state=tkinter.DISABLED)
root.update() def state_sw():
if switch_btn['text'] != "停止":
run_shell('python manage.py runserver')
bvar1.set('停止')
switch_btn['background'] = "#32A084"
# showinfo(title='提示信息', message='开始运行')
bottom_message['text'] = "开始运行"
check_btn()
time.sleep(0.5)
bottom_message['text'] = "服务已启动"
else:
if askyesno('操作提示', '是否停止服务?', default='no'):
search_res = find_process()
if search_res:
kill_process(search_res)
bvar1.set('运行')
bottom_message['text'] = "停止服务"
check_btn()
switch_btn['background'] = "#EBEDEF"
time.sleep(0.5)
bottom_message['text'] = "就绪"
else:
bottom_message['text'] = "未就绪"
showwarning(title='提示信息', message='服务进程不存在!')
bvar1.set('运行')
bottom_message['text'] = "就绪"
check_btn()
switch_btn['background'] = "#EBEDEF" def run_shell(run_param):
mark = time.strftime('RA+%Y%m%d %H:%M:%S', time.localtime()) # 用于进程名称的特征字符串,方便过滤
cmd = 'start run_assistant.bat "%s" %s' % (mark, run_param)
console = subprocess.Popen(cmd, shell=True)
if run_param == "python manage.py runserver":
return
root.withdraw()
console.wait()
while True:
task_info = subprocess.Popen('tasklist /V | findstr /C:"%s"' % mark, shell=True, stdout=subprocess.PIPE)
if not task_info.stdout.read():
root.deiconify()
break bvar1 = StringVar()
bvar1.set('运行') label1 = Label(root, text='web服务',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
switch_btn = Button(root, textvariable=bvar1,background='#EBEDEF',command=state_sw)
label1.grid(row=0,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
switch_btn.grid(row=0,column=5,padx=30,pady=10,ipadx=5,ipady=2) label2 = Label(root, text='管理终端',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
button2 = Button(root, text='运行',background='#EBEDEF',command=lambda:run_shell('python manage.py shell'))
label2.grid(row=1,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
button2.grid(row=1,column=5,padx=30,pady=10,ipadx=5,ipady=2) label3 = Label(root, text='数据库终端',width=25,borderwidth=2,relief='groove',background='#f60',foreground='white')
button3 = Button(root, text='运行',background='#EBEDEF',command=lambda:run_shell('python manage.py dbshell'))
label3.grid(row=3,column=0,columnspan=5,padx=15,pady=10,ipadx=5,ipady=6)
button3.grid(row=3,column=5,padx=30,pady=10,ipadx=5,ipady=2) button_index = Button(root, text='首页',command=lambda:open_explo('127.0.0.1:8000/index'))
button_index.grid(row=4,column=3,padx=10,ipadx=5,ipady=2)
button_admin = Button(root, text='控制台',command=lambda:open_explo('127.0.0.1:8000/admin'))
button_admin.grid(row=4,column=4,ipady=2) bottom_message = Label(foreground='blue',width=36,anchor='w',font=('Arial', 8))
bottom_message.grid(row=5,column=0,columnspan=6,padx=15,ipadx=5,sticky='W') ifSetup = find_process()
check_btn()
if ifSetup:
root.withdraw()
if askyesno(title='提示信息', message='8000 端口已被占用,是否帮您停止对应服务?'):
kill_process(ifSetup)
bottom_message['text'] = "就绪"
else:
switch_btn.config(state=tkinter.DISABLED)
bottom_message['text'] = "未就绪"
root.deiconify() if __name__ == '__main__':
root.mainloop()

run_assistant.bat文件:

 @echo off
:: %pyenv% 为python虚拟环境根目录
cd "%pyenv%\Scripts"
call activate.bat
:: %project% 为Django项目根目录
cd "%project%"
:: %2 %3 %4 接收的3个参数为要执行的命令行语句
%2 %3 %4

界面截图:

Python-使用tkinter实现的Django服务进程管理工具的更多相关文章

  1. Python学习(四十三)—— Djago-admin管理工具

    一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  2. Django admin 管理工具

    admin 组件的使用 Django 提供了基于 web 的管理工具.Django 自动管理工具是 django.contrib 的一部分. INSTALLED_APPS = [ 'django.co ...

  3. Django——admin管理工具

    一.admin组件使用 Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.你可以在项目的 settings.py 中的 INSTAL ...

  4. 吴裕雄--天生自然Django框架开发笔记:Django Admin 管理工具

    Django 提供了基于 web 的管理工具. Django 自动管理工具是 django.contrib 的一部分.可以在项目的 settings.py 中的 INSTALLED_APPS 看到它: ...

  5. Python开发程序:简单主机批量管理工具

    题目:简单主机批量管理工具 需求: 主机分组 登录后显示主机分组,选择分组后查看主机列表 可批量执行命令.发送文件,结果实时返回 主机用户名密码可以不同 流程图: 说明: ### 作者介绍: * au ...

  6. python之tkinter使用-Grid(网格)布局管理器

    # 使用tkinter编写登录窗口 # Grid(网格)布局管理器会将控件放置到一个二维的表格里,主控件被分割为一系列的行和列 # stricky设置对齐方式,参数N/S/W/E分别表示上.下.左.右 ...

  7. 每日一问:Python生成器和迭代器,with上下文管理工具

    1.生成器: 1.1 起源: 如果列表中有一万个元素,我们只想要访问前面几个元素,对其进行相关操作,通过for循环方式效率太低,并且后面的元素会浪费内存,还会受到内存限制,所以产生生成器来解决这个问题 ...

  8. Django项目实践4 - Django网站管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

  9. Django项目实践4 - Django站点管理(后台管理员)

    http://blog.csdn.net/pipisorry/article/details/45079751 上篇:Django项目实践3 - Django模型 Introduction 对于某一类 ...

随机推荐

  1. Java实现 LeetCode 473 火柴拼正方形

    473. 火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到 ...

  2. Java实现 蓝桥杯VIP 算法训练 暗恋

    算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...

  3. Java实现 蓝桥杯VIP 算法提高 连接乘积

    算法提高 连接乘积 时间限制:1.0s 内存限制:256.0MB 问题描述 192这个数很厉害,用它分别乘以1.2.3,会得到: 192 x 1 = 192 192 x 2 = 384 192 x 3 ...

  4. Java实现 LeetCode 61 旋转链表

    61. 旋转链表 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: 1->2->3->4->5->NULL, k = ...

  5. java实现最大连续和问题

    /* 10 5 -3 12 -31 15 22 -7 6 -8 -9 10 .... 暴力:O(n^3) 分治:[ mid ) 三种情况求最大 基线法: O(n) 2个数组: 从左到本位:出现的最大累 ...

  6. Java实现三人年龄

    2 三人年龄 三个神秘蒙面人来访F博士. 博士询问他们年龄时,他们说:我们中年龄最小的不超过19岁.我们3人年龄总和为70岁.且我们三人年龄的乘积是所有可能情况中最大的. 请帮助F博士计算他们的年龄, ...

  7. java实现第六届蓝桥杯表格计算

    表格计算 某次无聊中, atm 发现了一个很老的程序.这个程序的功能类似于 Excel ,它对一个表格进行操作. 不妨设表格有 n 行,每行有 m 个格子. 每个格子的内容可以是一个正整数,也可以是一 ...

  8. 1.4 Spring 依赖注入(DI)和控制反转(IOC)详解

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html 1.1  Spring 依赖注 ...

  9. Spting:基于注解的组件化管理

    @Component,@Controller(控制层),@Service(业务层),@Repository(持久层) 以上四个注解的功能完全相同,不过在实际开发中,要在不同功能的类上加上响应的注解 1 ...

  10. 2019-02-09 python爬取mooc视频项目初级简单版

    今天花了一下午时间来做这东西,之前没有自己写过代码,50几行的代码还是查了很多东西啊,果然学起来和自己动起手来完全是两码事. 方案:requests库+正则表达式提取视频下载链接+urlretriev ...