利用PythonQT,定制服务器启动工具

在开发过程中经常需要修改游戏服务器的各种配置参数,以方便在冒烟环境,开发环境和预发布环境中进行调试。我们以前使用ini文件进行服务器配置,所以经常需要关掉服务器,修改ini文件,然后再重新把服务器拉起来。最近有点时间,就开始考虑做个服务器启动小工具,能方便服务器在不同环境下的部署。

 

开始想用QT来写这个小工具,但发现建立一个QT工程其实有点小麻烦,后来干脆使用PythonQT来做。一个100多行的小脚本就能满足需求,以后交给其他人扩展功能也很方便。

 

主要是想做两个功能

1:可以方便的对服务器在不同环境下进行部署

2:可以在服务器启动时设置系统时间,因为经常需要测试一些时间性的业务。比如元旦节的活动。以前都是通过改操作系统时间来测的,这样每台机器就只能启动一个服务器了,如果想测两个不同时间的业务,就要多找一台机器。

 

                                                    image

 

下面是代码,可以很简单的修改成自己需要的工具

#!/usr/bin/python
 #-*- coding: utf-8 -*-

"""
ZetCode PyQt4 tutorial 

In this example, we create a skeleton
of a calculator using a QtGui.QGridLayout.

author: Jan Bodnar
website: zetcode.com 
last edited: October 2011
"""

import sys
import time
import threading

from PyQt4 import QtGui,QtCore

from xml.dom.minidom import parse,parseString
import os

version = u"服务器启动工具 V0.1"

class CommandThread(threading.Thread):
    def setCommand(self,command):
        self.command = command
        
    def run(self):
        os.system(self.command)
 
class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
        
        self.initUI()
        
    def initUI(self):
        label1  = QtGui.QLabel(self)
        label1.setText(u'选择服务器执行文件')
        label1.move(20,20)

        label2  = QtGui.QLabel(self)
        label2.setText(u'选择服务器启动配置')
        label2.move(20,80) 
        
        label3  = QtGui.QLabel(self)
        label3.setText(u'选择服务器启动时间')
        label3.move(20,150)  
        
        self.label4  = QtGui.QLabel(self)
        self.label4.setText(u'差异时间')
        self.label4.move(120,365) 
        
        self.text_serverbin = u"未选择文件"    
        self.label_serverfilename = QtGui.QLabel(self)
        self.label_serverfilename.setText(self.text_serverbin)
        self.label_serverfilename.move(20,50)
        
        btn_selserverbin = QtGui.QPushButton('...',self)
        btn_selserverbin.setGeometry(270,45,20,20)
        btn_selserverbin.clicked[bool].connect(self.event_selserverbin)
        
        self.dlg_selserverbin = QtGui.QFileDialog(self)
        
        #配置选择
        combo_serverConfig = QtGui.QComboBox(self)        
        xml_file = "./Data/Config/ServerConfig.xml"
        doc = parse(xml_file)
        serverConfig = doc.getElementsByTagName("serverConfig")
    
        for config in serverConfig:
            descript = config.getAttribute("description")
            index = config.getAttribute("index")        
            combo_serverConfig.addItem(descript,index)
       
        combo_serverConfig.move(20,100)
        combo_serverConfig.activated[int].connect(self.event_selserverconfig)
        self.serverconfigindex = 0
       
       #日历
        timer=QtCore.QTimer(self)
        timer.start(60000) 
        self.connect(timer,QtCore.SIGNAL("timeout()"),self.event_update)
        
        self.cal_serverdate = QtGui.QCalendarWidget(self)
        self.cal_serverdate.setGridVisible(True)
        self.cal_serverdate.move(20, 180)
        self.cal_serverdate.clicked[QtCore.QDate].connect(self.event_selserverdate)
        self.seldate = QtCore.QDate.currentDate();
        
        self.time_servertime = QtGui.QTimeEdit(self)
        self.time_servertime.move(20, 360)
        self.time_servertime.setTime(QtCore.QTime.currentTime())
        self.time_servertime.timeChanged.connect(self.event_selservertime)
        self.seltime = QtCore.QTime.currentTime();
       
    
        btn_start = QtGui.QPushButton(u'启动服务器',self);
        btn_start.move(180,420)
        btn_start.clicked.connect(self.start_server)
        btn_close = QtGui.QPushButton(u'退出',self);
        btn_close.move(260,420)
        btn_close.clicked.connect(self.close)
        
        self.setGeometry(300, 300,350,450)
        self.setWindowTitle(version)    
        self.show()
        
    def event_selserverbin(self, clicked):
        self.text_serverbin = self.dlg_selserverbin.getOpenFileName(self,
                        "Open EXE", "", "EXE Files (*.exe)");
        
        self.label_serverfilename.setText(self.text_serverbin)
        self.label_serverfilename.adjustSize()
        
    def event_selserverconfig(self,selindex):
        self.serverconfigindex = selindex
    
    def event_selserverdate(self,date):
        self.seldate = date 
        self.update_deltaTime()   

    def event_selservertime(self,time):
        self.seltime = time 
        self.update_deltaTime()                        
   
    def event_update(self):
        self.time_servertime.setTime(QtCore.QTime.currentTime())
        
    def update_deltaTime(self):
        currentDateTime     = QtCore.QDateTime()
        currentDateTime.setDate(QtCore.QDate.currentDate());
        currentDateTime.setTime(QtCore.QTime.currentTime());
        
        selDateTime         = QtCore.QDateTime()
        selDateTime.setDate(self.seldate)
        selDateTime.setTime(self.seltime)
        
        self.label4.setText(u'差异时间: '  +
            str(currentDateTime.secsTo(selDateTime)) + u'秒')
        
        self.label4.adjustSize()
    
    def start_server(self):
        serverfilename      = self.label_serverfilename.text()
        serverconfigindex   = self.serverconfigindex
        
        currentDateTime     = QtCore.QDateTime()
        currentDateTime.setDate(QtCore.QDate.currentDate());
        currentDateTime.setTime(QtCore.QTime.currentTime());
        
        selDateTime         = QtCore.QDateTime()
        selDateTime.setDate(self.seldate)
        selDateTime.setTime(self.seltime)
        
        command = str(serverfilename)
        command += ' -c ' + str(serverconfigindex)   
        command += ' -t ' + str(currentDateTime.secsTo(selDateTime))
        
       # print command
        commandTD = CommandThread()
        commandTD.setDaemon(True)
        commandTD.setCommand(command)        
        commandTD.start()
    
def main():
    app = QtGui.QApplication(sys.argv)
    ex  = Example()    
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

上面的小工具在启动服务器时是阻塞式的,一旦服务器启动,小工具就会处于假死阶段,直到关闭服务器。

可以使用Thread库,建立一个线程来启动服务器即可。

 

最后使用py2exe ,把上述脚本编译成EXE后就可以在团队内部发布了。热烈的笑脸

转载于:https://www.cnblogs.com/badkeeper/articles/2311227.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值