Python Tkinter 练习3--加入异常提醒
#Time: 2020/02/16
#Author: Xiaohong
#运行环境: OS: Win7 64位 专业版Pack1
# Python: 3.7
# phantomjs: phantomjs-2.1.1-windows
# db: Python 自带的Sqlite,增加 tkinter.ttk 库
功能:在练习2的基础上,加入异常提醒,并修正练习1、练习2的Bug
tk_eastmoney.py
# -*- coding: UTF-8 -*-
#Time: 2020/02/16
#Author: Xiaohong
#运行环境: OS: Win7 64位 专业版Pack1
# Python: 3.7
# phantomjs: phantomjs-2.1.1-windows
# db: Python 自带的Sqlite
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys
import xlwt
import tkinter as tk
import tkinter.messagebox
import sqlite3
import re
#把网址中的id为:dt_1 导入到 同目录下的 data.txt 中
def imtxt(website):
is_continue = tkinter.messagebox.askyesno('Welcome! ', '是否要生成data.txt文件? 你输入的是:'+website)
if is_continue:
try:
#以下,需要先在电脑上安装 phantomjs
driver = webdriver.PhantomJS(executable_path=r"E:\python_test\BS4\phantomjs-2.1.1-windows\bin\phantomjs.exe")
driver.get(website)
time.sleep(5)
data = driver.find_element_by_xpath('//*[@id="dt_1"]').text
with open("data.txt","w") as fo:
fo.write(data)
except:
import sys
tuple = sys.exc_info()
errmsg = ' 错误为:' + str(tuple[1])
# print(errmsg)
tkinter.messagebox.showerror(title='操作失败', message='生成data.txt文件 失败,' + errmsg)
finally:
tkinter.messagebox.showinfo(title='OK', message='生成data.txt文件 OK')
else:
tkinter.messagebox.showinfo(title='取消操作', message='您取消了导入操作')
#设立函数,来取得当前时间,作为文件名的一部分,以免文件名重复
def get_sysdate():
now = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime(time.time()))
# print(now)
return now
#把同目录下的 data.txt 中 导入到 Excel 中
def toxls():
filename = get_sysdate()
# 从临时文件中读出
try:
fin = open("data.txt", "r")
except IOError:
print("Open File data.txt Failed!!!")
# 写入Excel文件
row = 0
new_workbook = xlwt.Workbook()
worksheet = new_workbook.add_sheet('股票账户统计')
for line in fin:
# print("%d,%s" %(n,line))
text = line.split()
j = 0
for i in text:
# print("%d,%d,%s" %(row,j,i))
# 格式化标题位置
col = j
if row == 0 and j == 2:
col = j + 2
if row == 0 and j == 3:
col = j + 2
if row == 0 and (j == 4 or j == 5 or j == 6):
col = j + 3
if row == 1 and j >= 0 and j <= 5:
col = j + 1
if row == 1 and j >= 6:
col = j + 3
worksheet.write(row, col, i)
j = j + 1
row = row + 1
fin.close()
new_workbook.save('东方财富网%s.xls' % filename)
tkinter.messagebox.showinfo(title='OK', message='生成EXCEL OK')
#把同目录下的 data.txt 中 导入到 python 自带的 sqlite db 中
def toSqlite():
# 连接MYSQL 数据库
# database = sqlite3.connect("mrsoft.db")
try:
database = sqlite3.connect("mrsoft.db")
cursor = database.cursor()
# 若存在表就删除
sql = "drop table if EXISTS em_stock "
cursor.execute(sql)
# 创建表
sql = "create table em_stock(date1 varchar(255)," \
"new_cnt decimal(10,3),new_percent VARCHAR(255)," \
"new_percent_tb VARCHAR (255),end_cnt DECIMAL (10,3)," \
"end_cnt_a DECIMAL (10,3),end_cnt_b DECIMAL (10,3)," \
"value_total decimal(10,3),value_avg DECIMAL (10,3)," \
"sh_index DECIMAL (10,3),sh_percent DECIMAL (10,3));"
cursor.execute(sql)
database.commit()
# 从临时文件中读出
with open("data.txt", "r") as fin:
# 写入MYSQL
row = 0
for line in fin:
text = line.split()
row = row + 1
if row >= 3:
print(text[7])
stock_value = re.search(r"\d+(\.\d+)?", text[7]).group()
stock_value_avg = re.search(r"\d+(\.\d+)?", text[8]).group()
sql = "INSERT INTO em_stock(date1,new_cnt,new_percent,new_percent_tb,end_cnt,end_cnt_a,end_cnt_b,value_total,value_avg,sh_index,sh_percent) VALUES('%s',%f,'%s','%s',%f,%f,%f,%f,%f,'%s',%f)"
cursor.execute(sql % (
text[0], float(text[1]), text[2], text[3], float(text[4]), float(text[5]), float(text[6]),
float(stock_value), float(stock_value_avg), float(text[9]), float(text[10])))
except :
import sys
tuple = sys.exc_info()
errmsg=' 错误为:'+str(tuple[1])
# print(errmsg)
tkinter.messagebox.showerror(title='操作失败', message='导入到em_stock 失败,'+errmsg)
else:
tkinter.messagebox.showinfo(title='操作成功', message='导入到em_stock OK')
finally:
database.commit()
database.close()
#增加 select_data 函数,目的是从Sqlite DB中取出数据
def select_data():
# 连接MYSQL 数据库
try:
database = sqlite3.connect("mrsoft.db")
cursor = database.cursor()
# 若存在表就删除
sql = "select date1,new_cnt,new_percent,new_percent_tb,end_cnt,end_cnt_a,end_cnt_b,value_total,value_avg,sh_index,sh_percent from em_stock "
cursor.execute(sql)
data_value= cursor.fetchall()
except:
import sys
errmsg=' 错误为:'+str(tuple[1])
# print(errmsg)
tkinter.messagebox.showerror(title='操作失败', message='查询数据失败,'+errmsg)
finally:
database.close()
#print(data_value)
return data_value
主程序tk_menu2.py 如下:
# -*- coding:utf-8 -*-
import tkinter as tk
#导入提示框类
import tkinter.messagebox
#调用自定义库,导入自定义的函数
from tk_eastmoney import imtxt,toxls,toSqlite,select_data
from tkinter import ttk
from tkinter.ttk import *
#Time: 2020/02/16
#Author: Xiaohong
#运行环境: OS: Win7 64位 专业版Pack1
# Python: 3.7
#功能: 通过一网址,把特定段落,导入到txt 文件,再通过txt 文件导入到Excel 及 sqlite db 中,并展示到Treeview中
class MyMenu(object):
#设计UI 界面
def setupUI(self):
#
l = tk.Label(self.window_main, text='主功能界面', bg='green',font=("宋体",18))
l.pack()
#设立菜单,功能待定
menubar = tk.Menu(self.window_main)
filemenu = tk.Menu(menubar, tearoff=0)
menubar.add_cascade(label='File', menu=filemenu)
filemenu.add_command(label='New')
#把菜单挂入窗口
self.window_main.config(menu=menubar)
#增加标签\文本框,用来输入要下载的 网址
tk.Label(self.window_main, text='A..网址',font=("宋体", 14)).place(x=10,y=35)
#设定默认值
web_site = tk.StringVar()
web_site.set('http://data.eastmoney.com/cjsj/gpkhsj.html')
web_site_value = tk.Entry(self.window_main, textvariable=web_site, font=('Arial', 12),width=50)
web_site_value.place(x=100, y=38)
#print(web_site_value.get())
#增加按钮,用来导入
vButton = tk.Button(self.window_main,text='1.导到文本',command=lambda:imtxt(web_site_value.get()),width=11)
vButton.place(x=100,y=70)
# 增加按钮,用来转入到EXCEL
vButton = tk.Button(self.window_main, text='2.文本到Excel', command=toxls,width=12)
vButton.place(x=190, y=70)
# 增加按钮,用来转入到sqllite
vButton = tk.Button(self.window_main, text='3.文本到Sqlite', command=toSqlite,width=12)
vButton.place(x=290, y=70)
# 增加按钮,用来把 sqllite 数据展示出来
vButton = tk.Button(self.window_main, text='4.查询Sqlite数据', command=lambda:self.show_data(tv),width=12)
vButton.place(x=390, y=70)
#数据标签
tk.Label(self.window_main, text='股票账户统计详细数据').place(x=10, y=100)
area = (
'数据日期', '新增投资者\n数量', '新增投资者\n环比', '新增投资者\n同比', '期末投资者\n数量', '期末投资者\nA股数量', '期末投资者\nB股数量', '沪深总市值', '沪深\n户均市值',
'上证指数\n收盘', '上证指数涨\n跌幅')
ac = ('all', 'n', 'e', 's', 'ne', 'nw', 'sw', 'c', 'd', 'sh_index', 'sh_percent')
# 定义显示列宽度
width1 = [75, 60, 70, 70, 70, 70, 60, 60, 50, 70, 70]
# 定义样式
s = ttk.Style()
s.theme_use('classic')
# 定义Treeview 来显示数据
tv = ttk.Treeview(self.window_main, columns=ac, show='headings', height=12, padding=10)
# 设定滚动条
vbar = tk.Scrollbar(self.window_main, command=tv.yview, orient=tk.VERTICAL)
tv.configure(yscrollcommand=vbar.set)
vbar.pack(side=tk.RIGHT)
#写入Treeview 的抬头
for i in range(11):
tv.column(ac[i], width=width1[i], anchor='e')
tv.heading(ac[i], text=area[i])
tv.place(x=10, y=130)
# self.show_data(tv)
def show_data(object,treeview):
#调用 自定义tk_eastmoney 库的自定义函数select_data取出数据
stock_data=select_data()
# #写入Treeview 的明细数据
for i in range(len(stock_data)):
treeview.insert('', 'end', values=stock_data[i])
#类的运行主体
def __init__(self):
self.window_main = tk.Tk()
self.window_main.geometry('800x500')
self.window_main.title('主窗口')
self.setupUI()
# self.show_data()
self.window_main.mainloop()
if __name__=='__main__':
MyMenu()
来源:CSDN
作者:leader_ww
链接:https://blog.csdn.net/leader_ww/article/details/104349470