コード例 #1
0
    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)
コード例 #2
0
ファイル: App.py プロジェクト: nithin8702/impartus-downloader
    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')
コード例 #3
0
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
コード例 #4
0
ファイル: pageDiary.py プロジェクト: aslucky/tkStocker
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