前两天看到一篇关于Python使用Tkinter 的博文,写的很好。就拿来研究了一下,改了改。现分享如下:

参考

代码

# coding:utf8
# python2.73 winxp
'''''
天气插件: 使用json接受中气象的本地信息,显示使用tkinter
url http://www.weather.com.cn/data/sk/101221201.html

v0.1
'''
from Tkinter import *
import json
import urllib
import time

def getWeaInfo():
    url = r'http://www.weather.com.cn/data/cityinfo/101221201.html'
    res = urllib.urlopen(url)  # 返回的是个json样式的字符串
    weatherinfo = {}
    jinfo = res.read().decode('utf8')  # jinfo是一个unicode对象,而我们要的是一个json,然后解析
    info = json.loads(jinfo)  # 变成键值对

    if info:
        try:
            weatherinfo['city'] = info['weatherinfo']['city']  # 城市
            weatherinfo['tempH'] = info['weatherinfo']['temp1']  # 高温
            weatherinfo['tempL'] = info['weatherinfo']['temp2']  # 低温
            weatherinfo['weather'] = info['weatherinfo']['weather']  # 天气
            weatherinfo['ptime'] = info['weatherinfo']['ptime']  # 发布时间
        except KeyError, e:
            print 'Do not get the key', e.message
    return weatherinfo

class WeatherFrame:
    '''''
    用于显示主框架
    '''

    def __init__(self):
        self.root = Tk()

        # 一个标题
        self.title = Label(self.root, text=u'天气情况')
        self.title.pack(side=TOP)

        # 四对信息框
        self.fm1 = Frame(self.root)
        self.label_city = Label(self.fm1, text=u'城市')
        self.label_city.pack(side=LEFT, expand=YES)
        self.text_city_e = StringVar()
        self.text_city = Entry(self.fm1, text='', state='readonly', textvariable=self.text_city_e)
        self.text_city.pack(side=LEFT, expand=YES)
        self.fm1.pack(side=TOP)

        self.fm2 = Frame(self.root)
        self.label_temph = Label(self.fm2, text=u'高温')
        self.label_temph.pack(side=LEFT, expand=YES)
        self.text_temph_e = StringVar()
        self.text_temph = Entry(self.fm2, text='', state='readonly', textvariable=self.text_temph_e)
        self.text_temph.pack(side=LEFT, expand=YES)
        self.fm2.pack(side=TOP)

        self.fm3 = Frame(self.root)
        self.label_templ = Label(self.fm3, text=u'低温')
        self.label_templ.pack(side=LEFT, expand=YES)
        self.text_templ_e = StringVar()
        self.text_templ = Entry(self.fm3, text='', state='readonly', textvariable=self.text_templ_e)
        self.text_templ.pack(side=LEFT, expand=YES)
        self.fm3.pack(side=TOP)

        self.fm4 = Frame(self.root)
        self.label_weather = Label(self.fm4, text=u'天气')
        self.label_weather.pack(side=LEFT, expand=YES)
        self.text_weather_e = StringVar()
        self.text_weather = Entry(self.fm4, text='', state='readonly', textvariable=self.text_weather_e)
        self.text_weather.pack(side=LEFT, expand=YES)
        self.fm4.pack(side=TOP)

        # 两个操作按钮
        self.fm5 = Frame(self.root)
        self.button_pull = Button(self.fm5, text=u'获取', command=self.pullWeaInfo)
        self.button_pull.pack(side=LEFT, expand=YES)
        self.button_quit = Button(self.fm5, text=u'退出', command=self.root.quit)
        self.button_quit.pack(side=LEFT, expand=YES)
        self.fm5.pack(side=TOP)

        self.pullWeaInfo()

    def pullWeaInfo(self):
        # 推送天气信息,初始化推送,手动更新
        weainfo = getWeaInfo()
        self.text_city_e.set(weainfo['city'])
        self.text_temph_e.set(weainfo['tempH'])
        self.text_templ_e.set(weainfo['tempL'])
        self.text_weather_e.set(weainfo['weather'])
        print ('lastest updated time is  %s' % time.ctime())

if __name__ == '__main__':
    wf = WeatherFrame()
    mainloop()

效果

我的修改

中国城市代码

城市代码获取

代码

# coding:utf-8
import sys

reload(sys)
sys.setdefaultencoding('utf8')
#    __author__ = '郭 璞'
#    __date__ = '2016/8/26'
#    __Desc__ = 天气预报小案例

from Tkinter import *
import urllib2
import json

def getWeatherInfoByCityCode(citycode):
    url = r'http://www.weather.com.cn/data/cityinfo/'+str(citycode)+'.html'
    data = urllib2.urlopen(url).read().decode('utf8')

    json_info = json.loads(data)
    weatherinfo = {}
    weatherinfo['city'] = json_info['weatherinfo']['city']  # 城市
    weatherinfo['tempH'] = json_info['weatherinfo']['temp2']  # 高温
    weatherinfo['tempL'] = json_info['weatherinfo']['temp1']  # 低温
    weatherinfo['weather'] = json_info['weatherinfo']['weather']  # 天气
    weatherinfo['ptime'] = json_info['weatherinfo']['ptime']  # 发布时间
    return weatherinfo

def show_in_tkinter(ccode):
    tk = Tk()
    citycode = StringVar()
    citycode.set(ccode)
    weatherinfo = getWeatherInfoByCityCode(citycode.get())

    frame1 = Frame(tk)
    Label(frame1,text='输入城市代码').pack(side=LEFT,expand=YES)
    Entry(frame1,textvariable=citycode).pack()
    frame1.pack(side=TOP)

    frame2 = Frame(tk)
    Label(frame2, text='城市名称').pack(side=LEFT, expand=YES)
    cityname = '%s'%weatherinfo['city']
    str_v_cityname = StringVar()
    str_v_cityname.set(cityname)
    Entry(frame2, textvariable=str_v_cityname,state='readonly').pack()
    frame2.pack(side=TOP)

    frame3 = Frame(tk)
    Label(frame3, text='     高温').pack(side=LEFT, expand=YES)
    temp_h = '%s' % weatherinfo['tempH']
    str_v_temp_h = StringVar()
    str_v_temp_h.set(temp_h)
    Entry(frame3, textvariable=str_v_temp_h, state='readonly').pack()
    frame3.pack(side=TOP)

    frame4 = Frame(tk)
    Label(frame4, text='     低温').pack(side=LEFT, expand=YES)
    temp_l = '%s' % weatherinfo['tempL']
    str_v_temp_l = StringVar()
    str_v_temp_l.set(temp_l)
    Entry(frame4, textvariable=str_v_temp_l, state='readonly').pack()
    frame4.pack(side=TOP)

    frame5 = Frame(tk)
    Label(frame5, text='     天气').pack(side=LEFT, expand=YES)
    weather = '%s' % weatherinfo['weather']
    str_v_weather = StringVar()
    str_v_weather.set(weather)
    Entry(frame5, textvariable=str_v_weather, state='readonly').pack()
    frame5.pack(side=TOP)

    frame6 = Frame(tk)
    Label(frame6, text='更新时间').pack(side=LEFT, expand=YES)
    updatetime = '%s' % weatherinfo['ptime']
    str_v_updatetime = StringVar()
    str_v_updatetime.set(updatetime)
    Entry(frame6, textvariable=str_v_updatetime, state='readonly').pack()
    frame6.pack(side=TOP)

    frame7 = Frame(tk)
    btn_pull = Button(frame7,text='获取数据',command=lambda:show_in_tkinter(citycode.get()))
    print citycode.get()
    # btn_pull.bind(citycode.get(),update_weather)
    btn_pull.pack(side=LEFT, expand=YES)
    btn_quit = Button(frame7,text='退出',command=tk.quit).pack(side=LEFT, expand=YES)
    frame7.pack(side=TOP)

    tk.mainloop()

if __name__=="__main__":
    show_in_tkinter(101180308)

测试结果

不足之处

本来设计的是可以输入城市代码,来实时的获取对应的天气信息,并更新到界面上的,但是不知道为什么系统会默认新开一个Tkinter的界面,导致刷新失败!

有时间再来更新本文,打个时间戳:2016年8月26日22:50:14

Python Tkinter小试的更多相关文章

  1. Python Tkinter基础控件入门实例

    分享一个Python Tkinter基础控件用法的入门例子,包括窗口的显示.显示内置图片.弹出窗口.菜单等. 例子,Python Tkinter基础控件的用法 # -*- coding: utf-8 ...

  2. Python Tkinter 学习成果:点歌软件music

    笔者工作业余时间也没什么爱好,社交圈子也小,主要娱乐就是背着自己带电瓶的卖唱音响到住地附近找个人多的位置唱唱KtV. 硬件上点歌就用笔记本电脑,歌曲都是网上下载的mkv格式的含有两个音轨的视频.因此点 ...

  3. Python Tkinter Entry(文本框)

    Python学习记录--关于Tkinter Entry(文本框)的选项.方法说明,以及一些示例. 属性(Options) background(bg) borderwidth(bd) cursor e ...

  4. python tkinter Listbox用法

    python tkinter组件的Listbox的用法,见下面代码的演示: from tkinter import * root=Tk() v=StringVar() #Listbox与变量绑定' l ...

  5. python Tkinter之Button

    Button小部件是一个标准的Tkinter的部件,用于实现各种按钮.按钮可以包含文本或图像,您可以调用Python函数或方法用于每个按钮. Tkinter的按钮被按下时,会自动调用该函数或方法. 该 ...

  6. python gui tkinter快速入门教程 | python tkinter tutorial

    本文首发于个人博客https://kezunlin.me/post/d5c57f56/,欢迎阅读最新内容! python tkinter tutorial Guide main ui messageb ...

  7. Python tkinter模块弹出窗口及传值回到主窗口操作详解

    这篇文章主要介绍了Python tkinter模块弹出窗口及传值回到主窗口操作,结合实例形式分析了Python使用tkinter模块实现的弹出窗口及参数传递相关操作技巧,需要的朋友可以参考下 本文实例 ...

  8. Python Tkinter 文本框(Entry)

    Python Tkinter 文本框用来让用户输入一行文本字符串. 你如果需要输入多行文本,可以使用 Text 组件. 你如果需要显示一行或多行文本且不允许用户修改,你可以使用 Label 组件. 语 ...

  9. Python Tkinter 窗口创建与布局

    做界面,首先需要创建一个窗口,Python Tkinter创建窗口很简单:(注意,Tkinter的包名因Python的版本不同存在差异,有两种:Tkinter和tkinter,读者若发现程序不能运行, ...

随机推荐

  1. java代码优化细节

    在代码线上运行的过程中,往往会出现很多我们意想不到的错误,不少错误定位到最后往往是一个非常小的原因导致的.然而因为线上环境和开发环境是非常不同的,为了解决一个错误,我们需要先查找错误原因.修改验证.打 ...

  2. [LeetCode] Lonely Pixel I 孤独的像素之一

    Given a picture consisting of black and white pixels, find the number of black lonely pixels. The pi ...

  3. 【实验吧】CTF_Web_简单的SQL注入之2

    直接输入11'报语法错误,然后输入1' and '1'='1 报SQLi detected!,说明有防护,输入1'and'1'='1回显ID: 1'and'1'='1  name: baloteli ...

  4. [Luogu 3674]小清新人渣的本愿

    Description 题库链接 给你一个序列 \(A\) ,长度为 \(n\) ,有 \(m\) 次操作,每次询问一个区间是否可以 选出两个数它们的差为 \(x\) : 选出两个数它们的和为 \(x ...

  5. [HNOI 2016]序列

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) ,给出 \(q\) 组询问.每次询问 \([l,r]\) ,求该区间内所有的子序列中最小值的和. \(1\leq n, ...

  6. [USACO15OPEN]回文的路径Palindromic Paths 2.0版

    题目描述 农夫FJ的农场是一个N*N的正方形矩阵(2\le N\le 5002≤N≤500),每一块用一个字母作标记.比如说: ABCD BXZX CDXB WCBA 某一天,FJ从农场的左上角走到右 ...

  7. 51 nod 1439 互质对(Moblus容斥)

    1439 互质对 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 有n个数字,a[1],a[2],…,a[n].有一个集合,刚开 ...

  8. POJ 3233 (矩阵)

    题意:对于矩阵A,求A^1 + ...... + A^k 按照矩阵十大经典题的思路大致做了下. 在k为奇数时:  A^( k / 2+1)+ 1) * (A^1 + ....... A^(k/2)) ...

  9. hdu 5505(GT and numbers)

    题意: 给你a和b,a每次和它的因子相乘得到一个新的a,求多少次后可以得到b. 输入样例 3 1 1 1 2 2 4 输出样例 0 -1 1 思路: 每次找出a和b/a的最大公约数(即当前a想得到b能 ...

  10. C语言程序设计第二次作业—————顺序结构

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. ************* Welcome ************* 源程序 include int mian() { printf(&q ...