头段时间有机会了解到了webservice接口,引发思考。在调用webservice来调用Windows,岂不是就写了一个简单的桌面应用。
因此,用tkinter来控制弹窗,用webservice实现业务功能,最后用pyinstaller打包成可执行的exe文件,应当可以直接运行。
尝试成功,如下:
# coding=utf-8
from tkinter import *
import hashlib
import time
from suds.client import Client
from suds.xsd.doctor import ImportDoctor, Import
LOG_LINE_NUM = 0
class MY_GUI():
def __init__(self, init_window_name):
self.init_window_name = init_window_name
# 设置窗口
def set_init_window(self):
self.init_window_name.title("查询城市天气_v0.1") # 窗口名
# self.init_window_name.geometry('320x160+10+10') #290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置
self.init_window_name.geometry('1280x760+100+100')
self.init_window_name["bg"] = "pink" #窗口背景色
# self.init_window_name.attributes("-alpha",0.9) #虚化,值越小虚化程度越高
# 标签
self.init_data_label = Label(self.init_window_name, text="城市名称")
self.init_data_label.grid(row=0, column=0)
self.result_data_label = Label(self.init_window_name, text="天气结果")
self.result_data_label.grid(row=0, column=12)
self.log_label = Label(self.init_window_name, text="日志")
self.log_label.grid(row=12, column=0)
# 文本框
self.init_data_Text = Text(self.init_window_name, width=67, height=35) # 原始数据录入框
self.init_data_Text.grid(row=1, column=0, rowspan=10, columnspan=10)
self.result_data_Text = Text(self.init_window_name, width=70, height=49) # 处理结果展示
self.result_data_Text.grid(row=1, column=12, rowspan=15, columnspan=10)
self.log_data_Text = Text(self.init_window_name, width=66, height=9) # 日志框
self.log_data_Text.grid(row=13, column=0, columnspan=10)
# 按钮
self.str_trans_to_md5_button = Button(self.init_window_name, text="查询天气", bg="lightblue", width=10,
command=self.get_city_weather) # 调用内部方法 加()为直接调用
self.str_trans_to_md5_button.grid(row=1, column=11)
# 功能函数
def get_city_weather(self):
city_name = str(self.init_data_Text.get(1.0, END)).replace('\n','')
if city_name:
try:
url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdl'
imp = Import('http://www.w3.org/2001/XMLSchema',
location='http://www.w3.org/2001/XMLSchema.xsd')
imp.filter.add('http://WebXml.com.cn/')
c = Client(url, doctor=ImportDoctor(imp))
message = str(c.service.getWeatherbyCityName(city_name))
message = message.split("string[] =")[-1]
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, message)
self.write_log_to_Text("INFO: 查找成功")
except:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "INFO: 查找失败")
else:
self.write_log_to_Text("ERROR:地址无效")
# 获取当前时间
def get_current_time(self):
current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
return current_time
# 日志动态打印
def write_log_to_Text(self, logmsg):
global LOG_LINE_NUM
current_time = self.get_current_time()
logmsg_in = str(current_time) + " " + str(logmsg) + "\n" # 换行
if LOG_LINE_NUM <= 7:
self.log_data_Text.insert(END, logmsg_in)
LOG_LINE_NUM = LOG_LINE_NUM + 1
else:
self.log_data_Text.delete(1.0, 2.0)
self.log_data_Text.insert(END, logmsg_in)
def gui_start():
init_window = Tk() # 实例化出一个父窗口
ZMJ_PORTAL = MY_GUI(init_window)
# 设置根窗口默认属性
ZMJ_PORTAL.set_init_window()
init_window.mainloop() # 父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示
if __name__ == "__main__":
gui_start()
当然,桌面应用没那么简单,按这简单实现,会有很多缺陷异常情况未做处理,例如超时无反应,请求失败的情况。