tkinter-TinUI-xml实战(1)天气预报

tkinter-TinUI-xml实战(1)天气预报,第1张

tkinter-TinUI-xml实战(1)天气预报

tkinter-TinUI-xml实战(1)天气预报

引言声明文件结构编写界面

初始化界面(main.xml)结果返回界面(table.xml) 完整代码(天气预报.py)效果结语

引言

在TinUI推出TinUIXml后,允许编写者使用xml文件或xml类型的字符串为TinUI或BasicTinUI编写用户界面,减少了重复调试的时间,并且使界面代码和逻辑代码层次分明,方便维护。

本篇文章,将使用该功能编写一个天气预报程序。

声明

本项目仅着重使用xml搭建TinUI界面,功能代码参考 Z小旋 的CSDN博客文章:Python天气预报。

本项目使用的TinUI为我开源并维护在GitHub上的主文件——TinUI.py。当然,使用PYPI中下载安装的tinui也可以。

文件结构

本次项目使用的文件结构如下:

TinUI.py - TinUI界面核心支持天气预报.py - 本次项目文件main.xml - 主界面table.xml - 天气预报结果呈现界面 编写界面

在该程序中,我打算使用两个xml文件来编写界面:

    显示初始界面,整体不会改动显示结果页面,每次查询天气需要变更
初始化界面(main.xml)

以下是main.xml的内容:


    
        
        entry
        
    
    
        
    

基本思路就是显示两行内容,一行显示输入信息和相关内容;第二行显示网络信息获取的情况,以防止输入城市错误或者是网络访问失败。

其中,需要导入函数get和导出entry, state:

def get_weather_data(event):
    city_name = entry.get()
    url1 = 'http://wthrcdn.etouch.cn/weather_mini?city='+urllib.parse.quote(city_name)
    url2 = 'http://wthrcdn.etouch.cn/weather_mini?citykey=101010100'
    #网址1只需要输入城市名,网址2需要输入城市代码
    #print(url1)
    weather_data = urllib.request.urlopen(url1).read()
    #读取网页数据
    weather_data = gzip.decompress(weather_data).decode('utf-8')
    #解压网页数据
    weather_dict = json.loads(weather_data)
    #将json数据转换为dict数据
    show_weather(weather_dict)

#导入接口
xh.funcs['get']=get_weather_data
#导出接口
entry=xh.tags['entry'][0]
state=xh.tags['state'][0]
结果返回界面(table.xml)

这个界面有两部分组成:

    显示当天天气的表格;显示未来四天天气的按钮按钮被点击后,显示未来四天天气信息

在table.xml中:


    
        
    
    
        
        
            
        
        
            
        
    

这里需要导入show_more和导出moreb, morel:

#导入接口
xb.datas['weather']=table
xb.datas['more']=more_weather
xb.funcs['show_more']=show_more
#导出接口
moreb=xb.tags['moreb'][2]
morel=xb.tags['morel'][0]
完整代码(天气预报.py)
#参考:https://blog.csdn.net/as480133937/article/details/100981820
import urllib.request
import gzip
import json
from tkinter import Tk
from TinUI import *

def get_weather_data(event):
    city_name = entry.get()
    url1 = 'http://wthrcdn.etouch.cn/weather_mini?city='+urllib.parse.quote(city_name)
    url2 = 'http://wthrcdn.etouch.cn/weather_mini?citykey=101010100'
    #网址1只需要输入城市名,网址2需要输入城市代码
    #print(url1)
    weather_data = urllib.request.urlopen(url1).read()
    #读取网页数据
    weather_data = gzip.decompress(weather_data).decode('utf-8')
    #解压网页数据
    weather_dict = json.loads(weather_data)
    #将json数据转换为dict数据
    show_weather(weather_dict)

def show_weather(weather_dict):
    def show_more(event):
        moreb[1](bg='#eddfdf')
        body.itemconfig(morel,text=more_weather)
    #将json数据转换为dict数据
    if weather_dict.get('desc') == 'invilad-citykey':
        head.itemconfig(state,text='城市名有误,或者天气中心未收录该城市')
    elif weather_dict.get('desc') =='OK':
        head.itemconfig(state,text='当前状态:正常')
        xb.clean()
        forecast = weather_dict.get('data').get('forecast')
        table=[['项目','内容']]
        table.append(['城市:',weather_dict.get('data').get('city')])
        table.append(['温度:',weather_dict.get('data').get('wendu')+'℃'])
        table.append(['感冒:',weather_dict.get('data').get('ganmao')])
        table.append(['风向:',forecast[0].get('fengxiang')])
        table.append(['风级:',forecast[0].get('fengli')])
        table.append(['高温:',forecast[0].get('high')])
        table.append(['低温:',forecast[0].get('low')])
        table.append(['天气:',forecast[0].get('type')])
        table.append(['日期:',forecast[0].get('date')])
        #=====
        more_weather=''
        for i in range(1,5):
            more_weather+='日期:'+forecast[i].get('date')+'n'
            more_weather+='风向:'+forecast[i].get('fengxiang')+'n'
            more_weather+='风级:'+forecast[i].get('fengli')+'n'
            more_weather+='高温:'+forecast[i].get('high')+'n'
            more_weather+='低温:'+forecast[i].get('low')+'n'
            more_weather+='天气:'+forecast[i].get('type')+'nn'
        #in
        xb.datas['weather']=table
        xb.datas['more']=more_weather
        xb.funcs['show_more']=show_more
        #during
        xb.loadxml(table_xml)
        #out
        moreb=xb.tags['moreb'][2]
        morel=xb.tags['morel'][0]


r=Tk()
r.title('天气查询')
r.geometry('500x500+50+50')

head=BasicTinUI(r)
xh=TinUIXml(head)
head.pack(fill='both',expand=True)
#in
xh.funcs['get']=get_weather_data
#during
with open('main.xml',mode='r',encoding='utf-8') as f:
    xh.loadxml(f.read())
bbox=head.bbox('all')
head['height']=bbox[3]-bbox[1]
#out
entry=xh.tags['entry'][0]
state=xh.tags['state'][0]

body=TinUI(r)
xb=TinUIXml(body)
body.pack(fill='both',expand=True)
with open('table.xml',mode='r',encoding='utf-8') as f:
    table_xml=f.read()

r.mainloop()
效果


结语

这就是用tkinter和TinUI混合编程的一个示例。

tkinter创新

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5717883.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存