Python Tkinter小试
前两天看到一篇关于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小试的更多相关文章
- Python Tkinter基础控件入门实例
分享一个Python Tkinter基础控件用法的入门例子,包括窗口的显示.显示内置图片.弹出窗口.菜单等. 例子,Python Tkinter基础控件的用法 # -*- coding: utf-8 ...
- Python Tkinter 学习成果:点歌软件music
笔者工作业余时间也没什么爱好,社交圈子也小,主要娱乐就是背着自己带电瓶的卖唱音响到住地附近找个人多的位置唱唱KtV. 硬件上点歌就用笔记本电脑,歌曲都是网上下载的mkv格式的含有两个音轨的视频.因此点 ...
- Python Tkinter Entry(文本框)
Python学习记录--关于Tkinter Entry(文本框)的选项.方法说明,以及一些示例. 属性(Options) background(bg) borderwidth(bd) cursor e ...
- python tkinter Listbox用法
python tkinter组件的Listbox的用法,见下面代码的演示: from tkinter import * root=Tk() v=StringVar() #Listbox与变量绑定' l ...
- python Tkinter之Button
Button小部件是一个标准的Tkinter的部件,用于实现各种按钮.按钮可以包含文本或图像,您可以调用Python函数或方法用于每个按钮. Tkinter的按钮被按下时,会自动调用该函数或方法. 该 ...
- python gui tkinter快速入门教程 | python tkinter tutorial
本文首发于个人博客https://kezunlin.me/post/d5c57f56/,欢迎阅读最新内容! python tkinter tutorial Guide main ui messageb ...
- Python tkinter模块弹出窗口及传值回到主窗口操作详解
这篇文章主要介绍了Python tkinter模块弹出窗口及传值回到主窗口操作,结合实例形式分析了Python使用tkinter模块实现的弹出窗口及参数传递相关操作技巧,需要的朋友可以参考下 本文实例 ...
- Python Tkinter 文本框(Entry)
Python Tkinter 文本框用来让用户输入一行文本字符串. 你如果需要输入多行文本,可以使用 Text 组件. 你如果需要显示一行或多行文本且不允许用户修改,你可以使用 Label 组件. 语 ...
- Python Tkinter 窗口创建与布局
做界面,首先需要创建一个窗口,Python Tkinter创建窗口很简单:(注意,Tkinter的包名因Python的版本不同存在差异,有两种:Tkinter和tkinter,读者若发现程序不能运行, ...
随机推荐
- [JSOI2007]合金
Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的 原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新 ...
- ●51NOD 1705 七星剑
题链: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1705题解: 期望dp,期望的线性性质 (首先对于第k颗星,一定只 ...
- bzoj 4919: [Lydsy六月月赛]大根堆
Description 给定一棵n个节点的有根树,编号依次为1到n,其中1号点为根节点.每个点有一个权值v_i. 你需要将这棵树转化成一个大根堆.确切地说,你需要选择尽可能多的节点,满足大根堆的性质: ...
- (MariaDB/MySQL)之DML(2):数据更新、删除
本文目录:1.update语句2.delete语句 2.1 单表删除 2.2 多表删除3.truncate table 1.update语句 update用于修改表中记录. # 单表更新语法: UPD ...
- teachable-machine:探索机器学习如何工作,浏览器中实时浏览
教学机器是一个实验,让所有人都非常方便的探索机器学习,在浏览器中实时浏览,不需要编程.学习更多实验,然后亲自尝试它 访问:https://teachablemachine.withgoogle.com ...
- 简易js进度条
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Mysql锁机制--乐观锁 & 悲观锁
Mysql 系列文章主页 =============== 从 这篇 文章中,我们知道 Mysql 并发事务会引起更新丢失问题,解决办法是锁.所以本文将对锁(乐观锁.悲观锁)进行分析. 第一部分 悲观锁 ...
- java new 关键字到底做了什么?
一.关键字new概述 "new"可以说是Java开发者最常用的关键字,我们使用new创建对象,使用new并通过类加载器来实例化任何我们需要的东西,但你是否深入了解过new在编译的瞬 ...
- 反射获取 Class
原文链接:https://www.codemore.top/cates/Backend/post/2018-04-26/reflect-class 类 Java中每个类型要么是引用类型,要么是原生类型 ...
- 3.3 声明[[],]的数组, push_back() 和 back() 的区别
声明一个 [[],] 的二维数组: vector < vector<int> > res(1, vector<int>()); 或者 vector<vecto ...