Python Tkinter 练习3--加入异常提醒

*爱你&永不变心* 提交于 2020-02-17 01:56:23

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()


 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!