在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2768|回复: 4

[求助] python的xlwt如何实现数据有效性单元格?

[复制链接]
发表于 2016-6-3 15:00:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
在使用python的xlwt生成excel时,由于需要弄一个数据有效性单元格,类似于下图:

数据有效性单元格

数据有效性单元格


不知道使用什么函数可以做到,求助下大神!!!!(谢谢!!)
 楼主| 发表于 2024-11-22 19:18:08 | 显示全部楼层
#作者:wxw  _ 时间:2018/9/16-14:04
#功能:制作excel表格
# -*- coding: utf-8 -*-
import  xlwt,xlrd,os
from datetime import  datetime
from xlutils.copy import  copy

font=xlwt.Font()
font.bold = True
font.name = 'Times New Roman'
font.height=200
#设置边框
borders = xlwt.Borders()
borders.left = xlwt.Borders.THIN
borders.right = xlwt.Borders.THIN
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
#设置居中
alignment = xlwt.Alignment()
alignment.horz = xlwt.Alignment.HORZ_CENTER
alignment.vert = xlwt.Alignment.VERT_CENTER

#专用格式
pattern_datetime = xlwt.Pattern()
pattern_datetime.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_datetime.pattern_fore_colour = 15
#分隔符
pattern_separator = xlwt.Pattern()
pattern_separator.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_separator.pattern_fore_colour = 1
#标题和内容
pattern_title = xlwt.Pattern()
pattern_title.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_title.pattern_fore_colour = 26
pattern_range = xlwt.Pattern()
pattern_range.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_range.pattern_fore_colour = 27
pattern_info = xlwt.Pattern()
pattern_info.pattern = xlwt.Pattern.SOLID_PATTERN
pattern_info.pattern_fore_colour = 42  #29 42 52

#style 格式 --使用
style_datetime = xlwt.easyxf('font: name Times New Roman,height 300,bold on', )
style_datetime.pattern = pattern_datetime
style_title = xlwt.easyxf('font: name Times New Roman,height 320,bold on',)
style_title.alignment = alignment
style_title.pattern = pattern_title
style_title.borders=borders

#表头-区间日期统计格式
range_title = xlwt.easyxf('font: name Times New Roman,height 200,bold on',) #10*20
range_title.alignment = alignment
range_title.pattern = pattern_range
range_title.borders=borders

#个股信息格式
style_info = xlwt.easyxf('font: name Times New Roman,height 220,bold on',) #11*20
style_info.alignment = alignment
style_info.pattern = pattern_info
style_info.borders = borders

#分隔符格式
style_separator = xlwt.easyxf('font: name Times New Roman,height 200,bold on',) #10*20
style_separator.alignment = alignment
style_separator.pattern = pattern_separator
style_separator.borders = borders

style_percent = xlwt.easyxf('font: name Times New Roman,height 220',num_format_str='0.00%' )

style_default  = xlwt.easyxf('font: name Times New Roman,' )
style_default.alignment = alignment

sss_a=[['600519', '贵州茅台', '1,559.00', '1,910.00', '1,910.00', '1,245.83', '1,245.83', '14.60亿', '13.72亿', '5.09亿', '3.48亿'],['002594', '比亚迪', '290.00', '338.04', '338.04', '159.67', '159.67', '6.97亿', '6.72亿', '4.91亿', '3.38亿'],['300750', '宁德时代', '265.56', '301.50', '301.50', '135.37', '135.37', '2.87亿', '2.96亿', '2.47亿', '1.95亿'],['000858', '五粮液', '151.29', '178.76', '211.44', '106.33', '106.33', '4,317.60万', '3,946.88万', '2,549.84万', '2,544.36万'],['300688', '创业黑马', '32.23', '39.22', '46.00', '16.43', '15.73', '3,344.58万', '3,165.60万', '2,326.42万', '2,039.61万'], ['300059', '东方财富', '25.63', '31.00', '31.00', '9.87', '9.87', '3,159.72万', '2,555.37万', '1,231.70万', '3,148.34万'], ['000002', '万科A', '8.71', '12.30', '19.95', '6.18', '6.18', '1,856.99万', '2,030.57万', '773.40万', '785.03万'], ['002103', '广博股份', '7.22', '9.94', '9.94', '4.55', '4.55', '1,709.80万', '1,533.38万', '1,341.16万', '1,285.69万'], ['002607', '中公教育', '3.49', '5.10', '6.38', '1.34', '1.34', '423.06万', '405.39万', '377.53万', '328.13万']]
tttt_a=['2023.11.16-2024.11.15','2022.11.16-2024.11.15','11.01-11.15','10.16-11.15','05.16-11.15','2023.11.16-2024.11.15']

#定制第一页表单的行间距
def  ws0_gen(ws0):
    for i in range(0,16):
        if i in [2,4,7,10]:
            ws0.col(i).width = int(256*1)
        elif i in [5,6,8,9,14]:
            ws0.col(i).width = 256*20
        else:
            ws0.col(i).width = 256*15

#定制第一页表头
def  ws0_title_gen(ws0):
    ws0.write_merge(0,1,0,0,"股票代码",style_title) # 合并第1列的 第1行和第2行
    ws0.write_merge(0,1,1,1,"股票名称",style_title) # 合并第2列的 第1行和第2行
    ws0.write_merge(0,1,3,3,"现价(元)",style_title) # 合并第4列的 第1行和第2行
    ws0.write_merge(0,0,5,6,"区间最高价(元)",style_title) # 合并第1行的 第6列和第7列
    ws0.write_merge(0,0,8,9,"区间最低价(元)",style_title) # 合并第1行的 第9列和第10列
    ws0.write_merge(0,0,11,14,"区间平均成交量(股)",style_title) # 合并第一行的 第12列和第15列

def  ws0_title_rangetime(ws0,r_num,arry):
    ws0.write(r_num, 5,arry[0],range_title)
    ws0.write(r_num, 6,arry[1],range_title)
    ws0.write(r_num, 8,arry[0],range_title)
    ws0.write(r_num, 9,arry[1],range_title)
    ws0.write(r_num, 11,arry[2],range_title)
    ws0.write(r_num, 12,arry[3],range_title)
    ws0.write(r_num, 13,arry[4],range_title)
    ws0.write(r_num, 14,arry[5],range_title)

def  ws0_info(ws0,r_num,arry):
    for i in range(len(arry)):
        for j in range(len(arry[i])):
            if  j < 2:
                ws0.write(r_num+i,j,arry[i][j],style_info)
            elif j == 2:
                ws0.write(r_num+i,j+1,arry[i][j],style_info)
            elif j in [3,4]:
                ws0.write(r_num+i,j+2,arry[i][j],style_info)
            elif j in [5,6]:
                ws0.write(r_num+i,j+3,arry[i][j],style_info)
            else :
                ws0.write(r_num+i,j+4,arry[i][j],style_info)



#制作表格
wb = xlwt.Workbook()
ws_0 = wb.add_sheet("基本数据")
ws0_gen(ws_0)
#定制表头&时间
ws0_title_gen(ws_0)
ws0_title_rangetime(ws_0,1,tttt_a)
ws0_info(ws_0,2,sss_a)
wb.save('stock_database_collect.xls')

#rwork = xlrd.open_workbook("stock_database_collect_change.xls",formatting_info = True)
#rwb_ws0 =   rwork.sheet_by_index(0)
#nrows0= rwb_ws0.nrows
##开始修改
#rwb = copy(rwork)
#ws_0 =   rwb.get_sheet(0)
#
##定制表头&时间
#ws0_title_gen(nrows0,ws_0)
#os.remove("stock_database_collect_change.xls")
#rwb.save("stock_database_collect_change.xls")



def  ws0_hyzj_gen(ws0,r_num,c_num,arry):
    for i in  range(len(arry)):
        for j in range(len(arry[i])):
            if(i<=2):
                #print(i+c_num,"xxxxx",arry[i][j])
                ws0.write(r_num+j, i+c_num, arry[i][j],style_title_asc)
            else:
                #print(i+c_num,"yyyyy",arry[i][j])
                ws0.write(r_num+j, i+c_num, arry[i][j],style_title_desc)

def  ws0_hqzx_gen(ws0,r_num,arry):
    for i in  range(len(arry)):
        if i == 0:
            ws0.write(r_num + 4, 20, arry[i], style_default)
        else:
            for j in range(len(arry[i])):
                if(i<=2):
                    ws0.write(r_num+6+i-1, j+15, arry[i][j],style_default)
                else :
                    ws0.write(r_num+(i-3), j+15, arry[i][j],style_default)

#定制第二页表单的行间距
def  ws1_gen(ws1):
    for i in range(26):
        if(i==11):
            ws1.col(i).width = 256*15
        else :
            ws1.col(i).width = 256*11
#定制第二页表头
def ws1_title_gen(r_num,ws1):
    ws1.write(r_num+1,0,"领涨股",style_title)
    ws1.write(r_num+1,1,"最新价",style_title)
    ws1.write(r_num+1,2,"涨幅",style_title)
    ws1.write(r_num+1,3,"所属板块",style_title)
    ws1.write(r_num+1,4,"领涨股",style_title)
    ws1.write(r_num+1,5,"最新价",style_title)
    ws1.write(r_num+1,6,"涨幅",style_title)
    ws1.write(r_num+1,7,"所属板块",style_title)
    ws1.write(r_num+1,8,"领涨股",style_title)
    ws1.write(r_num+1,9,"最新价",style_title)
    ws1.write(r_num+1,10,"涨幅",style_title)
    ws1.write(r_num+1,11,"所属板块",style_title)
    ws1.write(r_num+1,12,"领跌股",style_title)
    ws1.write(r_num+1,13,"最新价",style_title)
    ws1.write(r_num+1,14,"跌幅",style_title)
    ws1.write(r_num+1,15,"所属板块",style_title)
    ws1.write(r_num+1,16,"领跌股",style_title)
    ws1.write(r_num+1,17,"最新价",style_title)
    ws1.write(r_num+1,18,"跌幅",style_title)
    ws1.write(r_num+1,19,"所属板块",style_title)
    ws1.write(r_num+1,20,"领跌股",style_title)
    ws1.write(r_num+1,21,"最新价",style_title)
    ws1.write(r_num+1,22,"跌幅",style_title)
    ws1.write(r_num+1,23,"所属板块",style_title)


def  ws1_ggzf_gen(ws1,r_num,arry0,arry1):
    #print(arry0)
    #print(arry1)
    for i in  range(0,12):
        for j in range(0,37):
                if(i%4==0):
                    ws1.write(r_num + j, i, arry0[((37*(i//4)+j)*3)], style_title_asc)
                elif i%4==1:
                    ws1.write(r_num + j, i, arry0[1+((37*(i//4)+j)*3)], style_title_asc)
                elif i%4==2:
                    ws1.write(r_num + j, i, arry0[2+((37*(i//4)+j)*3)], style_title_asc)
                elif i%4==3:
                    ws1.write(r_num + j, i, arry1[j+(37*(i//3-1))], style_title_asc)
def  ws1_ggdf_gen(ws1,r_num,arry0,arry1):
    #print(arry0)
    #print(arry1)
    for i in  range(0,12):
        for j in range(0,37):
                if(i%4==0):
                    ws1.write(r_num + j, 12+i, arry0[((37*(i//4)+j)*3)], style_title_desc)
                elif i%4==1:
                    ws1.write(r_num + j, 12+i, arry0[1+((37*(i//4)+j)*3)], style_title_desc)
                elif i%4==2:
                    ws1.write(r_num + j, 12+i, arry0[2+((37*(i//4)+j)*3)], style_title_desc)
                elif i%4==3:
                    ws1.write(r_num + j, 12+i, arry1[j+(37*(i//3-1))], style_title_desc)



#定制第三页表单的行间距
def  ws2_gen(ws2):
    for i in range(26):
        if(i==2 or i==5 or i==9 or i==13 or i==17):
            ws2.col(i).width = 256*2
        elif(i==0 or i==3 or i==6  or i==10 or i==14 or i==18):
            ws2.col(i).width = 256*14
        elif(i==10):
            ws2.col(i).width = 256*15
        else:
            ws2.col(i).width = 256*11

#定制第三页表头
def ws2_title_gen(r_num,ws2):
    ws2.write(r_num+1,0,"个股净流入",style_title)
    ws2.write(r_num+1,1,"金额",style_title)
    ws2.write(r_num+1,3,"个股净流出",style_title)
    ws2.write(r_num+1,4,"金额",style_title)
    ws2.write(r_num+1,6,"连续上涨",style_title)
    ws2.write(r_num+1,7,"天数",style_title)
    ws2.write(r_num+1,8,"幅度",style_title)
    ws2.write(r_num+1,10,"连续下跌",style_title)
    ws2.write(r_num+1,11,"天数",style_title)
    ws2.write(r_num+1,12,"幅度",style_title)
    ws2.write(r_num+1,14,"量价齐升",style_title)
    ws2.write(r_num+1,15,"天数",style_title)
    ws2.write(r_num+1,16,"幅度",style_title)
    ws2.write(r_num+1,18,"量价齐跌",style_title)
    ws2.write(r_num+1,19,"天数",style_title)
    ws2.write(r_num+1,20,"幅度",style_title)

def  ws2_wr_gen(ws2,r_num,c_num,arry,style):
    #print(len(arry))
    #print(arry)
    for i in  range(0,len(arry)):
        if(i==37):
            break
        else:
            ws2.write(r_num + i, c_num, arry[i], style)


#定制时间标题
def  ws_datetime_gen(ws,r_num,c_num,date_time):
    ws.row(r_num).set_style(style_datetime)
    ws.write(r_num,c_num,date_time,style_datetime)



#首次Excel制作
def  first_wb_gen(date_time,hyzj_arry,gnzj_arry,hqzx_arry,\
                  ggzf_arry,ggdf_arry,ggzjlr_arry,lxzd_arry,ljzd_arry):
    #制作表格
    wb = xlwt.Workbook()
    ws_0 = wb.add_sheet("行业概念")
    ws_1 = wb.add_sheet("个股情况")
    ws_2 = wb.add_sheet("资金量")

    ws0_gen(ws_0)
    ws1_gen(ws_1)
    ws2_gen(ws_2)
    #定制表头&时间
    ws0_title_gen(0,ws_0)
    ws1_title_gen(0,ws_1)
    ws2_title_gen(0,ws_2)
    ws_datetime_gen(ws_0,0,9,date_time)
    ws_datetime_gen(ws_1,0,11,date_time)
    ws_datetime_gen(ws_2,0,10,date_time)

    #开始写入第一页:
    ws0_hyzj_gen(ws_0,2,0,hyzj_arry)
    ws0_hyzj_gen(ws_0,2,7,gnzj_arry)
    ws0_hqzx_gen(ws_0,2,hqzx_arry)

    #开始写入第二页:
    ws1_ggzf_gen(ws_1,2,ggzf_arry[0],ggzf_arry[1])
    ws1_ggdf_gen(ws_1,2,ggdf_arry[0],ggdf_arry[1])

    #开始写入第三页:
    #print(len(ljzd_arry[0]))
    #print(ljzd_arry[0])
    #print(len(ljzd_arry[3]))
    #print(ljzd_arry[3])
    ws2_wr_gen(ws_2,2,0,ggzjlr_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,2,1,ggzjlr_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,2,3,ggzjlr_arry[2],style_title_desc)
    ws2_wr_gen(ws_2,2,4,ggzjlr_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,2,6,lxzd_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,2,7,lxzd_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,2,8,lxzd_arry[2],style_title_asc)
    ws2_wr_gen(ws_2,2,10,lxzd_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,2,11,lxzd_arry[4],style_title_desc)
    ws2_wr_gen(ws_2,2,12,lxzd_arry[5],style_title_desc)
    ws2_wr_gen(ws_2,2,14,ljzd_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,2,15,ljzd_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,2,16,ljzd_arry[2],style_title_asc)
    ws2_wr_gen(ws_2,2,18,ljzd_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,2,19,ljzd_arry[4],style_title_desc)
    ws2_wr_gen(ws_2,2,20,ljzd_arry[5],style_title_desc)

    wb.save('stock_database_collect.xls')

def  change_wb_gen(date_time,hyzj_arry,gnzj_arry,hqzx_arry,\
                    ggzf_arry,ggdf_arry,ggzjlr_arry,lxzd_arry,ljzd_arry):
    rwork = xlrd.open_workbook("stock_database_collect_change.xls",formatting_info = True)
    rwb_ws0 =   rwork.sheet_by_index(0)
    rwb_ws1 =   rwork.sheet_by_index(1)
    rwb_ws2 =   rwork.sheet_by_index(2)
    nrows0= rwb_ws0.nrows
    nrows1= rwb_ws1.nrows
    nrows2= rwb_ws2.nrows

    #开始修改
    rwb = copy(rwork)
    ws_0 =   rwb.get_sheet(0)
    ws_1 =   rwb.get_sheet(1)
    ws_2 =   rwb.get_sheet(2)

    #定制表头&时间
    ws0_title_gen(nrows0,ws_0)
    ws1_title_gen(nrows1,ws_1)
    ws2_title_gen(nrows2,ws_2)
    ws_datetime_gen(ws_0,nrows0,9,date_time)
    ws_datetime_gen(ws_1,nrows1,11,date_time)
    ws_datetime_gen(ws_2,nrows2,10,date_time)
   
    #开始写入第一页:
    ws0_hyzj_gen(ws_0,nrows0+2,0,hyzj_arry)
    ws0_hyzj_gen(ws_0,nrows0+2,7,gnzj_arry)
    ws0_hqzx_gen(ws_0,nrows0+2,hqzx_arry)

    #开始写入第二页:
    ws1_ggzf_gen(ws_1,nrows1+2,ggzf_arry[0],ggzf_arry[1])
    ws1_ggdf_gen(ws_1,nrows1+2,ggdf_arry[0],ggdf_arry[1])

    #开始写入第三页:
    ws2_wr_gen(ws_2,nrows2+2,0,ggzjlr_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,1,ggzjlr_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,3,ggzjlr_arry[2],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,4,ggzjlr_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,6,lxzd_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,7,lxzd_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,8,lxzd_arry[2],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,10,lxzd_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,11,lxzd_arry[4],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,12,lxzd_arry[5],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,14,ljzd_arry[0],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,15,ljzd_arry[1],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,16,ljzd_arry[2],style_title_asc)
    ws2_wr_gen(ws_2,nrows2+2,18,ljzd_arry[3],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,19,ljzd_arry[4],style_title_desc)
    ws2_wr_gen(ws_2,nrows2+2,20,ljzd_arry[5],style_title_desc)

    os.remove("stock_database_collect_change.xls")
    rwb.save("stock_database_collect_change.xls")




 楼主| 发表于 2024-12-30 10:18:39 | 显示全部楼层
from pdb import post_mortem

import wx
import wx.lib.agw.flatnotebook as fnb
from openpyxl.styles.builtins import styles
from wx.lib.buttons import GenButton
import wx.grid
import time,re,os,sys,subprocess,signal,random,shutil,string
import threading
import datetime,time
import ctypes
import inspect
import xlwt

def async_raise(thread_id, exctype):
    ''''
    通过C语言的库抛出异常
    :param thread_id:
    :param exctype:
    :return:
    '''
    # 在子线程内部抛出一个异常结束线程
    thread_id = ctypes.c_long(thread_id)
    if not inspect.isclass(exctype):
        exctype = type(exctype)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("线程id违法")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, None)
        raise SystemError("异常抛出失败")


class main_fram(wx.Frame):

    def __init__(self, *args, **kw):
        super(main_fram, self).__init__(*args, **kw,style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX)
        self.Bind(wx.EVT_CLOSE, self.frame_close)
        #
        self.win_init_set()
        self.pane_2()
        self.chaxun_done = 0
        self.chaxun_name= []
        self.chaxun_date  = []
        self.chaxun_button_click = False
        self.chaxun_p = ""
        self.result = 0
        self.dlg = ""


        #
    def frame_close(self,event):
        #print("退出程序 !!!")
        if self.chaxun_button_click and self.chaxun_done == 0:
            async_raise(self.chaxun_p.ident, SystemExit)
            self.chaxun_button_click = False
        else:
            pass
        self.Destroy()

    def win_init_set(self):
        self.SetTitle("work work !!!")
        self.SetMaxSize((1200, 800))
        self.SetMinSize((1200, 800))
        self.SetSize(1200, 800)
        self.Center()
        #print(self.GetPosition())

    def menu_bar_gen(self):

        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        fileItem = fileMenu.Append(wx.ID_EXIT, '退出', '退出应用')
        menubar.Append(fileMenu, '文件(&F)')
        self.SetMenuBar(menubar)

        #绑定菜单项的行为
        self.Bind(wx.EVT_MENU, self.OnQuit, fileItem)

    #股票信息查询
    def pane_2(self):
        #1. 创建面板panel  设置背景色
        panel = wx.Panel(self)
        #panel.SetBackgroundColour('#EEE9E9')  # 设置为浅蓝色背景
        panel.SetBackgroundColour('#F5F5F5')  # 设置为white smoke色彩

        #2.创建组件
        #2.1  在一行里面创建的组件
        StaticText=wx.StaticText(panel, label="待查询股票:", pos=(100, 80))
        #设置字体
        font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
        StaticText.SetFont(font)
        #创建2个单选按钮
        self.manual_input = wx.RadioButton(panel, label="手动输入", pos = (400, 80),size=(120,25));
        self.manual_input.SetFont(font)
        self.txt_input = wx.RadioButton(panel, label="文本输入", pos = (600,80),size=(120,25));
        self.txt_input.SetFont(font)
        self.manual_input.Bind(wx.EVT_RADIOBUTTON, self.on_radio_btn_click)
        self.txt_input.Bind(wx.EVT_RADIOBUTTON, self.on_radio_btn_click)
        # 默认选中:手动输入 单选按钮  尽量不要用,会导致聚焦出问题
        #manual_input.SetValue(True)
        #txt_input.SetValue(True)

        #2.2  在下面pos 开始构建manual_input 下面的多行文本控件:
        #多行文本  必须要用wx.TE_RICH2  否则一些格式配置不生效
        self.txtMulti = wx.TextCtrl(panel, wx.ID_ANY, pos = (300, 200), size = (600, 300), style = wx.TE_MULTILINE|wx.TE_RICH2)
        #预埋提示文本的字体、背景色等格式设置
        #设置字体
        font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        #txtMulti.SetFont(font)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        self.txtMulti.SetDefaultStyle(text_attr)
        #预埋提示文本
        self.txtMulti.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
        #通过聚焦和失焦  对预埋的提示文本做处理
        self.txtMulti.Bind(wx.EVT_SET_FOCUS, self.txtMulti_set_focus)  # 绑定事件处理器
        self.txtMulti.Bind(wx.EVT_KILL_FOCUS, self.txtMulti_kill_focus)  # 绑定事件处理器

        #2.3 开始构建txt_input 下面的单行文本控件:
        # 2.3.1 创建一个GenButton---样式更好看一些
        self.file_button = GenButton(panel, label="选择文件",  pos = (805, 200), size = (100, 50))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.file_button.SetBackgroundColour('#F0FFF0')  # 设置按钮背景颜色
        # 设置按钮的样式,可以是:wx.BU_LEFT, wx.BU_TOP, wx.BU_RIGHT, wx.BU_BOTTOM
        self.file_button.SetBezelWidth(2)  # 设置按钮边缘宽度
        self.file_button.SetUseFocusIndicator(False)  # 禁用焦点指示
        #设置字体
        font = wx.Font(14, wx.ROMAN, wx.NORMAL, wx.BOLD)
        self.file_button.SetFont(font)
        #绑定按钮到标准的打开文件function
        self.file_button.Bind(wx.EVT_BUTTON, self.file_button_open)
        # 2.3.2  创建单行带滚动条的文本框
        self.txtSingl = wx.TextCtrl(panel, wx.ID_ANY, pos = (200, 200), size = (600, 50),style = wx.HSCROLL|wx.TE_RICH2)
        #设置字体
        font = wx.Font(14, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        #txtMulti.SetFont(font)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        self.txtSingl.SetDefaultStyle(text_attr)
        #预埋提示文本
        self.txtSingl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
        self.txtSingl.Bind(wx.EVT_SET_FOCUS, self.txtSingl_set_focus)  # 绑定事件处理器
        self.txtSingl.Bind(wx.EVT_KILL_FOCUS, self.txtSingl_kill_focus)  # 绑定事件处理器

        #3. 开始构建工作 按钮:
        #设置字体
        font = wx.Font(16, wx.DECORATIVE, wx.NORMAL, wx.BOLD)
        #3.1 创建一个查询 GenButton
        self.chaxun_button = GenButton(panel, label="查询",  pos = (240, 600), size = (80, 80))
        #self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        self.chaxun_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.chaxun_button.SetFont(font)
        self.chaxun_button.Bind(wx.EVT_BUTTON,self.chaxun_button_work)
        tooltip = wx.ToolTip("点击查询后,再次点击可选择终止!")
        self.chaxun_button.SetToolTip(tooltip)



        #3.2 创建一个清除 GenButton
        self.clear_button = GenButton(panel, label="清除",  pos = (560, 600), size = (80, 80))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.clear_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.clear_button.SetFont(font)
        self.clear_button.Bind(wx.EVT_BUTTON, self.clear_button_clean)
        tooltip = wx.ToolTip("清除填写的待查询股票信息!")
        self.clear_button.SetToolTip(tooltip)

        #3.3 创建一个 显示GenButton
        self.xianshi_button = GenButton(panel, label="显示",  pos = (880, 600), size = (80, 80))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.xianshi_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.xianshi_button.SetFont(font)
        tooltip = wx.ToolTip("显示查询结果,选择保存路径!")
        self.xianshi_button.SetToolTip(tooltip)

        self.chaxun_name=[['600519', '贵州茅台', '1,565.80', '1,910.00', '1,910.00', '1,245.83', '1,245.83', '8.45亿', '6.42亿', '5.52亿', '3.77亿'], ['002594', '比亚迪', '283.68', '338.04', '338.04', '159.67', '159.67', '8.06亿', '8.30亿', '6.15亿', '4.03亿'], ['300750', '宁德时代', '273.71', '301.50', '301.50', '135.37', '135.37', '1.38亿', '1.41亿', '2.03亿', '1.98亿'], ['000858', '五粮液', '151.82', '178.76', '211.44', '106.33', '106.33', '8,777.27万', '7,574.12万', '2,322.29万', '3,231.55万'], ['300688', '创业黑马', '--', '39.22', '46.00', '16.43', '15.98', '2,309.20万', '2,726.91万', '2,628.97万', '2,576.41万'], ['300059', '东方财富', '27.91', '31.00', '31.00', '9.87', '9.87', '2,090.15万', '2,014.15万', '2,428.74万', '2,090.65万'], ['002103', '广博股份', '13.77', '18.78', '18.78', '4.55', '4.55', '1,173.60万', '1,212.94万', '1,295.60万', '1,274.40万'], ['000002', '万科A', '8.69', '10.85', '19.22', '6.18', '6.18', '702.39万', '1,248.21万', '851.74万', '767.00万'], ['002607', '中公教育', '4.09', '4.72', '6.38', '1.34', '1.34', '304.99万', '293.59万', '380.20万', '334.32万']]
        self.chaxun_date=['2023.12.13-2024.12.12', '2022.12.13-2024.12.12', '11.28-12.12', '11.13-12.12', '06.13-12.12', '2023.12.13-2024.12.12']
        self.xianshi_button.Bind(wx.EVT_BUTTON,self.display_find_result)


    def on_radio_btn_click(self, event):
        # 获取触发事件的单选按钮
        radio_btn = event.GetEventObject()
        label_value = radio_btn.GetLabel()
        if  label_value == "手动输入":
            self.txtMulti.Show()
            self.txtSingl.Hide()
            self.file_button.Hide()
        else:
            self.txtMulti.Hide()
            self.txtSingl.Show()
            self.file_button.Show()


    def txtMulti_set_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue()
        # 如果值是默认的灰色文本,则清除它
        if  "示例:(多个股票之间用空格)\n东方财富 贵州茅台" in value:
            #要把字体格式恢复到正常模式,方便用户填写
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            text_ctrl.SetFont(font)
            text_ctrl.SetValue("")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtMulti_kill_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue().strip()
        # 如果用户点击了txtMulti文本框,但是一直没有填写任何值,则失焦之后,我们就把提示文本还原回去
        if  "" == value:
            font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
            text_attr = wx.TextAttr()
            #text_attr.SetBackgroundColour("RED")  # 背景色
            text_attr.SetTextColour('#BEBEBE') #灰色
            text_attr.SetFont(font)  # 字体大小、斜体
            text_ctrl.SetDefaultStyle(text_attr)
            text_ctrl.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtSingl_set_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue()
        # 如果值是默认的灰色文本,则清除它
        if  "示例(excel、txt): F:\\for_python_test\stock_database_collect.xls" in value:
            #要把字体格式恢复到正常模式,方便用户填写
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            text_ctrl.SetFont(font)
            text_ctrl.SetValue("")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtSingl_kill_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue().strip()
        # 如果用户点击了txtMulti文本框,但是一直没有填写任何值,则失焦之后,我们就把提示文本还原回去
        if  "" == value:
            font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
            text_attr = wx.TextAttr()
            #text_attr.SetBackgroundColour("RED")  # 背景色
            text_attr.SetTextColour('#BEBEBE') #灰色
            text_attr.SetFont(font)  # 字体大小、斜体
            text_ctrl.SetDefaultStyle(text_attr)
            text_ctrl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def file_button_open(self, event):
        with wx.FileDialog(self, "打开文件", wildcard="Excel文件 (*.xls;*.xlsx)|*.xls;*.xlsx|txt文件 (*.txt)|*.txt",
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消
            file_path = fileDialog.GetPath()
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            self.txtSingl.SetFont(font)
            self.txtSingl.SetValue(file_path)
            self.txtSingl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
            self.txtSingl.SetValue(file_path)
            try:
                #with open(path, 'r', encoding='utf-8') as file:
                    #content = file.read()
                    #new_tab = wx.TextCtrl(self.notebook, style=wx.TE_MULTILINE)
                    #new_tab.SetValue(content)
                    #self.notebook.AddPage(new_tab, path.split('/')[-1])
                    pass
            except IOError:
                wx.LogError(f"无法打开文件 '{path}'。")

    def chaxun_start_work(self):
        # chaxun ---------
        #模拟 查询的delay和结果的反馈
        #time.sleep(50)
        cnt=0
        while True:
            time.sleep(1)
            cnt+=1
            if cnt == 2:
                break
            print("wwwwwwwwwww"+str(cnt))
        self.chaxun_name=[['600519', '贵州茅台', '1,565.80', '1,910.00', '1,910.00', '1,245.83', '1,245.83', '8.45亿', '6.42亿', '5.52亿', '3.77亿'], ['002594', '比亚迪', '283.68', '338.04', '338.04', '159.67', '159.67', '8.06亿', '8.30亿', '6.15亿', '4.03亿'], ['300750', '宁德时代', '273.71', '301.50', '301.50', '135.37', '135.37', '1.38亿', '1.41亿', '2.03亿', '1.98亿'], ['000858', '五粮液', '151.82', '178.76', '211.44', '106.33', '106.33', '8,777.27万', '7,574.12万', '2,322.29万', '3,231.55万'], ['300688', '创业黑马', '--', '39.22', '46.00', '16.43', '15.98', '2,309.20万', '2,726.91万', '2,628.97万', '2,576.41万'], ['300059', '东方财富', '27.91', '31.00', '31.00', '9.87', '9.87', '2,090.15万', '2,014.15万', '2,428.74万', '2,090.65万'], ['002103', '广博股份', '13.77', '18.78', '18.78', '4.55', '4.55', '1,173.60万', '1,212.94万', '1,295.60万', '1,274.40万'], ['000002', '万科A', '8.69', '10.85', '19.22', '6.18', '6.18', '702.39万', '1,248.21万', '851.74万', '767.00万'], ['002607', '中公教育', '4.09', '4.72', '6.38', '1.34', '1.34', '304.99万', '293.59万', '380.20万', '334.32万']]
        self.chaxun_date=['2023.12.13-2024.12.12', '2022.12.13-2024.12.12', '11.28-12.12', '11.13-12.12', '06.13-12.12', '2023.12.13-2024.12.12']
        self.chaxun_done = 1
        self.chaxun_button_click = False
        # 创建Excel工作簿
        self.workbook = xlwt.Workbook(encoding="utf-8")
        sheet = self.workbook.add_sheet("Sheet1")
        # 添加数据到工作表
        sheet.write(0, 0, "Hello")
        sheet.write(0, 1, "World")

        #print("00000000000000000")
        #print(self.result)
        #if self.result != wx.ID_YES and self.result != wx.ID_NO:
        #print("11111111111111111")
        #self.dlg.EndModal(self.result)
        mss = wx.MessageBox("       查询已完成!","查询",wx.OK | wx.ICON_INFORMATION)

    def chaxun_button_work(self, event):
        #因为采用的是有模式窗口,所以 dlg窗口弹出 但是用户没来得及选择 同时 查询已完成窗口弹出了,
        # 这时候dlg窗口无论选择什么都没有意义,无需额外处理
        if self.chaxun_button_click :   #如果已经点击了查询,则再次点击时,要询问是否继续查询或者终止查询
            #创建对话框 用于返回用户的选择
            self.dlg = wx.MessageDialog(None, "正在查询中,是否终止查询?", "查询确认", wx.YES_NO | wx.ICON_WARNING)
            self.dlg.Center()
            self.result = self.dlg.ShowModal()
            #print(dlg.Destroy())
            if  self.result == wx.ID_YES and self.chaxun_done == 0:
                if self.chaxun_p.is_alive() : #仍在活跃中
                    async_raise(self.chaxun_p.ident, SystemExit) #强制关闭
                    time.sleep(0.5)
                    mss = wx.MessageBox("       已终止查询!","终止",wx.OK | wx.ICON_WARNING)
                    self.chaxun_button_click = False
                    #print(self.chaxun_p.is_alive())
                else: #结束了
                    pass
            else:
                pass
        else:
            self.chaxun_button_click = True
            self.chaxun_done = 0
            self.chaxun_p = threading.Thread(target=self.chaxun_start_work)
            self.chaxun_p.start()
        event.Skip()  # 允许事件继续传递

    def clear_button_clean(self, event):
        font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        #label_value = self.manual_input.GetValue()
        #print(label_value)
        if self.manual_input.GetValue() :
            self.txtMulti.Clear()
            self.txtMulti.SetDefaultStyle(text_attr)
            self.txtMulti.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
            #不能加下面的格式,否则 会把提示文本变成有效文本格式了
            #self.txtMulti.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        else:
            self.txtSingl.Clear()
            self.txtSingl.SetDefaultStyle(text_attr)
            self.txtSingl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
            #不能加下面的格式,否则 会把提示文本变成有效文本格式了
            #self.txtSingl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def chaxun_cell_pro(self):
        try:
            value = self.grid
            self.grid.Destroy() #为了防止重叠出现新的grid表格
        except:
            pass

        #开始构建Dialog弹窗: parrent设置为wx.frame 方便后续center居中设置,否则以panel 会导致位置失焦
        #size 大小设置为:125 表头 + 动态根据查询个股个数调整 + 预留位置给保存、关闭按钮
        row_depth = 125+ len(self.chaxun_name)*20+100
        self.xianshi_dialog=wx.Dialog(self,wx.ID_ANY,"查询结果显示", size=(1480,row_depth),style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX)
        self.xianshi_dialog.Center()
        #先创建一个布局panel 方便后续组件的添加
        panel = wx.Panel(self.xianshi_dialog)
        #开始构建保存、关闭按钮
        font = wx.Font(13, wx.DECORATIVE, wx.NORMAL, wx.NORMAL)
        self.grid_save_button = wx.Button(panel, label="保存",  pos = (500, row_depth-100), size = (100, 30) )
        #self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        self.grid_save_button.SetFont(font)
        self.grid_save_button.Bind(wx.EVT_BUTTON,self.grid_save_button_work)
        self.grid_close_button = wx.Button(panel, label="关闭",  pos = (1000, row_depth-100), size = (100, 30))
        ##self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        ##self.grid_close_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.grid_close_button.SetFont(font)
        self.grid_close_button.Bind(wx.EVT_BUTTON,self.grid_close_button_work)
        #开始构建grid 表格   整体表格的高度 稍微多扣除 20(本应该是row_depth-100),因为有一些空白区
        self.grid = wx.grid.Grid(panel,pos=(0,0),size=(1480,row_depth-120))
        #self.grid.Center()
        #print(self.xianshi_dialog.GetPosition())
        #print(self.grid.GetPosition())
        # 创建表格
        self.grid.CreateGrid(len(self.chaxun_name)+2, 15)  # 10行5列的表格
        # 设置表格的标题
        #for l in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        num=0
        for i in "ABCDEFGHIJKLMNO":
            self.grid.SetColLabelValue(num,i)
            num+=1
        #4.1 合并单元格 --- 通过设置大小来实现
        # 合并单元格,合并A1,A2 1列的两个单元格
        self.grid.SetCellSize(0, 0, 2, 1)
        # 合并单元格,合并B1,B2 1列的两个单元格
        self.grid.SetCellSize(0, 1, 2, 1)
        # 合并单元格,合并D1,D2 1列的两个单元格
        self.grid.SetCellSize(0, 3, 2, 1)
        # 合并单元格,合并F,G 1行的两个单元格
        self.grid.SetCellSize(0, 5, 1, 2)
        # 合并单元格,合并I,J 1行的两个单元格
        self.grid.SetCellSize(0, 8, 1, 2)
        # 合并单元格,合并L,M,N,O  4行的4个单元格
        self.grid.SetCellSize(0, 11, 1, 4)
        # 调整列宽  ------  无法调整最小1的宽度,好像是受到了 内部default size的影响了。
        self.grid.SetColSize(2, 1)
        #4.2 定制表头内容 和 设置表头颜色
        self.grid.SetCellValue(0,0,"股票代码") # 合并第1列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,0,"#FFFACD") # 设置颜色
        self.grid.SetCellValue(0,1,"股票名称") # 合并第2列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,1,"#FFFACD")
        self.grid.SetCellValue(0,3,"现价(元)") # 合并第4列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,3,"#FFFACD")
        self.grid.SetCellValue(0,5,"区间最高价(元)") # 合并第1行的 第6列和第7列
        self.grid.SetCellBackgroundColour(0,5,"#FFFACD")
        self.grid.SetCellValue(0,8,"区间最低价(元)") # 合并第1行的 第9列和第10列
        self.grid.SetCellBackgroundColour(0,8,"#FFFACD")
        self.grid.SetCellValue(0,11,"区间平均成交量(股)") # 合并第一行的 第12列和第15列
        self.grid.SetCellBackgroundColour(0,11,"#FFFACD")
        self.grid.SetCellValue(1, 5,self.chaxun_date[0])
        self.grid.SetCellBackgroundColour(1,5,"#E0FFFF")
        self.grid.SetCellValue(1, 6,self.chaxun_date[0])
        self.grid.SetCellBackgroundColour(1,6,"#E0FFFF")
        self.grid.SetCellValue(1, 8,self.chaxun_date[1])
        self.grid.SetCellBackgroundColour(1,8,"#E0FFFF")
        self.grid.SetCellValue(1, 9,self.chaxun_date[1])
        self.grid.SetCellBackgroundColour(1,9,"#E0FFFF")
        self.grid.SetCellValue(1, 11,self.chaxun_date[2])
        self.grid.SetCellBackgroundColour(1,11,"#E0FFFF")
        self.grid.SetCellValue(1, 12,self.chaxun_date[3])
        self.grid.SetCellBackgroundColour(1,12,"#E0FFFF")
        self.grid.SetCellValue(1, 13,self.chaxun_date[4])
        self.grid.SetCellBackgroundColour(1,13,"#E0FFFF")
        self.grid.SetCellValue(1, 14,self.chaxun_date[5])
        self.grid.SetCellBackgroundColour(1,14,"#E0FFFF")

        #4.3将查询结果放置到单元格对应位置上
        for i in range(len(self.chaxun_name)):
            for j in range(len(self.chaxun_name[i])):
                #print(self.chaxun_name[i][j])
                if j < 2 :
                    self.grid.SetCellValue(i+2, j,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j,"#C1FFC1")
                elif j == 2:
                    self.grid.SetCellValue(i+2, j+1,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+1,"#C1FFC1")
                elif j in [3,4]:
                    self.grid.SetCellValue(i+2, j+2,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+2,"#C1FFC1")
                elif j in [5,6]:
                    self.grid.SetCellValue(i+2, j+3,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+3,"#C1FFC1")
                else:
                    self.grid.SetCellValue(i+2, j+4,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+4,"#C1FFC1")
        #4.4 单元格字体等设置
        font = wx.Font(12, wx.ROMAN, wx.NORMAL, wx.BOLD)
        self.grid.SetDefaultCellFont(font)
        #一定要先设字体大小 再自适应,否则就会乱了
        self.grid.AutoSizeColumns()
        #设置背景色
        #self.grid.SetDefaultCellBackgroundColour("#C1FFC1")
        # 设置表格样式
        self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
        #read - only
        self.grid.EnableEditing(False)
        #禁止通过拖拉单元格的线来改变长宽,但是可以通过标签栏Label的线来拖动
        self.grid.DisableDragGridSize()
        self.xianshi_dialog.ShowModal()
        #file_dlg = wx.FileDialog(
        #    parent, message="Save Excel file as...",
        #    wildcard="Excel files (*.xls)|*.xls",
        #    style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT
        #)

        #self.xianshi_dialog.Destroy()

    def display_find_result(self, event):
        if self.chaxun_done :
            self.chaxun_cell_pro()
        elif self.chaxun_button_click:
            mss = wx.MessageBox("信息正在查询中,请稍后再试!","提示",wx.OK | wx.ICON_WARNING)
        else:
            mss = wx.MessageBox("未检测到查询结果 或者 查询被终止!","提示",wx.OK | wx.ICON_WARNING)
        event.Skip()  # 允许事件继续传递

    def grid_save_button_work(self, event):
        # 弹出文件对话框
        file_dlg = wx.FileDialog(self, "Save Excel file as...", wildcard="Excel files (*.xls)|*.xls", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
        if file_dlg.ShowModal() == wx.ID_OK:
            filename = file_dlg.GetPath()
            self.workbook.save(filename)
        file_dlg.Destroy()

    def grid_close_button_work(self, event):
        self.xianshi_dialog.Close()

def main():
    app = wx.App()
    sample = main_fram(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()
 楼主| 发表于 2024-12-30 10:38:41 | 显示全部楼层
    rwb.save("stock_database_collect_change.xls")
错误了
 楼主| 发表于 2024-12-30 11:46:54 | 显示全部楼层
from pdb import post_mortem

import wx
import wx.lib.agw.flatnotebook as fnb
from openpyxl.styles.builtins import styles
from wx.lib.buttons import GenButton
import wx.grid
import time,re,os,sys,subprocess,signal,random,shutil,string
import threading
import datetime,time
import ctypes
import inspect
import xlwt

def async_raise(thread_id, exctype):
    ''''
    通过C语言的库抛出异常
    :param thread_id:
    :param exctype:
    :return:
    '''
    # 在子线程内部抛出一个异常结束线程
    thread_id = ctypes.c_long(thread_id)
    if not inspect.isclass(exctype):
        exctype = type(exctype)
    res = ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, ctypes.py_object(exctype))
    if res == 0:
        raise ValueError("线程id违法")
    elif res != 1:
        ctypes.pythonapi.PyThreadState_SetAsyncExc(thread_id, None)
        raise SystemError("异常抛出失败")


class main_fram(wx.Frame):

    def __init__(self, *args, **kw):
        super(main_fram, self).__init__(*args, **kw,style=wx.DEFAULT_FRAME_STYLE^wx.MAXIMIZE_BOX)
        self.Bind(wx.EVT_CLOSE, self.frame_close)
        #
        self.win_init_set()
        self.pane_2()
        self.chaxun_done = 0
        self.chaxun_name= []
        self.chaxun_date  = []
        self.chaxun_button_click = False
        self.chaxun_p = ""
        self.result = 0
        self.dlg = ""


        #
    def frame_close(self,event):
        #print("退出程序 !!!")
        if self.chaxun_button_click and self.chaxun_done == 0:
            async_raise(self.chaxun_p.ident, SystemExit)
            self.chaxun_button_click = False
        else:
            pass
        self.Destroy()

    def win_init_set(self):
        self.SetTitle("work work !!!")
        self.SetMaxSize((1200, 800))
        self.SetMinSize((1200, 800))
        self.SetSize(1200, 800)
        self.Center()
        #print(self.GetPosition())

    def menu_bar_gen(self):

        menubar = wx.MenuBar()
        fileMenu = wx.Menu()
        fileItem = fileMenu.Append(wx.ID_EXIT, '退出', '退出应用')
        menubar.Append(fileMenu, '文件(&F)')
        self.SetMenuBar(menubar)

        #绑定菜单项的行为
        self.Bind(wx.EVT_MENU, self.OnQuit, fileItem)

    #股票信息查询
    def pane_2(self):
        #1. 创建面板panel  设置背景色
        panel = wx.Panel(self)
        #panel.SetBackgroundColour('#EEE9E9')  # 设置为浅蓝色背景
        panel.SetBackgroundColour('#F5F5F5')  # 设置为white smoke色彩

        #2.创建组件
        #2.1  在一行里面创建的组件
        StaticText=wx.StaticText(panel, label="待查询股票:", pos=(100, 80))
        #设置字体
        font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
        StaticText.SetFont(font)
        #创建2个单选按钮
        self.manual_input = wx.RadioButton(panel, label="手动输入", pos = (400, 80),size=(120,25));
        self.manual_input.SetFont(font)
        self.txt_input = wx.RadioButton(panel, label="文本输入", pos = (600,80),size=(120,25));
        self.txt_input.SetFont(font)
        self.manual_input.Bind(wx.EVT_RADIOBUTTON, self.on_radio_btn_click)
        self.txt_input.Bind(wx.EVT_RADIOBUTTON, self.on_radio_btn_click)
        # 默认选中:手动输入 单选按钮  尽量不要用,会导致聚焦出问题
        #manual_input.SetValue(True)
        #txt_input.SetValue(True)

        #2.2  在下面pos 开始构建manual_input 下面的多行文本控件:
        #多行文本  必须要用wx.TE_RICH2  否则一些格式配置不生效
        self.txtMulti = wx.TextCtrl(panel, wx.ID_ANY, pos = (300, 200), size = (600, 300), style = wx.TE_MULTILINE|wx.TE_RICH2)
        #预埋提示文本的字体、背景色等格式设置
        #设置字体
        font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        #txtMulti.SetFont(font)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        self.txtMulti.SetDefaultStyle(text_attr)
        #预埋提示文本
        self.txtMulti.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
        #通过聚焦和失焦  对预埋的提示文本做处理
        self.txtMulti.Bind(wx.EVT_SET_FOCUS, self.txtMulti_set_focus)  # 绑定事件处理器
        self.txtMulti.Bind(wx.EVT_KILL_FOCUS, self.txtMulti_kill_focus)  # 绑定事件处理器

        #2.3 开始构建txt_input 下面的单行文本控件:
        # 2.3.1 创建一个GenButton---样式更好看一些
        self.file_button = GenButton(panel, label="选择文件",  pos = (805, 200), size = (100, 50))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.file_button.SetBackgroundColour('#F0FFF0')  # 设置按钮背景颜色
        # 设置按钮的样式,可以是:wx.BU_LEFT, wx.BU_TOP, wx.BU_RIGHT, wx.BU_BOTTOM
        self.file_button.SetBezelWidth(2)  # 设置按钮边缘宽度
        self.file_button.SetUseFocusIndicator(False)  # 禁用焦点指示
        #设置字体
        font = wx.Font(14, wx.ROMAN, wx.NORMAL, wx.BOLD)
        self.file_button.SetFont(font)
        #绑定按钮到标准的打开文件function
        self.file_button.Bind(wx.EVT_BUTTON, self.file_button_open)
        # 2.3.2  创建单行带滚动条的文本框
        self.txtSingl = wx.TextCtrl(panel, wx.ID_ANY, pos = (200, 200), size = (600, 50),style = wx.HSCROLL|wx.TE_RICH2)
        #设置字体
        font = wx.Font(14, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        #txtMulti.SetFont(font)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        self.txtSingl.SetDefaultStyle(text_attr)
        #预埋提示文本
        self.txtSingl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
        self.txtSingl.Bind(wx.EVT_SET_FOCUS, self.txtSingl_set_focus)  # 绑定事件处理器
        self.txtSingl.Bind(wx.EVT_KILL_FOCUS, self.txtSingl_kill_focus)  # 绑定事件处理器

        #3. 开始构建工作 按钮:
        #设置字体
        font = wx.Font(16, wx.DECORATIVE, wx.NORMAL, wx.BOLD)
        #3.1 创建一个查询 GenButton
        self.chaxun_button = GenButton(panel, label="查询",  pos = (240, 600), size = (80, 80))
        #self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        self.chaxun_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.chaxun_button.SetFont(font)
        self.chaxun_button.Bind(wx.EVT_BUTTON,self.chaxun_button_work)
        tooltip = wx.ToolTip("点击查询后,再次点击可选择终止!")
        self.chaxun_button.SetToolTip(tooltip)



        #3.2 创建一个清除 GenButton
        self.clear_button = GenButton(panel, label="清除",  pos = (560, 600), size = (80, 80))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.clear_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.clear_button.SetFont(font)
        self.clear_button.Bind(wx.EVT_BUTTON, self.clear_button_clean)
        tooltip = wx.ToolTip("清除填写的待查询股票信息!")
        self.clear_button.SetToolTip(tooltip)

        #3.3 创建一个 显示GenButton
        self.xianshi_button = GenButton(panel, label="显示",  pos = (880, 600), size = (80, 80))
        #self.file_button.SetForegroundColour('white')  # 设置文字颜色
        self.xianshi_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.xianshi_button.SetFont(font)
        tooltip = wx.ToolTip("显示查询结果,选择保存路径!")
        self.xianshi_button.SetToolTip(tooltip)

        self.chaxun_name=[['600519', '贵州茅台', '1,565.80', '1,910.00', '1,910.00', '1,245.83', '1,245.83', '8.45亿', '6.42亿', '5.52亿', '3.77亿'], ['002594', '比亚迪', '283.68', '338.04', '338.04', '159.67', '159.67', '8.06亿', '8.30亿', '6.15亿', '4.03亿'], ['300750', '宁德时代', '273.71', '301.50', '301.50', '135.37', '135.37', '1.38亿', '1.41亿', '2.03亿', '1.98亿'], ['000858', '五粮液', '151.82', '178.76', '211.44', '106.33', '106.33', '8,777.27万', '7,574.12万', '2,322.29万', '3,231.55万'], ['300688', '创业黑马', '--', '39.22', '46.00', '16.43', '15.98', '2,309.20万', '2,726.91万', '2,628.97万', '2,576.41万'], ['300059', '东方财富', '27.91', '31.00', '31.00', '9.87', '9.87', '2,090.15万', '2,014.15万', '2,428.74万', '2,090.65万'], ['002103', '广博股份', '13.77', '18.78', '18.78', '4.55', '4.55', '1,173.60万', '1,212.94万', '1,295.60万', '1,274.40万'], ['000002', '万科A', '8.69', '10.85', '19.22', '6.18', '6.18', '702.39万', '1,248.21万', '851.74万', '767.00万'], ['002607', '中公教育', '4.09', '4.72', '6.38', '1.34', '1.34', '304.99万', '293.59万', '380.20万', '334.32万']]
        self.chaxun_date=['2023.12.13-2024.12.12', '2022.12.13-2024.12.12', '11.28-12.12', '11.13-12.12', '06.13-12.12', '2023.12.13-2024.12.12']
        self.xianshi_button.Bind(wx.EVT_BUTTON,self.display_find_result)


    def on_radio_btn_click(self, event):
        # 获取触发事件的单选按钮
        radio_btn = event.GetEventObject()
        label_value = radio_btn.GetLabel()
        if  label_value == "手动输入":
            self.txtMulti.Show()
            self.txtSingl.Hide()
            self.file_button.Hide()
        else:
            self.txtMulti.Hide()
            self.txtSingl.Show()
            self.file_button.Show()


    def txtMulti_set_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue()
        # 如果值是默认的灰色文本,则清除它
        if  "示例:(多个股票之间用空格)\n东方财富 贵州茅台" in value:
            #要把字体格式恢复到正常模式,方便用户填写
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            text_ctrl.SetFont(font)
            text_ctrl.SetValue("")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtMulti_kill_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue().strip()
        # 如果用户点击了txtMulti文本框,但是一直没有填写任何值,则失焦之后,我们就把提示文本还原回去
        if  "" == value:
            font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
            text_attr = wx.TextAttr()
            #text_attr.SetBackgroundColour("RED")  # 背景色
            text_attr.SetTextColour('#BEBEBE') #灰色
            text_attr.SetFont(font)  # 字体大小、斜体
            text_ctrl.SetDefaultStyle(text_attr)
            text_ctrl.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtSingl_set_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue()
        # 如果值是默认的灰色文本,则清除它
        if  "示例(excel、txt): F:\\for_python_test\stock_database_collect.xls" in value:
            #要把字体格式恢复到正常模式,方便用户填写
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            text_ctrl.SetFont(font)
            text_ctrl.SetValue("")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def txtSingl_kill_focus(self, event):
        # 获取文本框的值
        text_ctrl = event.GetEventObject()
        value = text_ctrl.GetValue().strip()
        # 如果用户点击了txtMulti文本框,但是一直没有填写任何值,则失焦之后,我们就把提示文本还原回去
        if  "" == value:
            font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
            text_attr = wx.TextAttr()
            #text_attr.SetBackgroundColour("RED")  # 背景色
            text_attr.SetTextColour('#BEBEBE') #灰色
            text_attr.SetFont(font)  # 字体大小、斜体
            text_ctrl.SetDefaultStyle(text_attr)
            text_ctrl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
            text_ctrl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def file_button_open(self, event):
        with wx.FileDialog(self, "打开文件", wildcard="Excel文件 (*.xls;*.xlsx)|*.xls;*.xlsx|txt文件 (*.txt)|*.txt",
                           style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) as fileDialog:
            if fileDialog.ShowModal() == wx.ID_CANCEL:
                return  # 用户取消
            file_path = fileDialog.GetPath()
            font = wx.Font(16, wx.ROMAN, wx.NORMAL, wx.NORMAL)
            self.txtSingl.SetFont(font)
            self.txtSingl.SetValue(file_path)
            self.txtSingl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
            self.txtSingl.SetValue(file_path)
            try:
                #with open(path, 'r', encoding='utf-8') as file:
                    #content = file.read()
                    #new_tab = wx.TextCtrl(self.notebook, style=wx.TE_MULTILINE)
                    #new_tab.SetValue(content)
                    #self.notebook.AddPage(new_tab, path.split('/')[-1])
                    pass
            except IOError:
                wx.LogError(f"无法打开文件 '{path}'。")

    def chaxun_start_work(self):
        # chaxun ---------
        #模拟 查询的delay和结果的反馈
        #time.sleep(50)
        cnt=0
        while True:
            time.sleep(1)
            cnt+=1
            if cnt == 2:
                break
            print("wwwwwwwwwww"+str(cnt))
        self.chaxun_name=[['600519', '贵州茅台', '1,565.80', '1,910.00', '1,910.00', '1,245.83', '1,245.83', '8.45亿', '6.42亿', '5.52亿', '3.77亿'], ['002594', '比亚迪', '283.68', '338.04', '338.04', '159.67', '159.67', '8.06亿', '8.30亿', '6.15亿', '4.03亿'], ['300750', '宁德时代', '273.71', '301.50', '301.50', '135.37', '135.37', '1.38亿', '1.41亿', '2.03亿', '1.98亿'], ['000858', '五粮液', '151.82', '178.76', '211.44', '106.33', '106.33', '8,777.27万', '7,574.12万', '2,322.29万', '3,231.55万'], ['300688', '创业黑马', '--', '39.22', '46.00', '16.43', '15.98', '2,309.20万', '2,726.91万', '2,628.97万', '2,576.41万'], ['300059', '东方财富', '27.91', '31.00', '31.00', '9.87', '9.87', '2,090.15万', '2,014.15万', '2,428.74万', '2,090.65万'], ['002103', '广博股份', '13.77', '18.78', '18.78', '4.55', '4.55', '1,173.60万', '1,212.94万', '1,295.60万', '1,274.40万'], ['000002', '万科A', '8.69', '10.85', '19.22', '6.18', '6.18', '702.39万', '1,248.21万', '851.74万', '767.00万'], ['002607', '中公教育', '4.09', '4.72', '6.38', '1.34', '1.34', '304.99万', '293.59万', '380.20万', '334.32万']]
        self.chaxun_date=['2023.12.13-2024.12.12', '2022.12.13-2024.12.12', '11.28-12.12', '11.13-12.12', '06.13-12.12', '2023.12.13-2024.12.12']
        self.chaxun_done = 1
        self.chaxun_button_click = False
        # 创建Excel工作簿
        self.workbook = xlwt.Workbook(encoding="utf-8")
        sheet = self.workbook.add_sheet("Sheet1")
        # 添加数据到工作表
        sheet.write(0, 0, "Hello")
        sheet.write(0, 1, "World")

        #print("00000000000000000")
        #print(self.result)
        #if self.result != wx.ID_YES and self.result != wx.ID_NO:
        #print("11111111111111111")
        #self.dlg.EndModal(self.result)
        mss = wx.MessageBox("       查询已完成!","查询",wx.OK | wx.ICON_INFORMATION)

    def chaxun_button_work(self, event):
        #因为采用的是有模式窗口,所以 dlg窗口弹出 但是用户没来得及选择 同时 查询已完成窗口弹出了,
        # 这时候dlg窗口无论选择什么都没有意义,无需额外处理
        if self.chaxun_button_click :   #如果已经点击了查询,则再次点击时,要询问是否继续查询或者终止查询
            #创建对话框 用于返回用户的选择
            self.dlg = wx.MessageDialog(None, "正在查询中,是否终止查询?", "查询确认", wx.YES_NO | wx.ICON_WARNING)
            self.dlg.Center()
            self.result = self.dlg.ShowModal()
            #print(dlg.Destroy())
            if  self.result == wx.ID_YES and self.chaxun_done == 0:
                if self.chaxun_p.is_alive() : #仍在活跃中
                    async_raise(self.chaxun_p.ident, SystemExit) #强制关闭
                    time.sleep(0.5)
                    mss = wx.MessageBox("       已终止查询!","终止",wx.OK | wx.ICON_WARNING)
                    self.chaxun_button_click = False
                    #print(self.chaxun_p.is_alive())
                else: #结束了
                    pass
            else:
                pass
        else:
            self.chaxun_button_click = True
            self.chaxun_done = 0
            self.chaxun_p = threading.Thread(target=self.chaxun_start_work)
            self.chaxun_p.start()
        event.Skip()  # 允许事件继续传递

    def clear_button_clean(self, event):
        font = wx.Font(16, wx.ROMAN, wx.ITALIC, wx.NORMAL)
        text_attr = wx.TextAttr()
        #text_attr.SetBackgroundColour("RED")  # 背景色
        text_attr.SetTextColour('#BEBEBE') #灰色
        text_attr.SetFont(font)  # 字体大小、斜体
        #label_value = self.manual_input.GetValue()
        #print(label_value)
        if self.manual_input.GetValue() :
            self.txtMulti.Clear()
            self.txtMulti.SetDefaultStyle(text_attr)
            self.txtMulti.AppendText("示例:(多个股票之间用空格)\n东方财富 贵州茅台 631226 005768\n600126 中国移动 300101")
            #不能加下面的格式,否则 会把提示文本变成有效文本格式了
            #self.txtMulti.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        else:
            self.txtSingl.Clear()
            self.txtSingl.SetDefaultStyle(text_attr)
            self.txtSingl.AppendText("示例(excel、txt): F:\\for_python_test\stock_database_collect.xls ")
            #不能加下面的格式,否则 会把提示文本变成有效文本格式了
            #self.txtSingl.SetForegroundColour(wx.SystemSettings.GetColour(wx.SYS_COLOUR_WINDOWTEXT))
        event.Skip()  # 允许事件继续传递

    def chaxun_cell_pro(self):
        try:
            value = self.grid
            self.grid.Destroy() #为了防止重叠出现新的grid表格
        except:
            pass

        #开始构建Dialog弹窗: parrent设置为wx.frame 方便后续center居中设置,否则以panel 会导致位置失焦
        #size 大小设置为:125 表头 + 动态根据查询个股个数调整 + 预留位置给保存、关闭按钮
        row_depth = 125+ len(self.chaxun_name)*20+100
        self.xianshi_dialog=wx.Dialog(self,wx.ID_ANY,"查询结果显示", size=(1480,row_depth),style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER|wx.MAXIMIZE_BOX|wx.MINIMIZE_BOX)
        self.xianshi_dialog.Center()
        #先创建一个布局panel 方便后续组件的添加
        panel = wx.Panel(self.xianshi_dialog)
        #开始构建保存、关闭按钮
        font = wx.Font(13, wx.DECORATIVE, wx.NORMAL, wx.NORMAL)
        self.grid_save_button = wx.Button(panel, label="保存",  pos = (500, row_depth-100), size = (100, 30) )
        #self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        self.grid_save_button.SetFont(font)
        self.grid_save_button.Bind(wx.EVT_BUTTON,self.grid_save_button_work)
        self.grid_close_button = wx.Button(panel, label="关闭",  pos = (1000, row_depth-100), size = (100, 30))
        ##self.chaxun_button.SetForegroundColour('white')  # 设置文字颜色
        ##self.grid_close_button.SetBackgroundColour('#87CEFF')  # 设置按钮背景颜色
        self.grid_close_button.SetFont(font)
        self.grid_close_button.Bind(wx.EVT_BUTTON,self.grid_close_button_work)
        #开始构建grid 表格   整体表格的高度 稍微多扣除 20(本应该是row_depth-100),因为有一些空白区
        self.grid = wx.grid.Grid(panel,pos=(0,0),size=(1480,row_depth-120))
        #self.grid.Center()
        #print(self.xianshi_dialog.GetPosition())
        #print(self.grid.GetPosition())
        # 创建表格
        self.grid.CreateGrid(len(self.chaxun_name)+2, 15)  # 10行5列的表格
        # 设置表格的标题
        #for l in "ABCDEFGHIJKLMNOPQRSTUVWXYZ":
        num=0
        for i in "ABCDEFGHIJKLMNO":
            self.grid.SetColLabelValue(num,i)
            num+=1
        #4.1 合并单元格 --- 通过设置大小来实现
        # 合并单元格,合并A1,A2 1列的两个单元格
        self.grid.SetCellSize(0, 0, 2, 1)
        # 合并单元格,合并B1,B2 1列的两个单元格
        self.grid.SetCellSize(0, 1, 2, 1)
        # 合并单元格,合并D1,D2 1列的两个单元格
        self.grid.SetCellSize(0, 3, 2, 1)
        # 合并单元格,合并F,G 1行的两个单元格
        self.grid.SetCellSize(0, 5, 1, 2)
        # 合并单元格,合并I,J 1行的两个单元格
        self.grid.SetCellSize(0, 8, 1, 2)
        # 合并单元格,合并L,M,N,O  4行的4个单元格
        self.grid.SetCellSize(0, 11, 1, 4)
        # 调整列宽  ------  无法调整最小1的宽度,好像是受到了 内部default size的影响了。
        self.grid.SetColSize(2, 1)
        #4.2 定制表头内容 和 设置表头颜色
        self.grid.SetCellValue(0,0,"股票代码") # 合并第1列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,0,"#FFFACD") # 设置颜色
        self.grid.SetCellValue(0,1,"股票名称") # 合并第2列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,1,"#FFFACD")
        self.grid.SetCellValue(0,3,"现价(元)") # 合并第4列的 第1行和第2行
        self.grid.SetCellBackgroundColour(0,3,"#FFFACD")
        self.grid.SetCellValue(0,5,"区间最高价(元)") # 合并第1行的 第6列和第7列
        self.grid.SetCellBackgroundColour(0,5,"#FFFACD")
        self.grid.SetCellValue(0,8,"区间最低价(元)") # 合并第1行的 第9列和第10列
        self.grid.SetCellBackgroundColour(0,8,"#FFFACD")
        self.grid.SetCellValue(0,11,"区间平均成交量(股)") # 合并第一行的 第12列和第15列
        self.grid.SetCellBackgroundColour(0,11,"#FFFACD")
        self.grid.SetCellValue(1, 5,self.chaxun_date[0])
        self.grid.SetCellBackgroundColour(1,5,"#E0FFFF")
        self.grid.SetCellValue(1, 6,self.chaxun_date[0])
        self.grid.SetCellBackgroundColour(1,6,"#E0FFFF")
        self.grid.SetCellValue(1, 8,self.chaxun_date[1])
        self.grid.SetCellBackgroundColour(1,8,"#E0FFFF")
        self.grid.SetCellValue(1, 9,self.chaxun_date[1])
        self.grid.SetCellBackgroundColour(1,9,"#E0FFFF")
        self.grid.SetCellValue(1, 11,self.chaxun_date[2])
        self.grid.SetCellBackgroundColour(1,11,"#E0FFFF")
        self.grid.SetCellValue(1, 12,self.chaxun_date[3])
        self.grid.SetCellBackgroundColour(1,12,"#E0FFFF")
        self.grid.SetCellValue(1, 13,self.chaxun_date[4])
        self.grid.SetCellBackgroundColour(1,13,"#E0FFFF")
        self.grid.SetCellValue(1, 14,self.chaxun_date[5])
        self.grid.SetCellBackgroundColour(1,14,"#E0FFFF")

        #4.3将查询结果放置到单元格对应位置上
        for i in range(len(self.chaxun_name)):
            for j in range(len(self.chaxun_name[i])):
                #print(self.chaxun_name[i][j])
                if j < 2 :
                    self.grid.SetCellValue(i+2, j,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j,"#C1FFC1")
                elif j == 2:
                    self.grid.SetCellValue(i+2, j+1,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+1,"#C1FFC1")
                elif j in [3,4]:
                    self.grid.SetCellValue(i+2, j+2,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+2,"#C1FFC1")
                elif j in [5,6]:
                    self.grid.SetCellValue(i+2, j+3,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+3,"#C1FFC1")
                else:
                    self.grid.SetCellValue(i+2, j+4,self.chaxun_name[i][j])
                    self.grid.SetCellBackgroundColour(i+2,j+4,"#C1FFC1")
        #4.4 单元格字体等设置
        font = wx.Font(12, wx.ROMAN, wx.NORMAL, wx.BOLD)
        self.grid.SetDefaultCellFont(font)
        #一定要先设字体大小 再自适应,否则就会乱了
        self.grid.AutoSizeColumns()
        #设置背景色
        #self.grid.SetDefaultCellBackgroundColour("#C1FFC1")
        # 设置表格样式
        self.grid.SetDefaultCellAlignment(wx.ALIGN_CENTER, wx.ALIGN_CENTER)
        #read - only
        self.grid.EnableEditing(False)
        #禁止通过拖拉单元格的线来改变长宽,但是可以通过标签栏Label的线来拖动
        self.grid.DisableDragGridSize()
        self.xianshi_dialog.ShowModal()
        #file_dlg = wx.FileDialog(
        #    parent, message="Save Excel file as...",
        #    wildcard="Excel files (*.xls)|*.xls",
        #    style=wx.FD_SAVE|wx.FD_OVERWRITE_PROMPT
        #)

        #self.xianshi_dialog.Destroy()

    def display_find_result(self, event):
        if self.chaxun_done :
            self.chaxun_cell_pro()
        elif self.chaxun_button_click:
            mss = wx.MessageBox("信息正在查询中,请稍后再试!","提示",wx.OK | wx.ICON_WARNING)
        else:
            mss = wx.MessageBox("未检测到查询结果 或者 查询被终止!","提示",wx.OK | wx.ICON_WARNING)
        event.Skip()  # 允许事件继续传递

    def grid_save_button_work(self, event):
        # 弹出文件对话框
        file_dlg = wx.FileDialog(self, "Save Excel file as...", wildcard="Excel files (*.xls)|*.xls", style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT)
        if file_dlg.ShowModal() == wx.ID_OK:
            filename = file_dlg.GetPath()
            self.workbook.save(filename)
        file_dlg.Destroy()

    def grid_close_button_work(self, event):
        self.xianshi_dialog.Close()

def main():
    app = wx.App()
    sample = main_fram(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-22 16:02 , Processed in 0.037802 second(s), 26 queries , Gzip On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表