python Tkinter实践:输入站码输出信息

在工作过程中发现站码,车道,联系人,IP等信息都是在excel,数据库或者纸质保存,且数据各为孤岛,查询起来不太方便,因此我用python字典结合tkinter开发出一个小脚本,后面又用pyinstaller 转换成exe程序(博文在此),这样一来就可以方便快捷的一键查询了

闲话少说,代码如下

# -*- coding: UTF-8 -*-
##########################################################################
# SCRIPT_NAME     : FindStation.py
# CREATE_TIME     : 2019/09/09
# AUTHOR          : Mochou
# DESCRIBETION    : make station's message find get easy
# PARAMETER       : need input station
# UPDATE_RECORD   : change run_way from write to input and kill some bugs
#
# DATE      OPERATION       CZR         DESCRIBETION              
# ________  _____________   ________    __________________________________
#
# 2019/09/09  UPDATE Mochou  
##########################################################################

import os as os
import codecs
import time
import re
from tkinter import *
import subprocess
import threading

# 读取站名,类型强转
# station = input("请输入站码、站名或拼音: ")

def btn_click():
     
    # 建立字典映射     
    # 站码
    dict_num = {
		'111':['地球站','11.11.11.11','奥特曼','123456789','银河处','NO'],
		'222':['火星站','22.22.22.22','钢铁侠','987654321','银河处','YES']
        }
    
    # 站中文名称
    dict_str = {
		'地球站':['111','11.11.11.11','奥特曼','123456789','银河处','NO'],
		'火星站':['222','22.22.22.22','钢铁侠','987654321','银河处','YES']
        }
    
    # 站码拼音
    dict_word = {
		'diqiu':['111','地球站','11.11.11.11','奥特曼','123456789','银河处','NO'],
		'huoxing':['222','火星站','22.22.22.22','钢铁侠','987654321','银河处','YES']
    }
    # 对错误站名做异常处理
    try:
        # 判断是站码、名称还是拼音
        # 使局部变量高可用
        global station
        station = ipText.get()
        # 正则表达式,匹配带数字的
        pattern1 = re.compile('[0-9]+')
        match_num = pattern1.findall(station)
        pattern2 = re.compile('[a-z]+')
        match_word = pattern2.findall(station)
        # 站码
        if match_num:
            num1 = station 
            servername = dict_num[num1][0]
            dbip = dict_num[num1][1]
            linkman = dict_num[num1][2]
            linkphone = dict_num[num1][3]
            location1 = dict_num[num1][4]
            bool1 = dict_num[num1][5]            
        # 拼音
        elif match_word:
            num1 = dict_word[station][1]
            servername = dict_word[station][0]
            dbip = dict_word[station][2]
            linkman = dict_word[station][3]
            linkphone = dict_word[station][4]
            location1 = dict_word[station][5]
            bool1 = dict_word[station][6]
        # 中文名称
        else:
            num1 = dict_str[station][0]
            servername = station
            dbip = dict_str[station][1]
            linkman = dict_str[station][2]
            linkphone = dict_str[station][3]
            location1 = dict_str[station][4]
            bool1 = dict_str[station][5] 
                    
        ip11 = "银河处仙女处"
        ip22 = "大熊处"
        tips = "该站位于11和22服务器,传输标志位flag2=1"
        # 判断IP归属哪个服务器
        if location1 in ip11:
            tips = "该站位于11服务器,传输标志位flag1=1"
        elif location1 in ip22:
            tips = "该站位于22服务器,传输标志位flag3=1"
        else:
            tips = tips
        # tk的语句插入    
        text.insert(INSERT,("路站码:%s\n路站名:%s\n服务器:%s\n联系人:%s\n手机号:%s\n归属地:%s\n主副站:%s\n其他信息:%s\n\n" % 
                        (num1,servername,dbip,linkman,linkphone,location1,bool1,tips))) 
    except KeyError:
        print ("Error:未找到该站,请查证")
        text.insert(INSERT,("未找到该站,请确认!\n"))

    # 实现对网络的ping测试 
    v = dbip 
    thread_id = []
    j = 1
    # 如果未ping通,重试多少次,这里也可以用字符串组合来ping网段
    for i in range(1):
        loop = v 
        thread_id.append(0)
        # Ping类里有两个参数str_ip,sleep_time
        thread_id[i] = Ping(loop, int(j/20))
        # 开始调用
        thread_id[i].start()
        i = i + 1
        j = j + 10

# enter调用
def btn_click_enter(self):
    btn_click()

# 清空消息 
def cleartext():
    text.delete('0.0', END)
    
class Ping(threading.Thread):
    def __init__(self,str_ip,sleep_time):  
        threading.Thread.__init__(self)
        self.str_ip = str_ip
        self.sleep_time = sleep_time 
    def run(self):
        time.sleep(self.sleep_time) 
        ftp_ret = subprocess.Popen('ping %s -n 3' % self.str_ip,stdin=subprocess.PIPE,stdout=subprocess.PIPE,shell=True)
        ret = ftp_ret.stdout.read()  
        # 这里的字符集一定是gbk,否则会报错
        str_ret = ret.decode("gbk")  
        ret_s = re.search("TTL",str_ret)
        if ret_s:
            text.insert(INSERT,("%s    在线!\n#########################\n" % self.str_ip))
        else:
            text.insert(INSERT,("%s    无法ping通!\n#########################\n" % self.str_ip))

# 创建窗口对象的背景色
root = Tk()
root.title('便捷式一键查询服务系统')
root.geometry('360x520')

# Frame为布局函数
main_frame = Frame(root)
text_frame = Frame(main_frame)
station_frame = Frame(main_frame)
botton_frame = Frame(station_frame)
# 建立列表 
l1 = Label(station_frame,text='输入站名、站码或拼音')
#l2 = Label(station_frame,text='')
ipText=Entry(station_frame)
# 字体显示
# ft = tkFont.Font(family='Fixdsys', size=10, weight=tkFont.BOLD)
# pack是加载到窗口
l1.pack(side='left')
ipText.pack(side='left')
ipText['width']=10
#l2.pack(side='left')

'''
两个函数的意义是既能enter运行,又可以点击运行,方便操作,扩大使用
bind绑定enter键
注意里面是return 而不是enter
'''
b = Button(station_frame,text='开始',command=btn_click)
b['width']=4
b['height']=1
b.pack(side='left')
ipText.bind("<Return>", btn_click_enter)

# 消息输入界面
text = Text(text_frame,width = 36, height= 25)
text.pack()
main_frame.pack()
c = Button(text='清空',command=cleartext)
c['width']=4
c['height']=1
c.pack(side='top')

# 输入框的位置
station_frame.pack(side='top',pady='10')
text_frame.pack()

# 进入消息循环
root.mainloop()

运行结果如下:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章