python tk combobox设置值为空_Python学习: GUI、爬虫与Treeview控件做一个天气预报

先看结果

6b128b2731e67a22edc4b815ed520427.png

用Treeview控件做一个表格,放置五日天气预报。

如果用常规方法诸列进行表头栏目名称、宽度设置的话,就需要十几行代码,重复量大,繁琐,栏宽也不能自动适用窗口大小。

self.gTr=Treeview(self.root,columns=('date','fengx','fengli','high','low','type'

), show='headings',height=6)

self.gTr.column('date',anchor='center')

self.gTr.column('fengx',anchor='center')

self.gTr.column('fengli', width=self.w,anchor='center')

self.gTr.column('high',anchor='center')

self.gTr.column('low',anchor='center')

self.gTr.column('type',anchor='center')

self.gTr.heading('date',text='日期')

self.gTr.heading('fengx',text='风向')

self.gTr.heading('fengli',text='风力')

self.gTr.heading('high',text='最高温度')

self.gTr.heading('low',text='最低温度')

self.gTr.heading('type',text='天气')

简化后用2行代码搞定:

self.headers=['日期','风向','风力','最高温度','最低温度','天气']

self.grd.configure(columns=self.headers) #设置表格栏目

列宽设定

如果对Treeview列宽设置固定值,显然不方便,也不能自动调整,如果不对列宽做硬性设定,表格显示如下图,列宽不规整。

ee42589085c1577328f5e85b58e7ea87.png

1行代码tkFont.Font().measure(col.title()使栏宽自动调整:

for col in self.headers: #填充表头

self.grd.heading(str(self.headers.index(col)),text=col.title())

self.grd.column(col,anchor='center',width=tkFont.Font().measure(col.title()))

爬取天气预报

涉及数据爬取,然后用正则表达式规范化提取的数据,放置在Treeview控件中显示。

附完整代码:

#!/usr/bin/python

# **coding:utf-8**

'''

爬取天气预报在GUI界面显示

'''

import urllib.request

import gzip

import json

import tkinter as tk

import tkinter.font as tkFont

import tkinter.messagebox

from tkinter import ttk

from tkinter import *

import re

class Forcast:

def __init__(self): # 定义图形界面

self.root = tk.Tk()

self.root_w = int(self.root.winfo_screenwidth() / 3)

self.root_h = int(self.root.winfo_screenheight() / 5)

self.start_x = 100

self.start_y = 40

self.f_color = '#00ced1'

self.b_color = '#e2f8fe'

self.entVar = StringVar

self.root.geometry('%dx%d+%d+%d' % (self.root_w, self.root_h, self.start_x, self.start_y))

self.entvar = StringVar()

self.fm1 = tk.Frame(self.root)

self.lb1 = tk.Label(self.fm1, text="选择地区:")

self.ent = ttk.Combobox(self.fm1, textvariable=self.entVar, background=self.b_color, foreground=self.f_color)

self.ent["values"] = ('灵璧', '北京', '杭州', '上海', '合肥')

self.ent.current(0)

self.bt1 = tk.Button(self.fm1, text='确定', command=self.show_weather)

self.lb1.pack(side='left')

self.ent.pack(side='left', fill='x', expand=1)

self.bt1.pack(side='right', padx=4)

self.fm1.pack(side='top', fill='x', expand=1, ancho='n')

self.headers = ['日 期', '风 向', '风 力', '最高温度', '最低温度', '天气']

self.fm2 = Frame(self.root)

self.grd = ttk.Treeview(self.fm2, columns=None, show='headings')

self.grd.configure(columns=self.headers) # 设置表格栏目

for col in self.headers: # 填充表头

self.grd.heading(str(self.headers.index(col)), text=col.title())

self.grd.column(col, anchor='center', width=tkFont.Font().measure(col.title())) #调整栏宽

self.grd.pack(padx=2, pady=2, expand=1, fill='both')

self.fm2.pack(side='top', fill='x', expand=1, ancho='n')

self.url = 'http://wthrcdn.etouch.cn/weather_mini?city='

def show_weather(self):

city_name = self.ent.get()

url = self.url + urllib.parse.quote(city_name)

weather_data = urllib.request.urlopen(url).read()

weather_data = gzip.decompress(weather_data).decode('utf-8')

weather_dict = json.loads(weather_data)

if weather_dict.get('desc') == 'invilad-citykey':

print(tkinter.messagebox.askokcancel('提示', '你输入的城市名没有'))

else:

forecast = weather_dict.get('data').get('forecast')

for item in self.grd.get_children(): # 清除表格

self.grd.delete(item)

for fc in forecast:

self.grd.insert('', 'end', values=(fc.get('date'), fc.get('fengxiang'),

re.sub(r'[^d-级]*','', fc.get('fengli')),

re.sub(r'[^d℃]+', '',fc.get('high')),

re.sub(r'[^d℃]+', '',fc.get('low')),

fc.get('type')))

self.root.mainloop()

if __name__ == '__main__':

app = Forcast()

app.show_weather()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值