def auto_organize_dialog(self, moved_files): # noqa dialog = Dialogs.create_dialog( on_close_callback=self.on_auto_organize_dialog_close, title='Auto Organize') label = tk.Label( dialog, text='Following files were moved / renamed -', ) label.grid(row=0, column=0, sticky='w', ipadx=10, ipady=10) dialog.columnconfigure(0, weight=1) # show a dialog with the output. sheet = Sheet( Dialogs.dialog, header_font=(self.header_font, self.header_font_size, "bold"), font=(self.content_font, self.content_font_size, "normal"), align='w', row_height="1", # str value for row height in number of lines. row_index_align="w", auto_resize_default_row_index=False, row_index_width=40, header_align='center', empty_horizontal=0, empty_vertical=0, ) sheet.headers(['Source', '', 'Destination']) target_parent = os.path.dirname(self.impartus.download_dir) for row, (source, destination) in enumerate(moved_files.items()): source = source[len(target_parent) + 1:] destination = destination[len(target_parent) + 1:] sheet.insert_row([source, Icons.MOVED_TO, destination]) sheet.set_all_column_widths() sheet.grid(row=1, column=0, sticky='nsew') ok_button = tk.Button(dialog, text='OK', command=self.on_auto_organize_dialog_close) ok_button.grid(row=2, column=0, padx=10, pady=10)
def set_display_widgets(self, subjects, root_url, anchor): """ Create the table/sheet. Fill in the data for table content, Set the buttons and their states. """ cs = self.colorscheme sheet = Sheet( anchor, frame_bg=cs['table']['bg'], table_bg=cs['table']['bg'], table_fg=cs['table']['fg'], table_grid_fg=cs['table']['grid'], top_left_bg=cs['header']['bg'], top_left_fg=cs['header']['bg'], header_bg=cs['header']['bg'], header_fg=cs['header']['fg'], header_font=(self.conf.get("content_font"), 12, "bold"), font=(self.conf.get('content_font'), 14, "normal"), align='center', header_grid_fg=cs['table']['grid'], index_grid_fg=cs['table']['grid'], header_align='center', empty_horizontal=0, empty_vertical=0, header_border_fg=cs['table']['grid'], index_border_fg=cs['table']['grid'], ) self.sheet = sheet sheet.enable_bindings( ("single_select", "column_select", "column_width_resize", "row_height_resize", "rc_select")) self.set_headers() indexes = [x for x, v in self.columns.items() if v['show']] sheet.display_columns(indexes=indexes, enable=True) anchor.columnconfigure(0, weight=1) anchor.rowconfigure(0, weight=1) row = 0 for subject in subjects: videos = self.impartus.get_videos(root_url, subject) slides = self.impartus.get_slides(root_url, subject) video_slide_mapping = self.impartus.map_slides_to_videos( videos, slides) videos = {x['ttid']: x for x in videos} for ttid, video_metadata in videos.items(): video_metadata = Utils.add_fields(video_metadata, video_slide_mapping) video_metadata = Utils.sanitize(video_metadata) video_path = self.impartus.get_mkv_path(video_metadata) slides_path = self.impartus.get_slides_path(video_metadata) video_exists = os.path.exists(video_path) slides_exist = video_slide_mapping.get(ttid) slides_exist_on_disk, slides_path = self.impartus.slides_exist_on_disk( slides_path) metadata = { 'video_metadata': video_metadata, 'video_path': video_path, 'video_exists': video_exists, 'slides_exist': slides_exist, 'slides_exist_on_disk': slides_exist_on_disk, 'slides_url': video_slide_mapping.get(ttid), 'slides_path': slides_path, } row_items = list() button_states = list() for col, item in self.columns.items(): text = '' if item['type'] == 'auto': text = row if item['type'] == 'data': text = video_metadata[item['mapping']] # title case text = text.strip().title() if item.get( 'title_case') else text # truncate long fields if item['truncate'] and len(text) > self.conf.get( 'max_content_chars'): text = '{}..'.format( text[0:self.conf.get('max_content_chars')]) elif item['type'] == 'progressbar': value = 100 if video_exists else 0 text = self.progress_bar_text(value) elif item['type'] == 'button': button_states.append( self.get_button_state(self.names[col], video_exists, slides_exist, slides_exist_on_disk)) text = item.get('text') elif item['type'] == 'state': text = button_states.pop(0) elif item['type'] == 'metadata': text = metadata row_items.append(text) sheet.insert_row(values=row_items, idx='end') row += 1 self.reset_column_sizes() self.decorate() sheet.extra_bindings('column_select', self.sort_table) sheet.extra_bindings('cell_select', self.on_click_button_handler) # update button status self.set_button_status() sheet.grid(row=0, column=0, sticky='nsew')
class PageScreener(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller self.flag = 0 self.FLAG_THRD_SCREEN_DATA = 1 # 处理数据队列 self.queData = Queue() # 数据缓存,用于重复使用, self.listData = [] topFrame = tk.Frame(self) self.btnMainPage = tk.Button(topFrame, text="主页面", command=self.on_btn_main_page).pack( side=tk.LEFT, padx=4) # 日期选择 # Calendar((x, y), 'ur').selection() 获取日期,x,y为点坐标 date_start_gain = lambda: [ self.date_start.set(date) for date in [CalendarCustom(None, 'ul').selection()] if date ] self.btnStart = tk.Button(topFrame, text='选股日期:', command=date_start_gain) self.btnStart.pack(side=tk.LEFT, padx=4) # ret = self.btnStart.winfo_geometry() self.date_start = tk.StringVar() ttk.Entry(topFrame, textvariable=self.date_start).pack(side=tk.LEFT) today = get_last_valid_trade_date() dt = datetime.datetime.strptime(today, '%Y%m%d') today = dt.strftime('%Y-%m-%d') self.date_start.set(today) tk.Label(topFrame, text="选股类型:").pack(side=tk.LEFT) self.screenTypeStr = tk.StringVar() cmbScreenType = ttk.Combobox(topFrame, width=15, textvariable=self.screenTypeStr, state='readonly') # Adding combobox drop down list cmbScreenType['values'] = ('平台突破', '均线附近') cmbScreenType.current(1) cmbScreenType.pack(side=tk.LEFT, padx=4) # cmbScreenType.bind("<<ComboboxSelected>>", self.on_cmb_screen_select) # 选股周期数 self.screenIntervalCountStr = tk.StringVar(value='25') # state=tk.DISABLED 默认禁止输入 self.screenIntervalCount = ttk.Entry( topFrame, width=10, textvariable=self.screenIntervalCountStr) self.screenIntervalCount.pack(side=tk.LEFT, padx=4) # 选股周期类型 self.screenIntervalTypeStr = tk.StringVar() cmbScreenInterval = ttk.Combobox( topFrame, width=8, textvariable=self.screenIntervalTypeStr, state='readonly') # Adding combobox drop down list cmbScreenInterval['values'] = ('日', '周', '月') cmbScreenInterval.current(0) cmbScreenInterval.pack(side=tk.LEFT, padx=4) # cmbScreenInterval.bind("<<ComboboxSelected>>", self.on_cmb_screen_interval_select) self.chkST = tk.IntVar() tk.Checkbutton(topFrame, text="包括ST", variable=self.chkST).pack(side=tk.LEFT, padx=4) self.chkTech = tk.IntVar() tk.Checkbutton(topFrame, text="包括科创板", variable=self.chkTech).pack(side=tk.LEFT, padx=4) self.btnStart = tk.Button(topFrame, text="选股", command=self.on_btn_start) self.btnStart.pack(side=tk.LEFT, padx=4) topFrame.pack(side=tk.TOP, fill=tk.BOTH) self.tipsStr = tk.StringVar() tk.Label(topFrame, textvariable=self.tipsStr, font=("simsun", 12)).pack(side=tk.LEFT) self.tipsStr.set('状态:准备...') # Progress bar widget self.progress = Progressbar(topFrame, orient=tk.HORIZONTAL, length=100, mode='determinate') # self.progress.pack(side=tk.LEFT, padx=4) # self.progress.pack_forget() # 列表框 self.frameReport = tk.Frame(self) self.sheet = Sheet(self.frameReport) self.sheet.enable_bindings(( # "single_select", # "single_select" or "toggle_select" # "drag_select", # enables shift click selection as well # "column_drag_and_drop", # "row_drag_and_drop", # "column_select", "row_select", "column_width_resize", "double_click_column_resize", # "row_width_resize", # "column_height_resize", # "arrowkeys", # "row_height_resize", # "double_click_row_resize", # "right_click_popup_menu", # "rc_select", # "rc_insert_column", # "rc_delete_column", # "rc_insert_row", # "rc_delete_row", # "hide_columns", # "copy", # "cut", # "paste", # "delete", # "undo", # "edit_cell" )) self.sheet.pack(side=tk.TOP, fill=tk.BOTH, expand=1) self.frameReport.pack(side=tk.TOP, fill=tk.BOTH, expand=1, pady=4) self.sheet.headers(['编码', '名称', '板块', '收盘价', '涨幅']) self.sheet.refresh() def on_btn_main_page(self): self.controller.show_frame('PageMain') pass def on_btn_start(self): if self.FLAG_THRD_SCREEN_DATA == self.flag & self.FLAG_THRD_SCREEN_DATA: return self.flag |= self.FLAG_THRD_SCREEN_DATA self.progress.pack(side=tk.LEFT, padx=4) # 获取数据线程,取一个放入队列,由另一个线程处理 # 周期参数 iInterval = int(self.screenIntervalCountStr.get()) # TODO 测试代码, iInterval = 43 type = 'd' if self.screenIntervalTypeStr.get() == '周': type = 'w' elif self.screenIntervalTypeStr.get() == '月': type = 'm' start_date = self.date_start.get().replace('-', '') # 多获取 10 组数据 thrd = threading.Thread(target=dbService.get_data_thread, args=( iInterval + 30, type, self.chkST.get(), self.chkTech.get(), self.queData, start_date, )) thrd.setDaemon(True) # 守护线程 thrd.start() cnt = self.sheet.get_total_rows() for i in range(cnt): self.sheet.delete_row(i) self.sheet.refresh() if self.screenTypeStr.get() == '平台突破': thrd = threading.Thread(target=self.screen_platform, args=(self.queData, )) thrd.setDaemon(True) # 守护线程 thrd.start() elif self.screenTypeStr.get() == '均线附近': thrd = threading.Thread(target=self.screen_ma_around, args=(self.queData, )) thrd.setDaemon(True) # 守护线程 thrd.start() pass def screen_platform(self, in_q): """ 平台突破 找出N天内创新高的股票, :return: """ self.btnStart['state'] = 'disabled' self.tipsStr.set('状态:正在读取数据,请耐心等待...') # 准备数据 iInterval = int(self.screenIntervalCountStr.get()) type = 'd' if self.screenIntervalTypeStr.get() == '周': type = 'w' elif self.screenIntervalTypeStr.get() == '月': type = 'm' self.progress['value'] = 5 # root.update_idletasks() # 避免中间缺数据 * 2 count = iInterval + 5 datas = dbService.get_data(count, type, self.chkST.get(), self.chkTech.get()) screenCount = 0 self.tipsStr.set('状态:正在选股,请耐心等待...') per_interval = len(datas) / 95 step_count = 0 progress_step = 5 pickup_list = [] for it in datas: step_count += 1 if step_count >= per_interval: step_count = 0 progress_step += 1 self.progress['value'] = progress_step # root.update_idletasks() result = platform_break_through(it, iInterval) if result: screenCount += 1 print(result) pickup_list.append(result) pickup_sorted = sorted(pickup_list, key=itemgetter(3), reverse=True) for it in pickup_sorted: self.sheet.insert_row(values=it) self.sheet.refresh() self.progress['value'] = 100 # root.update_idletasks() self.tipsStr.set('状态:共选出 {:d} 只股票'.format(screenCount)) self.flag &= (~self.FLAG_THRD_SCREEN_DATA) self.btnStart['state'] = 'normal' self.progress.pack_forget() print("screen_platform exit ==========") pass def screen_ma_around(self, in_q): """ 参数 120,2 表示 120 日均线,2%附近 ma120*0.98 < 收盘价 < ma120*1.2 :return: """ self.btnStart['state'] = 'disabled' screenCount = 0 self.tipsStr.set('状态:正在处理,请耐心等待...') # 准备数据 param = [(self.screenIntervalCountStr.get())] per_interval = get_code_count() / 95 step_count = 0 progress_step = 5 pickup_list = [] while True: try: it = in_q.get_nowait() except queue.Empty as e1: continue if it is None: break step_count += 1 if step_count >= per_interval: step_count = 0 progress_step += 1 self.progress['value'] = progress_step result = ma25_around(it, param) if result: screenCount += 1 print(result) self.sheet.insert_row(values=result) # self.sheet.refresh() # pickup_list.append(result) # pickup_sorted = sorted(pickup_list, key=itemgetter(3), reverse=True) # # for it in pickup_sorted: # self.sheet.insert_row(values=it) self.progress['value'] = 100 # root.update_idletasks() self.tipsStr.set('状态:共选出 {:d} 只股票'.format(screenCount)) self.flag &= (~self.FLAG_THRD_SCREEN_DATA) self.btnStart['state'] = 'normal' self.progress.pack_forget() self.progress['value'] = 0 print("screen_ma_around exit ==========") pass def tree_solution_selected(self, selected): print('tree_solution_selected items:', selected) pass
class PageDiary(tk.Frame): def __init__(self, parent, controller): tk.Frame.__init__(self, parent) self.controller = controller topFrame = tk.Frame(self) self.btnMainPage = tk.Button(topFrame, text="主页面", command=self.on_btn_main_page).pack( side=tk.LEFT, padx=4) # 日期选择 # Calendar((x, y), 'ur').selection() 获取日期,x,y为点坐标 date_start_gain = lambda: [ self.str_date.set(date) for date in [CalendarCustom(None, 'ur').selection()] if date ] tk.Button(topFrame, text='日期:', command=date_start_gain).pack(side=tk.LEFT, padx=4) self.str_date = tk.StringVar() ttk.Entry(topFrame, textvariable=self.str_date, width=12).pack(side=tk.LEFT) today = datetime.date.today() self.str_date.set(today) tk.Label(topFrame, text="代码:").pack(side=tk.LEFT) self.strCode = tk.StringVar(value='') ttk.Entry(topFrame, width=10, textvariable=self.strCode).pack(side=tk.LEFT, padx=4) tk.Label(topFrame, text="名称:").pack(side=tk.LEFT) self.strName = tk.StringVar(value='') ttk.Entry(topFrame, width=10, textvariable=self.strName).pack(side=tk.LEFT, padx=4) tk.Label(topFrame, text="操作时间:").pack(side=tk.LEFT) self.strTime = tk.StringVar(value='') ttk.Entry(topFrame, width=8, textvariable=self.strTime).pack(side=tk.LEFT, padx=4) # 操作类型 self.operateTypeStr = tk.StringVar() cmbOperateType = ttk.Combobox(topFrame, width=8, textvariable=self.operateTypeStr, state='readonly') # Adding combobox drop down list cmbOperateType['values'] = ('买入', '卖出') cmbOperateType.current(0) cmbOperateType.pack(side=tk.LEFT, padx=4) cmbOperateType.bind("<<ComboboxSelected>>", self.on_cmb_operate_type_select) topFrame2 = tk.Frame(self) tk.Label(topFrame2, text="价格:").pack(side=tk.LEFT, padx=4, pady=2) self.strPrice = tk.StringVar(value='') ttk.Entry(topFrame2, width=8, textvariable=self.strPrice).pack(side=tk.LEFT, padx=4) tk.Label(topFrame2, text="数量:").pack(side=tk.LEFT) self.strAmount = tk.StringVar(value='') ttk.Entry(topFrame2, width=8, textvariable=self.strAmount).pack(side=tk.LEFT, padx=4) tk.Label(topFrame2, text="目标价位:").pack(side=tk.LEFT) self.strTargetPrice = tk.StringVar(value='') ttk.Entry(topFrame2, width=8, textvariable=self.strTargetPrice).pack(side=tk.LEFT, padx=4) tk.Label(topFrame2, text="止损价位:").pack(side=tk.LEFT) self.strStopPrice = tk.StringVar(value='') ttk.Entry(topFrame2, width=8, textvariable=self.strStopPrice).pack(side=tk.LEFT, padx=4) tk.Label(topFrame2, text="收益比:").pack(side=tk.LEFT) self.strProfitRate = tk.StringVar(value='') ttk.Entry(topFrame2, width=8, textvariable=self.strProfitRate).pack(side=tk.LEFT, padx=4) tk.Label(topFrame, text="盈利:").pack(side=tk.LEFT) self.strProfit = tk.StringVar(value='') ttk.Entry(topFrame, width=8, textvariable=self.strProfit).pack(side=tk.LEFT, padx=4) tk.Label(topFrame, text="备注:").pack(side=tk.LEFT) self.text = tk.Text(topFrame, width=50, height=4) self.text.pack(side=tk.LEFT, padx=4) tk.Button(topFrame2, text="添加", width=10, command=self.on_btn_add).pack(side=tk.LEFT, padx=4) topFrame.pack(side=tk.TOP, fill=tk.BOTH) topFrame2.pack(side=tk.TOP, fill=tk.BOTH) # 列表框 self.frameReport = tk.Frame(self) self.sheet = Sheet(self.frameReport) self.sheet.enable_bindings(( "single_select", # "single_select" or "toggle_select" "drag_select", # enables shift click selection as well "column_drag_and_drop", "row_drag_and_drop", "column_select", "row_select", "column_width_resize", "double_click_column_resize", "row_width_resize", "column_height_resize", "arrowkeys", "row_height_resize", "double_click_row_resize", "right_click_popup_menu", "rc_select", "rc_insert_column", "rc_delete_column", "rc_insert_row", "rc_delete_row", "hide_columns", "copy", "cut", "paste", "delete", "undo", "edit_cell")) self.sheet.pack(side=tk.TOP, fill=tk.BOTH, expand=1) self.frameReport.pack(side=tk.TOP, fill=tk.BOTH, expand=1, pady=4) self.sheet.headers([ '日期', '编码', '名称', '操作时间', '操作方向', '价格', '数量', '目标价位', '止损', '收益比', '盈利', '备注' ]) self.sheet.refresh() def on_btn_main_page(self): self.controller.show_frame('PageMain') pass def on_btn_add(self): self.sheet.insert_row(values=(self.str_date.get(), self.strCode.get(), self.strName.get(), self.strTime.get(), self.operateTypeStr.get(), self.strPrice.get(), self.strAmount.get(), self.strTargetPrice.get(), self.strStopPrice.get(), self.strProfitRate.get(), self.strProfit.get(), self.text.get('0.0', tk.END))) self.sheet.refresh() pass def on_cmb_operate_type_select(self, event): if not self.operateTypeStr.get(): pass # self.nameEntered.delete(0, tk.END) # self.nameEntered.insert(0, self.measureTypeStr.get()) pass def tree_solution_selected(self, selected): print('tree_solution_selected items:', selected) pass