笔者点击:
本文通过GUI进行窗口化处理,便于查询。由于笔者设计的思维不足,部分代码重复也是设计的一大缺陷。此外,这种查询式跳跃也不适合实战。以后会修改和修改。我先写代码,作为记录学习过程的一种方法。
0节:前期准备
0.1Navicat for MySQL以及建立名为“stock_code”的数据库,名为“stock_codedetail”的表。
0.2Python股票量化交易到入门实战04(修改版)用于更新,维护stock_codedetail的表和代码。
0.3编程思路:通过GUI化处理,将通过sql查询方式变成一般的查询方式。
0.4编程部署:先初始化GUI框架,然后查询-匹配的模块一次,跳转反馈的模块一次,也就是说该代码分三个模块进行处理。当然美中不足的是,对于数据库的调用了两次。应该是在未来整改的时候进行修改,这就是进行封装的好处,定义一次。
1节:GUI框架初始化:
from tkinter import *
from tkinter import ttk
import pymysql
from tkinter import messagebox
import tkinter as tk#用于调用TK
import pandas as pd
import numpy as np
class basedesk():
def __init__(self,master):
()
('stock_chcek')
# 获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
= () # 屏幕宽
= () # 屏幕高
= '%dx%d+%d+%d' % (
, , ( - ) / 2, ( - ) / 2)
()
= Register)
.register)
- 这里面最难的就是理解这块代码:
= Register)
.register)
将初始化的__init__反过来传入后面的register类以及Regi中,达到GUI框架与插件,查询功能实现的分离,使得整体结构更加清楚。
2节:插件布局,查询功能实现:
2.1初始化访问数据库的参数
class Register():
def __init__(self, master):
= master
# 基准框架
'localhost'
= 'root'
'123456'
;stock_code'
2.2register函数负责按键,对话框等的部署
def register(self,master):
,text='stock_code',font=('微软雅黑',14))
(padx=85,pady=30)
#1对话框设置
;industry')
(row=1,column=0,padx=10,pady=10)
#1.1接受输入值
#1.2输入框
)
(row=1,column=1,padx=0,pady=10)
#1.3登入按键
;登录',command=)
(row=3,column=0,padx=20,pady=20)
#1.4退出按键
= Button, text='退出', command=.quit)
(row=3, column=1,padx=20, pady=20)
2.3conn函数负责匹配()【自己传参】是否存在数据库记录之中,如果有则跳转新窗口,即()函数,如果没有,则弹窗提示错误。
- ()),通过添加np.ravel函数,可以将[[a],[b],[c]]的列表嵌套列表的模式变为[a,b,c]的列表格式。之前无法调用,花了代价的,也是通过不断的prin)以及print(type))等方式来查询,然后将复杂格式简单化处理。
- =()则是对()进行取值定义,然后传参到show_result()进行查询,返回的实现。
def conn(self):
#初始化数据库
=(host=, port=3306, user=,
password=, db=;utf8')
#获取游标
=.cursor()
#测试连接是否成功
if :
print('连接成功')
('select industry from stock_codedatail', )
())
=()
2.4通过while函数,我们可以实现多次查询记录。
- 如果要实现多次查询,则# ()进行注释。
- 因为我们两次调用数据库数据的定义变量均为conn,所以.close()进行了注释,在最后的匹配进行关闭游标的处理。
while len)<40000:
if () in :
print('输入正确')
# ()
()
break
else:
(0,END)
me(title='note',message='查询错误,请检查')
break
#关闭游标
#.close()
3.show_result():主要实现()访问数据库返回查询情况,并通过treeview进行处理。
3.1其实这里我们要检讨一下,不必在show_result()函数再次定义,毕竟在conn()函数我们已经定义过一次,在同一个类里面可以再次调用。
- = p[p['industry']=='%s'%],将conn函数中的取值输入值进行定义,然后通过Python语句调用。获取我们想要查询的信息,并且返回一个函数。
def show_result(self):
= (host=, port=3306, user=,
password=, db=base, charset='utf8')
#测试
if :
print('连接成功')
p=pd.read_sql('select * from stock_codedatail', )
# prinp)
= p[p['industry']=='%s'%]
=.reset_index(drop=True)
3.2创建新的窗口:
win=Tk()
win.geometry('500x400+100+100')
win.title('industry_stockdetail')
3.3树型菜单插件实现:
- 定义columns
- 定义column
- 定义heading
- 在这里各位不必向我一样,这么做,可以通过for...in...循环传参进去,没有必要写的这么复杂。
- (fill=BOTH,expand=YES) # 设置位置
- 是dataframe数据结构,5列数据结构,通过row.iloc[i,0]将每列数据传入进去。
- 最后关闭游标,数据库。
columns=['updateDate','code','code_name','industry','industryClassification']
(win,height=18,show='headings',columns=columns)
('updateDate',width=150,anchor='center')
('code', width=80, anchor='center')
('code_name', width=80, anchor='center')
('industry', width=90, anchor='center')
('industryClassification', width=100, anchor='center')
('updateDate',text='updateDate')
('code', text='code')
('code_name', text='code_name')
('industry', text='industry')
('industryClassification',text='industryClassification')
(fill=BOTH,expand=YES) # 设置位置
for i in range(len()):
('',i,values=(.iloc[i,0],.iloc[i,1],.iloc[i,2],
.iloc[i,3],.iloc[i,4]))
# 关闭游标卡尺
.close()
# 关闭数据库
.close()
root.mainloop()
4.调用和展示:
if __name__=="__main__":
root=Tk()
basedesk(root)
mainloop()
4.1查询界面:
4.2输入查询关键字:
查询错误,提示错误,并清空原查询语句
5.总结:
- 多次调用conn却设计两次访问,这个无疑是十分冗余的
- 查询界面应当和查询结果同列,查询界面可以设置账号和密码,支持修改
- 相关的界面没有很好的优化,需要修改
- 未来将进一步进行优化,敬请期待