tkinter桌面应用输入城市查询天气

头段时间有机会了解到了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()

当然,桌面应用没那么简单,按这简单实现,会有很多缺陷异常情况未做处理,例如超时无反应,请求失败的情况。
运行结果

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值