def init_platno(self): # Pravljenje okvira za platno okvir_p = LabelFrame(self, text='Zakoračite u svet geometrijskih' ' transformacija', padx=10, pady=10) okvir_p.place(x=10, y=10, height=300, width=430) # Postavljanje platna unutar okvira self.platno = Canvas(okvir_p, height=261, width=405) self.platno.place(x=0, y=0) # Postavljanje koordinatnog sistema na platno; # slika nije lokalna promenljiva, pošto bi je u # tom slučaju 'pojeo' sakupljač otpadaka self.slika = self.učitaj_sliku('koord.gif') self.platno.create_image(203, 131, image=self.slika) # Vezivanje čuvanja tačke za klik na platno self.unos = True self.platno.bind('<Button-1>', self.dodaj_tačku) # Vezivanje promene unosa za desni klik, # a ispravljanja figure za srednji, prema # sugestiji asistenta, čime se dobija na # lakoći korišćenja, bez potrebe za menijem self.platno.bind('<Button-2>', self.ispravi) self.platno.bind('<Button-3>', self.promena_unosa)
def loader(): global loadfilename if loadfilename != None: logger.info(messages.LOADFILE_CLEAR.format(loadfilename)) loadfilename = None # topframe which provides the student file upload utility topframe = Frame(window, bg="#80c1ff") topframe.place(rely=0.06, relx=0.015, relwidth=0.97, relheight=0.22) searchButton = Button(topframe, text="Choose Data File", font=("Roboto", 14, "bold"), fg="Brown", bg="#54EE4A", bd=5, relief="raised", command=lambda: chooseFile(filedisplay)) searchButton.place(relx=0.25, rely=0.32, relwidth=0.50, relheight=0.30) middleframe = LabelFrame(window, bg="#acdcdc", text="File Path", font=("Roboto", 13, "bold")) middleframe.place(rely=0.30, relx=0.015, relwidth=0.97, relheight=0.16) filedisplay = Label(middleframe, bg="#acdcdc", text="No Chosen File", font=("Comic Sans MS", 14)) filedisplay.pack() bottomframe = Frame(window, bg="#BC04BF") bottomframe.place(rely=0.48, relx=0.015, relwidth=0.97, relheight=0.51) loadDataButton = Button(bottomframe, text="Upload data to DB", font=("Roboto", 14, "bold"), fg="Brown", bg="#54EE4A", bd=5, relief="raised", command=lambda: loadData(filedisplay)) loadDataButton.place(rely=0.25, relx=0.25, relheight=0.15, relwidth=0.50) backButton = Button(bottomframe, text="Back to Homepage", font=("Roboto", 14, "bold"), fg="Brown", bg="#54EE4A", bd=5, relief="raised", command=lambda: callHomescreen(allframes)) backButton.place(rely=0.50, relx=0.25, relheight=0.15, relwidth=0.50) allframes = [] allframes.append(middleframe) allframes.append(topframe) allframes.append(bottomframe)
class App_Progressbar(object): """docstring for App_Progressbar""" def __init__(self, master, root, below, styles): super(App_Progressbar, self).__init__() self.master = master self.root = root self.styles = styles self.below = below self.putProgressbar() def putProgressbar(self): self.bar = LabelFrame(self.master, width=0, bg=self.styles['fg'], height=10, borderwidth=0) def set_pct(self, pct): window_width = self.root.winfo_width() desired_px = int(window_width * pct * 0.01) self.bar.config(width=desired_px) def show(self, *args, **kwargs): self.bar.pack() self.bar.place(x=0, y=self.below.winfo_height()) def hide(self, *args, **kwargs): self.bar.place_forget(*args, **kwargs)
def createFrame(self) -> None: # create save button saveBtn = Button(master=self, text="Save", command=self.submit) saveBtn.place(anchor='s', relx=0.5, rely=1, y=(-PAD)) # create containing frame lfrm = LFrame(master=self, text="Anime List") lfrm.place(anchor='n', relx=0.5, rely=0, y=PAD, relwidth=1, width=(-PAD * 2), relheight=1, height=(-PAD * 3 - saveBtn.winfo_reqheight())) # create scrolling frame self.scrFrm = SFrame(master=lfrm, scrollbars='e', padding=PAD, bd=0) self.scrFrm.place(anchor='nw', relx=0, relwidth=1, rely=0, relheight=1) self.scrFrm.columnconfigure(0, weight=1)
def log_frame(self, root): log_frame = LabelFrame(root, text='日志') self.log_info_window = scrolledtext.ScrolledText(log_frame, width=49, height=19, state='disabled') self.log_info_window.grid(row=0, column=0, padx=5, columnspan=500) Button(log_frame, text='导出', width=4, padx=0, pady=0, relief='ridge', command=self.output_log).grid(row=1, column=497, pady=3, columnspan=1) Button(log_frame, text='清空', width=4, padx=0, pady=0, relief='ridge', command=self.clean_log).grid(row=1, column=498, pady=3, columnspan=1) Button(log_frame, text='关于', width=4, padx=0, pady=0, relief='ridge', command=self.about).grid(row=1, column=499, pady=3, columnspan=1) log_frame.place(x=2, y=284)
def download_config(self, root): download_config_frame = LabelFrame(root, text='下载线程数') self.var_thread_num = Scale(download_config_frame, showvalue=True, from_=1, to=50, length=283, orient=HORIZONTAL) self.var_thread_num.grid(row=0, column=0, padx=1, pady=4, columnspan=1) Canvas(download_config_frame, width=77, height=0).grid(row=0, column=1, padx=1, pady=1, columnspan=2) self.download_button = Button(root, text='开始下载', width=10, padx=0, pady=0, command=self.start2download) self.download_button.place(x=297, y=248) download_config_frame.place(x=2, y=208)
def set_download_path(self, root): download_path_frame = LabelFrame(root, text='下载目录') self.var_download_path = StringVar() self.var_download_path.set(self.download_path) download_path_info = Entry(download_path_frame, textvariable=self.var_download_path, width=40) download_path_info.grid(row=0, column=0, padx=3, columnspan=1) Button(download_path_frame, text='更改', width=4, padx=0, pady=0, command=self.change_download_path).grid(row=0, column=1, columnspan=1, padx=3, pady=3) Button(download_path_frame, text='打开', width=4, padx=0, pady=0, command=self.open_download_path).grid(row=0, column=2, columnspan=1, padx=3, pady=3) download_path_frame.place(x=2, y=150)
def Solution(self, master, font, image): if self.pathFound: len1 = len(self.listsolution) message = ">>".join(self.listsolution) list1 = [[0 for i in range(len1)] for j in range(len1)] for i in range(len1 - 1): list1[i][i + 1] = 1 color = "#FDE69F" window = Toplevel(master) window.geometry("700x500") window.configure(bg=color) # Label label1 = Label(window, text="Solution", bg=color, fg="#ED5C5E") label1['font'] = font label1.place(relx=0, rely=0, relwidth=1, relheight=0.1) label_frame1 = LabelFrame(window, bg="white", bd=0) label_frame1.place(relx=0.01, rely=0.11, relwidth=0.98, relheight=0.79) mybutton = Button(window, image=image, bg=color, activebackground=color, bd=0) mybutton.place(relx=0.8, rely=0.905, relheight=1 - 0.905, relwidth=0.2) mybutton.bind("<Button-1>", lambda event: ExitButton(event)) labelmessage = Label(window, bg=color, text="Path : " + message, bd=0, fg="#ED5C5E") labelmessage['font'] = font labelmessage.place(relx=0.01, rely=0.905, relwidth=0.8 - 0.01, relheight=1 - 0.905) graph = DrawGraph(label_frame1, self.listsolution, list1) def ExitButton(event): window.destroy() window.mainloop()
def init_trans(self): # Mapa za preslikavanje niske u # odgavarajuću klasu transformacije self.funkcije = { 'translacija': Trans, 'skaliranje': Skal, 'smicanje': Smic, 'rotacija': Rot, 'refleksija': Refl } # Pravljenje okvira za odabir transformacije okvir_t = LabelFrame(self, text='Izaberite transformaciju', padx=23, pady=7) okvir_t.place(x=18, y=337, height=95, width=158) # U zavisnosti od vrednosti var koju pročitamo iz # padajućeg menija, poziva se prava transformacija self.tr = StringVar(self) self.tr.set('') # Funkcija za praćenje promenljive; izveštava o odabiru # transformacije i kontroliše pristup poljima za unos # parametara u zavisnosti od odabira; nepakovana lista # argumenata *args je neophodna kako bi se prosledili # (i zanemarili) dodatni podaci o promeni odabira, slično # kao što npr. kolbek funkcije u GLUT-u obavezno primaju # koordinate događaja, iako one često nisu nužan podatak self.tr.trace( 'w', lambda *args: print('Odabrana transformacija:' ' {}.'.format(self.tr.get())) or self.kontrola( )) # Padajuća lista geometrijskih transformacija; # umesto dosad korišćene fje place za postavljanje # objekta na tačno određeno mesto na prozoru, ovde # se koristi pack, koji objekat optimalno spakuje # na raspoloživom prostoru; iz tog razloga je i # roditeljski element upravo transformacioni okvir, # u koji se pakuje, a ne self, kako je dosad bilo OptionMenu(okvir_t, self.tr, 'translacija', 'skaliranje', 'smicanje', 'rotacija', 'refleksija').pack(fill='x') # Dugme za pokretanje transformacije self.dugme_t = Button(okvir_t, text='Transformiši', command=self.transformiši, state='disabled') self.dugme_t.pack(fill='x')
def input_plyNo(self, root): input_plyNo_frame = LabelFrame(root, text='保单号导入') self.ctrl_v_input = Entry(input_plyNo_frame, width=40, justify=CENTER) self.ctrl_v_input.grid(row=0, column=0, padx=3, columnspan=1) Button(input_plyNo_frame, text='添加', width=4, padx=0, pady=0, command=self.add1plyNo).grid(row=0, column=1, columnspan=1, padx=3) Button(input_plyNo_frame, text='删除', width=4, padx=0, pady=0, command=self.remove1plyNo).grid(row=0, column=2, columnspan=1, padx=3) self.var_txt_path = StringVar() txt_input = Entry(input_plyNo_frame, textvariable=self.var_txt_path, width=40, justify=CENTER, state='readonly') txt_input.grid(row=1, column=0, padx=3, columnspan=1) Button(input_plyNo_frame, text='.txt导入', width=10, padx=0, pady=0, command=self.txt_input).grid(row=1, column=1, columnspan=2, padx=3, pady=3) self.var_excel_path = StringVar() excel_input = Entry(input_plyNo_frame, textvariable=self.var_excel_path, width=40, justify=CENTER, state='readonly') excel_input.grid(row=2, column=0, padx=3, columnspan=1) Button(input_plyNo_frame, text='Excel导入', width=10, padx=0, pady=0, command=self.excel_input).grid(row=2, column=1, columnspan=2, padx=3) self.var_plyNoLst_info = StringVar() self.show_plyNo = Entry(input_plyNo_frame, textvariable=self.var_plyNoLst_info, width=40, justify=CENTER, state='readonly') self.show_plyNo.grid(row=3, column=0, padx=3, columnspan=1) self.print_plyNoLst() Button(input_plyNo_frame, text='查看', width=4, padx=0, pady=0, command=self.show_all_plyNo).grid(row=3, column=1, columnspan=1, padx=3, pady=3) Button(input_plyNo_frame, text='清空', width=4, padx=0, pady=0, command=self.remove_all_plyNo).grid(row=3, column=2, columnspan=1, padx=3, pady=3) input_plyNo_frame.place(x=2, y=2)
class HowToUsePage(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller self.content = StringVar() self.frame_1 = LabelFrame(self, text="使用说明", height=500, width=500) self.text_1 = Text(self.frame_1, height=5) self.create_page() def create_page(self): cont = """ 支持 Windows、Linux 系统,依赖见 requirement.txt。 源代码更新地址: https://github.com/rachpt/Booking-Assistant 二进制文件更新地址: https://github.com/rachpt/Booking-Assistant/releases 1. 预定前请确保电子账户余额充足; 2 .如果还未到预定开始时间,此时程序会一较慢的速度重试,接近系统开放时,程序会自动以较快的速度重试,直到成功为止; 3. 如果成功预定了一个场地,那么就不能再预定了,如有需求,退出重新打开即可; 4. 如还有其他问题,github 联系我把!...... 2019.12.08 冉成""" self.content.set(cont) self.frame_1.place(x=50, y=50, width=600, height=400) self.text_1.place(x=20, y=20, width=560, height=330) self.text_1.insert("insert", self.content.get()) self.text_1.configure(state=DISABLED, borderwidth=0, fg="Magenta")
class SettingPage(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller self.is_checking = BooleanVar() self.is_checking.set(False) self.var_id = StringVar() self.var_pwd = StringVar() self.ctrl_show_pwd = False self.ctrl_show_pa_pwd = False self.Config_Path = self.controller.Config_Path self.Cookie_Path = self.controller.Cookie_Path self.ROOT = self.controller.ROOT logo_path = path.join(self.ROOT, "config/logo.gif") if not path.isfile(logo_path): from .pic import logo_gif, get_pic get_pic(logo_gif, logo_path) global logo_img logo_img = PhotoImage(file=logo_path) self.label_logo = Label(self, image=logo_img, width=237, height=80) # except Exception: # pass self.label_id = Label(self, text="学号:", anchor=E) self.label_pwd = Label(self, text="统一身份认证密码:", anchor=E) self.entry_id = Entry( self, textvariable=self.var_id, width=60, borderwidth=3, font=("Helvetica", "10"), ) self.entry_pwd = Entry( self, textvariable=self.var_pwd, width=60, borderwidth=3, font=("Helvetica", "10"), ) self.entry_pwd["show"] = "*" self.entry_pwd_eye = Button(self, bitmap="error", width=10, command=self.show_pwd) self.button_login = Button(self, text="验证并保存", command=self.verification) self.button_checking = Button(self, text="正在后台验证用户,请稍等 ...", bg="LightGreen", fg="Red") self.frame = LabelFrame(self, text="更多配置", height=200, width=200) self.var_pa_name = StringVar() self.label_pa_name = Label(self.frame, text="同伴姓名:", anchor=E) self.ertry_pa_name = Entry(self.frame, textvariable=self.var_pa_name) self.var_pa_num = StringVar() self.label_pa_num = Label(self.frame, text="同伴学号:", anchor=E) self.ertry_pa_num = Entry(self.frame, textvariable=self.var_pa_num) self.var_pa_pwd = StringVar() self.label_pa_pwd = Label(self.frame, text="同伴场馆密码:", anchor=E) self.ertry_pa_pwd = Entry(self.frame, textvariable=self.var_pa_pwd) self.ertry_pa_pwd["show"] = "*" self.entry_pa_pwd_eye = Button(self.frame, bitmap="error", width=10, command=self.show_partner_pwd) self.var_sort = StringVar() self.place_sort_prompt = "1至8,空格分割" self.var_sort.set(self.place_sort_prompt) self.label_sort = Label(self.frame, text="预定顺序:", anchor=E) self.entry_sort = Entry(self.frame, textvariable=self.var_sort) self.create_page() def update_button_bar(self): top = 30 height = 30 hspace = 20 middle = 270 f_y = 16 if self.is_checking.get(): self.button_login.place_forget() self.button_checking.place( x=middle - 25, y=top + (height + hspace) * 4 + height * 3 + f_y * 4 + hspace + height + 10, width=250, height=height + 10, ) else: self.button_login.place( x=middle, y=top + (height + hspace) * 4 + height * 3 + f_y * 4 + hspace, width=200, height=height + 10, ) self.button_checking.place_forget() def create_page(self): top = 30 height = 30 hspace = 20 middle = 270 logo_h = 80 logo_w = 237 self.label_logo.place(x=(750 - logo_w) / 2, y=0, width=logo_w, height=logo_h) self.label_id.place(x=190, y=top + logo_h, width=middle - 190, height=height) self.label_pwd.place(x=160, y=top + logo_h + (height + hspace), width=middle - 160, height=height) self.entry_id.place(x=middle, y=top + logo_h, width=250, height=height) self.entry_pwd.place(x=middle, y=top + logo_h + (height + hspace), width=230, height=height) self.entry_pwd_eye.place( x=middle + 220, y=top + logo_h + (height + hspace), width=height, height=height, ) f_x = 30 f_y = 16 f_w1 = 90 f_w2 = 160 f_spx = 26 self.frame.place(x=50, y=top + (height + hspace) * 4, width=630, height=height * 3 + f_y * 4) self.label_pa_name.place(x=f_x, y=f_y, width=f_w1, height=height) self.ertry_pa_name.place(x=f_x + f_w1, y=f_y, width=f_w2, height=height) self.label_pa_num.place(x=f_x + f_w1 + f_w2 + f_spx, y=f_y, width=f_w1, height=height) self.ertry_pa_num.place(x=f_x + f_w1 * 2 + f_w2 + f_spx, y=f_y, width=f_w2, height=height) self.label_pa_pwd.place(x=f_x, y=f_y * 2 + height, width=f_w1, height=height) self.ertry_pa_pwd.place(x=f_x + f_w1, y=f_y * 2 + height, width=f_w2 - height, height=height) self.entry_pa_pwd_eye.place( x=f_x + f_w1 + f_w2 - height, y=f_y * 2 + height, width=height, height=height, ) self.label_sort.place(x=f_x + f_w1 + f_w2 + f_spx, y=f_y * 2 + height, width=f_w1, height=height) self.entry_sort.place( x=f_x + f_w1 * 2 + f_w2 + f_spx, y=f_y * 2 + height, width=f_w2, height=height, ) self.entry_sort.bind("<FocusIn>", self.place_sort_click) self.entry_sort.bind("<FocusOut>", self.place_sort_out) self.entry_sort.config(fg="grey") self.update_button_bar() try: with open(self.Config_Path, "rb") as _file: usrs_info = load(_file) self.var_id.set(usrs_info["student_id"]) self.var_pwd.set(usrs_info["student_pwd"]) self.var_pa_name.set(usrs_info["pa_name"]) self.var_pa_num.set(usrs_info["pa_num"]) self.var_pa_pwd.set(usrs_info["pa_pwd"]) self.var_sort.set(usrs_info["place_sort"]) except (FileNotFoundError, KeyError): pass def place_sort_click(self, event): if self.var_sort.get() == self.place_sort_prompt: self.var_sort.set("") self.entry_sort.config(fg="black") def place_sort_out(self, enent): if self.var_sort.get() == "": self.var_sort.set(self.place_sort_prompt) self.entry_sort.config(fg="grey") def verification(self, auto=False): if auto: self.is_checking.set(True) self.update_button_bar() try: student_id = self.var_id.get() student_pwd = self.var_pwd.get() pa_name = self.var_pa_name.get() pa_num = self.var_pa_num.get() pa_pwd = self.var_pa_pwd.get() param_ok = self.controller.param_ok place_sort = self.var_sort.get().strip() if place_sort == self.place_sort_prompt: place_sort = "" user_info = { "student_id": student_id, "student_pwd": student_pwd, "pa_name": pa_name, "pa_num": pa_num, "pa_pwd": pa_pwd, "place_sort": place_sort, "param_ok": param_ok, } # print(user_info) _up_state = update_cookie(self.Config_Path, self.Cookie_Path) # print(_up_state, auto) if auto and _up_state: # 旧配置 与 cookie 有效 self.controller.param_ok = True if not auto: if pa_num: match_pa_num = match(r"^\w20[\d]{7}$", pa_num) if not match_pa_num: raise Exception("同伴学号格式不对!") if not student_id: raise Exception("请输入学号!") else: # 匹配学号 _match = match(r"^\w20[\d]{7}$", student_id) if not _match: raise Exception("学号格式不对!") if not student_pwd: raise Warning("请输入统一身份认证密码!") if force_update_cookie(self.Cookie_Path, user_info, verify=True): self.controller.param_ok = True with open(self.Config_Path, "wb") as _file: dump(user_info, _file) else: raise RuntimeError("登录失败!") except Warning: pass except Exception as exc: messagebox.showerror("Error", "--" * 28 + "\n身份验证失败:%s" % exc) else: # messagebox.showinfo('提示', '--'*28+'\n =_=用户信息配置有效=_= ') self.controller.show_frame("RunPage") if auto: self.is_checking.set(False) self.update_button_bar() def show_pwd(self): if self.ctrl_show_pwd: self.ctrl_show_pwd = False self.entry_pwd.configure(show="*") else: self.ctrl_show_pwd = True self.entry_pwd.configure(show="") def show_partner_pwd(self): if self.ctrl_show_pa_pwd: self.ctrl_show_pa_pwd = False self.ertry_pa_pwd.configure(show="*") else: self.ctrl_show_pa_pwd = True self.ertry_pa_pwd.configure(show="")
timeLabel = Label(titleFrame, fg="Navy Blue", bg="khaki1", font=('Verdana', 15, 'bold'), padx=4) timeLabel.place(x=1090, y=35) functions.clock(window, timeLabel) dataFrameLeft = LabelFrame(window, relief="sunken", bd=4, text='Pizza Menu (Single 10" size):', bg="khaki1", font=('Verdana', 14, 'bold')) dataFrameLeft.place(x=15, y=105, width=670, height=500) dataFrameRight = LabelFrame(window, relief="sunken", bd=4, text="Beverage(s) / Dessert(s):", bg="khaki1", font=('Verdana', 14, 'bold')) dataFrameRight.place(x=700, y=105, width=650, height=500) dataFrameBottom = Frame(window, relief="sunken", bd=4, bg="khaki1") dataFrameBottom.place(x=15, y=620, width=1335, height=130) #Labels and Buttons #Pizza Labels and Buttons #Veg. Extravaganza Pizza
parser = Parser() #------------------------------------------------window------------------------------------------------ window = Tk() window.geometry("1200x800+250+50") window.resizable(0, 0) window.title("Log parser") #----------------------------------------------fileselect---------------------------------------------- fileFrame = LabelFrame(window, text="Odabir datoteke:", height=94, width=200, borderwidth=2, relief="groove") fileFrame.place(x=5, y=0) filenameLabel = Label(fileFrame, text="Naziv datoteke:") filenameLabel.place(x=10, y=5) loadedFileLabel = Label(fileFrame, text="/", foreground="red") loadedFileLabel.place(x=95, y=5) filenameButton = Button(fileFrame, text="Učitaj datoteku", command=LoadFile) filenameButton.place(x=50, y=35) #----------------------------------------------checkboxes---------------------------------------------- varClientIP = IntVar() varClientID = IntVar() varUsername = IntVar() varDate = IntVar()
class InputWindow(Frame): def __init__(self, master, font_name): global photo_previous, photo_next, photo_new, photo_pick, \ photo_edit, photo_cancel, photo_submit super().__init__(master) # 调用父类的初始化函数 self.master = master self.my_font = Font(family=font_name, size=14) self.my_small_font = Font(family=font_name, size=12) # 部分按钮字体小一点 self.pack(fill=BOTH, expand=1) # 自身Frame最大化 self.pic_stem_file_name = '' # 选到的题干图片 self.pic_ana_file_name = '' # 选到的解析图片 self.db_subject_conn = None self.db_subject_cur = None self.db_personal_conn = sqlite3.connect( ROOT_PATH + "/database/PERSONAL.db") self.db_personal_cur = self.db_personal_conn.cursor() self.exercise_list = None # 查询到的习题列表 self.exercise_num = -1 # 习题列表中的数量 self.tree_selection = {'tag': '', 'subject': ''} # 当前选择的tree元素 self.selection_var = StringVar() self.show = '' # 显示 Stem/Ana self.show_var = StringVar() # 设置ttk的样式 style = ttk.Style() style.theme_use('vista') style.configure( 'Treeview', # treeview的样式 rowheight=27, font=self.my_font) style.configure( 'TCombobox') # combobox的样式 # command_widgets ''' self.select_label = Label( self, textvariable=self.selection_var, fg='blue', font=self.my_font) self.select_label.place(x=225, y=15, anchor='nw') ''' ''' self.status = StringVar() self.status.set('状态:修改->') self.notice_label = Label( self, textvariable=self.status, fg='blue', font=self.my_font) self.notice_label.place(x=920, y=18, anchor='nw') ''' # self.submit_button = Button( # self, # text="提交", # font=self.my_font, # width=8, # height=1, # command=self.submit) # self.submit_button.place(x=1030, y=10, anchor='nw') # exercise_window select_label = Label( self, textvariable=self.show_var, # fg='blue', font=self.my_font) self.exercise_frame = LabelFrame( self, labelwidget=select_label, font=self.my_font, padx=5, pady=5, width=970, height=583) self.exercise_frame.place(x=220, y=5, anchor='nw') # 分隔线 # canvas = Canvas(self.exercise_frame, width=950, height=10) # canvas.place(x=0, y=488, anchor='nw') # canvas.create_line(0, 3, 950, 3, fill='lightgrey') # ComboBox字体修改 self.exercise_frame.option_add("*TCombobox*Listbox*Font", self.my_font) # 题型 model_label = Label(self.exercise_frame, text='题型:', font=self.my_font) model_label.place(x=5, y=5, anchor='nw') self.selected_model = StringVar() values = ('单项填空题', '单项选择题') self.model_combobox = ttk.Combobox( master=self.exercise_frame, # 高度,下拉显示的条目数量 height=10, width=10, # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled state='readonly', # 鼠标移动时样式 arrow, circle, cross, plus... cursor='arrow', font=self.my_font, textvariable=self.selected_model, values=values) self.model_combobox.bind("<<ComboboxSelected>>", self.change_model) self.model_combobox.place(x=55, y=5, anchor='nw') self.model_combobox.current(0) # 设置下拉列表默认显示的值 # 题干类型 stem_label = Label(self.exercise_frame, text='题干:', font=self.my_font) stem_label.place(x=200, y=5, anchor='nw') self.stem_pic_var = StringVar() values = ('文字作为题干', '图片作为题干') self.stem_combobox = ttk.Combobox( master=self.exercise_frame, # 父容器 height=10, # 高度,下拉显示的条目数量 width=11, # 宽度 state='readonly', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus... font=self.my_font, textvariable=self.stem_pic_var, values=values) self.stem_combobox.bind("<<ComboboxSelected>>", self.show_stem) self.stem_combobox.current(0) # 设置下拉列表默认显示的值 self.stem_combobox.place(x=250, y=5, anchor='nw') pic_pick_file_name = ROOT_PATH + "/resource/pick.png" image_pick = Image.open(pic_pick_file_name) photo_pick = ImageTk.PhotoImage(image_pick) self.stem_pic_button = Button( self.exercise_frame, font=self.my_small_font, width=30, height=25, image=photo_pick, command=self.open_stem_pic) self.stem_pic_button.place(x=395, y=5, anchor='nw') # 答案 answer_label = Label(self.exercise_frame, text='答案:', font=self.my_font) answer_label.place(x=445, y=5, anchor='nw') self.answer_var = StringVar() self.answer_editor = Entry( self.exercise_frame, width=20, textvariable=self.answer_var, font=self.my_font) values = ('A', 'B', 'C', 'D') self.answer_combobox = ttk.Combobox( master=self.exercise_frame, # 父容器 height=10, # 高度,下拉显示的条目数量 width=10, # 宽度 state='readonly', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus... font=self.my_font, textvariable=self.answer_var, values=values) self.answer_combobox.current(2) # 设置下拉列表默认显示的值 self.change_model(None) # 调用一次以便按照 # 解析类型 ana_label = Label(self.exercise_frame, text='解析:', font=self.my_font) ana_label.place(x=725, y=5, anchor='nw') self.ana_var = StringVar() values = ('文字作为解析', '图片作为解析') self.ana_combobox = ttk.Combobox( master=self.exercise_frame, # 父容器 height=10, # 高度,下拉显示的条目数量 width=11, # 宽度 state='readonly', # 设置状态 normal(可选可输入)、readonly(只可选)、 disabled cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus... font=self.my_font, textvariable=self.ana_var, values=values) self.ana_combobox.bind("<<ComboboxSelected>>", self.show_ana) self.ana_combobox.current(1) # 设置下拉列表默认显示的值 self.ana_combobox.place(x=775, y=5, anchor='nw') self.ana_pic_button = Button( self.exercise_frame, width=30, height=25, image=photo_pick, command=self.open_ana_pic) self.ana_pic_button.place(x=920, y=5, anchor='nw') # 题干&解析按钮 self.stem_button = Button( self.exercise_frame, text='题干', font=self.my_small_font, width=8, height=1, command=self.show_stem) self.stem_button.place(x=5, y=43, anchor='nw') self.ana_button = Button( self.exercise_frame, text='解析', font=self.my_small_font, width=8, height=1, command=self.show_ana) self.ana_button.place(x=95, y=43, anchor='nw') # 题干&解析呈现 self.stem_editor = Text( self.exercise_frame, width=86, height=16, font=self.my_font) self.stem_canvas = Canvas( self.exercise_frame, width=950, height=400, bg='white') self.ana_editor = Text( self.exercise_frame, width=86, height=16, font=self.my_font) self.ana_canvas = Canvas( self.exercise_frame, width=950, height=400, bg='white') self.tree = ttk.Treeview( self, height=21, show='tree', selectmode='browse') english = self.tree.insert('', 0, 'ENGLISH', text='英语', open=True) self.tree.insert(english, 0, 'words#ENGLISH', text='单词') self.tree.insert(english, 1, 'grammar#ENGLISH', text='语法') geography = self.tree.insert('', 0, 'GEOGRAPHY', text='地理', open=True) self.tree.insert(geography, 0, '53#GEOGRAPHY', text='5+3') self.tree.insert(geography, 1, 'school#GEOGRAPHY', text='校内') biology = self.tree.insert('', 0, 'BIOLOGY', text='生物', open=True) self.tree.insert(biology, 0, '53#BIOLOGY', text='5+3') self.tree.insert(biology, 1, 'school#BIOLOGY', text='校内') math = self.tree.insert('', 0, 'MATH', text='数学', open=True) self.tree.insert(math, 0, '53#MATH', text='5+3') self.tree.insert(math, 1, 'school#MATH', text='校内') chinese = self.tree.insert('', 0, 'CHINESE', text='语文', open=True) self.tree.insert(chinese, 0, '53#CHINESE', text='5+3') self.tree.insert(chinese, 1, 'school#CHINESE', text='校内') physics = self.tree.insert('', 0, 'PHYSICS', text='物理', open=True) self.tree.insert(physics, 0, '53#PHYSICS', text='5+3') self.tree.insert(physics, 1, 'school#PHYSICS', text='校内') xes_math = self.tree.insert(math, 21, 'xes#MATH', text='学而思', open=True) self.tree.bind("<<TreeviewSelect>>", self.tree_select) self.tree.selection_set(xes_math) # 缺省选中学而思 self.tree.place(x=10, y=17, anchor='nw') pic_button_previous_file_name = ROOT_PATH + "/resource/left.png" image_previous = Image.open(pic_button_previous_file_name) photo_previous = ImageTk.PhotoImage(image_previous) self.previous_button = Button( self.exercise_frame, font=self.my_font, width=155, height=36, image=photo_previous, command=self.previous) self.previous_button.place(x=6, y=495, anchor='nw') pic_edit_file_name = ROOT_PATH + "/resource/edit.png" image_edit = Image.open(pic_edit_file_name) photo_edit = ImageTk.PhotoImage(image_edit) self.edit_button = Button( self.exercise_frame, text="新建题目", font=self.my_font, width=155, height=36, image=photo_edit, command=self.edit) self.edit_button.place(x=181, y=495, anchor='nw') pic_button_next_file_name = ROOT_PATH + "/resource/right.png" image_next = Image.open(pic_button_next_file_name) photo_next = ImageTk.PhotoImage(image_next) self.next_button = Button( self.exercise_frame, text="下一题", font=self.my_font, width=155, height=36, image=photo_next, command=self.next) self.next_button.place(x=356, y=495, anchor='nw') pic_button_new_file_name = ROOT_PATH + "/resource/plus.png" image_new = Image.open(pic_button_new_file_name) photo_new = ImageTk.PhotoImage(image_new) self.new_button = Button( self.exercise_frame, font=self.my_font, width=155, height=36, image=photo_new, command=self.new) self.new_button.place(x=650, y=495, anchor='nw') pic_button_cancel_file_name = ROOT_PATH + "/resource/cancel.png" image_cancel = Image.open(pic_button_cancel_file_name) photo_cancel = ImageTk.PhotoImage(image_cancel) self.cancel_button = Button( self.exercise_frame, font=self.my_font, width=155, height=36, image=photo_cancel, command=self.cancel) pic_button_submit_file_name = ROOT_PATH + "/resource/submit.png" image_submit = Image.open(pic_button_submit_file_name) photo_submit = ImageTk.PhotoImage(image_submit) self.submit_button = Button( self.exercise_frame, font=self.my_font, width=155, height=36, image=photo_submit, command=self.submit) self.seq = -1 self.status = '' # browse/new/edit self.show_stem() # 调用一次以便按照 def __del__(self): print("析构函数掉用, 关闭数据库连接") if self.db_subject_cur is not None: self.db_subject_cur.close() if self.db_subject_conn is not None: self.db_subject_conn.close() if self.db_personal_cur is not None: self.db_personal_cur.close() if self.db_personal_conn is not None: self.db_personal_conn.close() def tree_select(self, event): self.selection_var.set(self.tree.selection()[0]) tags = self.selection_var.get().split('#') if len(tags) == 2: tag = tags[0] subject = tags[1] else: return if tag == self.tree_selection.get('tag') \ and subject == self.tree_selection.get('subject'): # tag 和科目都没有变, 数据不用刷新 return if self.db_subject_cur is not None: self.db_subject_cur.close() if self.db_subject_conn is not None: self.db_subject_conn.close() # 更换和打开数据库 subject_db_string = ROOT_PATH + "/database/" + subject + '.db' self.db_subject_conn = sqlite3.connect(subject_db_string) self.db_subject_cur = self.db_subject_conn.cursor() if self.exercise_list is not None: del self.exercise_list self.exercise_list = None # 获取这个科目的题目 sql_string = \ "SELECT " \ " answer.ID AS id," \ " answer.SUB_ID AS sub_id," \ " answer.MODEL AS model," \ " answer.KEY AS key," \ " answer.E_STYLE AS e_style," \ " answer.EXPLAIN AS explain," \ " stem.D_STYLE AS d_style," \ " stem.DES AS stem " \ "FROM " \ "answer NATURAL JOIN stem " \ "WHERE " \ "NODE='" \ + self.selection_var.get() + \ "' " \ "ORDER BY ID DESC" self.exercise_list = self.db_subject_cur.execute(sql_string).fetchall() self.exercise_num = len(self.exercise_list) # 更换新的select self.tree_selection['tag'] = tag self.tree_selection['subject'] = subject self.seq = -1 self.next(None) def previous(self, event=None): e = None seq = self.seq - 1 print("self.exercise_num : ", self.exercise_num) if self.exercise_num <= 0: e = self._empty_exercise() elif seq >= 0: self.seq = seq e = self.exercise_list[self.seq] if e is not None: self._change_status('edit') self._set_exercise(e) self._change_status('browse') def next(self, event=None): e = None seq = self.seq + 1 print("self.exercise_num: %d, self.seq: %d" % (self.exercise_num, self.seq)) if self.exercise_num <= 0: e = self._empty_exercise() elif seq < self.exercise_num: self.seq = seq e = self.exercise_list[self.seq] if e is not None: self._change_status('edit') self._set_exercise(e) self._change_status('browse') @staticmethod def _empty_exercise(): id = -1 sub_id = 0 model = 1 key = ' ' e_style = 1 explain = ' ' d_style = 1 stem = ' ' e = (id, sub_id, model, key, e_style, explain, d_style, stem) return e def _set_exercise(self, e): global photo_stem, photo_ana model = e[2] id = e[0] d_style = e[6] stem = e[7] e_style = e[4] explain = e[5] key = e[3] if id < 0: show_string = \ 'New exercise in ' + \ self.tree.selection()[0] + ' ' + 'Exercise ID: ' + str(-1) else: show_string = \ str(self.seq+1) + ' of ' + str(self.exercise_num) + ' in ' + \ self.tree.selection()[0] + ' ' + 'Exercise ID: ' + str(id) self.show_var.set(show_string) self.model_combobox.current(model - 1) model_string = self.model_combobox.get() print("model string: ", model_string) print("key: ", key) if "单项填空题" == model_string: self.answer_var.set(key) if "单项选择题" == model_string: index = covert_choice_2_index(key) self.answer_combobox.current(index) self.change_model(None) if STYLE.IMG_FILE == d_style and len(stem) > 0: self.stem_combobox.current(d_style - 1) pic_stem_file_name = \ ROOT_PATH + "/raw/" + \ self.tree_selection['subject'] + '/' + \ str(id) + "-stem.png" print(pic_stem_file_name) image_stem = Image.open(pic_stem_file_name) photo_stem = ImageTk.PhotoImage(image_stem) self.stem_canvas.delete("all") self.stem_canvas.create_image(5, 5, anchor=NW, image=photo_stem) if STYLE.TEXT_IN_DB == d_style and len(stem) > 0: print("stem is %s, and insert it" % stem) self.stem_combobox.current(d_style - 1) self.stem_editor.delete('1.0', 'end') self.stem_editor.insert('end', stem) if STYLE.IMG_FILE == e_style and len(explain) > 0: self.ana_combobox.current(e_style - 1) pic_ana_file_name = \ ROOT_PATH + "/raw/" + \ self.tree_selection['subject'] + '/' + \ str(id) + "-ana.png" image_ana = Image.open(pic_ana_file_name) photo_ana = ImageTk.PhotoImage(image_ana) self.ana_canvas.delete("all") self.ana_canvas.create_image(5, 5, anchor=NW, image=photo_ana) if STYLE.TEXT_IN_DB == e_style and len(explain) > 0: self.ana_combobox.current(e_style - 1) self.ana_editor.delete('1.0', 'end') self.ana_editor.insert('end', stem) self.show_stem() def new(self): e = self._empty_exercise() self.new_button.place_forget() self.previous_button.place_forget() self.next_button.place_forget() self.edit_button.place_forget() self.cancel_button.place(x=450, y=495, anchor='nw') self.submit_button.place(x=650, y=495, anchor='nw') self._change_status('new') self._set_exercise(e) def edit(self): self.new_button.place_forget() self.previous_button.place_forget() self.next_button.place_forget() self.edit_button.place_forget() self.cancel_button.place(x=450, y=495, anchor='nw') self.submit_button.place(x=650, y=495, anchor='nw') self._change_status('edit') def cancel(self): if self.exercise_num <= 0: e = self._empty_exercise() elif 0 <= self.seq < self.exercise_num: e = self.exercise_list[self.seq] self.previous_button.place(x=6, y=495, anchor='nw') self.edit_button.place(x=181, y=495, anchor='nw') self.next_button.place(x=356, y=495, anchor='nw') self.new_button.place(x=650, y=495, anchor='nw') self.cancel_button.place_forget() self.submit_button.place_forget() self._change_status('browse') self._set_exercise(e) def submit(self): if 'new' == self.status: self._insert_new() if self.exercise_list is not None: del self.exercise_list self.exercise_list = None # 获取这个科目的题目 sql_string = \ "SELECT " \ " answer.ID AS id," \ " answer.SUB_ID AS sub_id," \ " answer.MODEL AS model," \ " answer.KEY AS key," \ " answer.E_STYLE AS e_style," \ " answer.EXPLAIN AS explain," \ " stem.D_STYLE AS d_style," \ " stem.DES AS stem " \ "FROM " \ "answer NATURAL JOIN stem " \ "WHERE " \ "NODE='" \ + self.selection_var.get() + \ "' " \ "ORDER BY ID DESC" self.exercise_list = self.db_subject_cur.execute(sql_string).fetchall() self.exercise_num = len(self.exercise_list) self.seq = -1 self.next() if 'edit' == self.status: self._update_old() self.previous_button.place(x=6, y=495, anchor='nw') self.edit_button.place(x=181, y=495, anchor='nw') self.next_button.place(x=356, y=495, anchor='nw') self.new_button.place(x=650, y=495, anchor='nw') self.cancel_button.place_forget() self.submit_button.place_forget() def _update_old(self): e = self.exercise_list[self.seq] id_value = e[0] print("update old, id is ", id) model_string = self.model_combobox.get() if "单项选择题" == model_string: _model = Model.SINGLE_CHOICE _key = self.answer_combobox.get() if "单项填空题" == model_string: _model = Model.SINGLE_BLANK _key = self.answer_editor.get().strip() stem_type_string = self.stem_combobox.get() if "图片作为题干" == stem_type_string: _stem_type = STYLE.IMG_FILE _des = self.pic_stem_file_name if "文字作为题干" == stem_type_string: _stem_type = STYLE.TEXT_IN_DB _des = self.stem_editor.get(1.0, END).strip() if len(_des) == 0 or len(_key) == 0: messagebox.showerror(title='出错了!', message='题干或者答案不能为空。') return ana_type_string = self.ana_combobox.get() if "图片作为解析" == ana_type_string: _ana_type = STYLE.IMG_FILE _ana = self.pic_ana_file_name if "文字作为解析" == ana_type_string: _ana_type = STYLE.TEXT_IN_DB _ana = self.ana_editor.get(1.0, END).strip() time_stamp = datetime.datetime.now() time_string = time_stamp.strftime('%Y.%m.%d %H:%M:%S') node_string = self.selection_var.get() values = (_model, _stem_type, _des, time_string, node_string, id_value) print("stem: ", values) update_stem_sql = "UPDATE stem SET MODEL=?, D_STYLE=?, DES=?, " \ "TIME_STAMP=?,NODE=? WHERE ID=?" self.db_subject_cur.execute(update_stem_sql, values) if STYLE.IMG_FILE == _stem_type and len(self.pic_stem_file_name) > 0: src_file = os.path.basename(_des) name, ext = os.path.splitext(src_file) dst_file = \ ROOT_PATH + '/raw/' + self.tree_selection['subject'] + '/' + \ str(id_value) + '-stem' + ext copyfile(self.pic_stem_file_name, dst_file) if STYLE.IMG_FILE == _ana_type and len(self.pic_ana_file_name) > 0: src_file = os.path.basename(_des) name, ext = os.path.splitext(src_file) dst_file = \ ROOT_PATH + '/raw/' + self.tree_selection['subject'] + '/' + \ str(id_value) + '-ana' + ext # print(self.pic_file_name,dst_file) copyfile(self.pic_ana_file_name, dst_file) sub_id = 0 values = (_model, _key, _ana_type, _ana, id_value, sub_id) print("answer: ", values) update_answer_sql = "UPDATE answer SET MODEL=?, KEY=?, E_STYLE=?" \ ", EXPLAIN=? WHERE ID=? AND SUB_ID=?" self.db_subject_cur.execute(update_answer_sql, values) self.db_subject_conn.commit() def _insert_new(self): model_string = self.model_combobox.get() if "单项选择题" == model_string: _model = Model.SINGLE_CHOICE _key = self.answer_combobox.get() if "单项填空题" == model_string: _model = Model.SINGLE_BLANK _key = self.answer_editor.get().strip() stem_type_string = self.stem_combobox.get() if "图片作为题干" == stem_type_string: _stem_type = STYLE.IMG_FILE _des = self.pic_stem_file_name if "文字作为题干" == stem_type_string: _stem_type = STYLE.TEXT_IN_DB _des = self.stem_editor.get(1.0, END).strip() if len(_des) == 0 or len(_key) == 0: messagebox.showerror(title='出错了!', message='题干或者答案不能为空。') return ana_type_string = self.ana_combobox.get() if "图片作为解析" == ana_type_string: _ana_type = STYLE.IMG_FILE _ana = self.pic_ana_file_name if "文字作为解析" == ana_type_string: _ana_type = STYLE.TEXT_IN_DB _ana = self.ana_editor.get(1.0, END).strip() time_stamp = datetime.datetime.now() time_string = time_stamp.strftime('%Y.%m.%d %H:%M:%S') node_string = self.selection_var.get() values = (_model, _stem_type, _des, time_string, node_string) print("stem: ", values) insert_stem_sql = "insert into stem (MODEL, D_STYLE, DES, " \ "TIME_STAMP,NODE) values (?,?,?,?,?)" self.db_subject_cur.execute(insert_stem_sql, values) id_query_sql = "select last_insert_rowid() from stem" id_query_result = self.db_subject_cur.execute(id_query_sql) id_value = id_query_result.fetchone()[0] sub_id = 0 # 子题目, 先固定为0 if STYLE.IMG_FILE == _stem_type and len(self.pic_stem_file_name) > 0: src_file = os.path.basename(_des) name, ext = os.path.splitext(src_file) dst_file = \ ROOT_PATH + '/raw/' + self.tree_selection['subject'] + '/' + \ str(id_value) + '-stem' + ext copyfile(self.pic_stem_file_name, dst_file) if STYLE.IMG_FILE == _ana_type and len(self.pic_ana_file_name) > 0: src_file = os.path.basename(_des) name, ext = os.path.splitext(src_file) dst_file = \ ROOT_PATH + '/raw/' + self.tree_selection['subject'] + '/' + \ str(id_value) + '-ana' + ext # print(self.pic_file_name,dst_file) copyfile(self.pic_ana_file_name, dst_file) values = (id_value, sub_id, _model, _key, _ana_type, _ana) print("answer: ", values) insert_answer_sql = "insert into answer (ID, SUB_ID, MODEL," \ "KEY, E_STYLE, EXPLAIN) values (?,?,?,?,?,?)" self.db_subject_cur.execute(insert_answer_sql, values) subject_string = self.tree_selection['subject'] subject_value = Subject.get_num(subject_string) values = (subject_value, id_value, sub_id, 0, 0, 2.0, 0, '', time_string) print("person: ", values) insert_personal_sql = \ "insert into exercise_info (SUBJECT, ID, SUB_ID, " \ "TIMES, CORRECT, WEIGHT, STATUS, NOTE, TIME_STAMP) " \ "values (?,?,?,?,?,?,?,?,?)" self.db_personal_cur.execute(insert_personal_sql, values) self.db_subject_conn.commit() self.db_personal_conn.commit() def open_stem_pic(self): global photo_stem return_file_name = \ askopenfilename( title='选择题干图片', filetypes=[('png file', '*.png'), ('jpg file', '*.jpg')]) if len(return_file_name) > 0: self.pic_stem_file_name = return_file_name image_stem = Image.open(self.pic_stem_file_name) photo_stem = ImageTk.PhotoImage(image_stem) self.stem_canvas.create_image(5, 5, anchor=NW, image=photo_stem) def open_ana_pic(self): global photo_ana return_file_name = \ askopenfilename( title='选择题干图片', filetypes=[('png file', '*.png'), ('jpg file', '*.jpg')]) if len(return_file_name) > 0: self.pic_ana_file_name = return_file_name # print(self.pic_file_name) image_ana = Image.open(self.pic_ana_file_name) photo_ana = ImageTk.PhotoImage(image_ana) self.ana_canvas.create_image(5, 5, anchor=NW, image=photo_ana) def show_stem(self, event=None): print("call show_stem at ", self.show) self.show = 'Stem' self.ana_button.configure(bg='lightgray', fg='white') self.stem_button.configure(bg='blue', fg='white') stem_type_string = self.stem_combobox.get() print(stem_type_string) self.ana_editor.place_forget() self.ana_canvas.place_forget() if "图片作为题干" == stem_type_string: self.stem_editor.place_forget() self.stem_canvas.place(x=5, y=80, anchor='nw') if "文字作为题干" == stem_type_string: self.stem_canvas.place_forget() self.stem_editor.place(x=5, y=80, anchor='nw') print("editor words: ", self.stem_editor.get(1.0, END)) def show_ana(self, event=None): print("call show_ana at ", self.show) self.show = 'Ana' self.stem_button.configure(bg='lightgray', fg='white') self.ana_button.configure(bg='blue', fg='white') ana_type_string = self.ana_combobox.get() self.stem_editor.place_forget() self.stem_canvas.place_forget() if "图片作为解析" == ana_type_string: self.ana_editor.place_forget() self.ana_canvas.place(x=5, y=80, anchor='nw') if "文字作为解析" == ana_type_string: self.ana_canvas.place_forget() self.ana_editor.place(x=5, y=80, anchor='nw') def change_model(self, event): model_string = self.model_combobox.get() # print(model_string) if "单项选择题" == model_string: self.answer_editor.place_forget() self.answer_combobox.place(x=495, y=5, anchor='nw') if "单项填空题" == model_string: self.answer_combobox.place_forget() self.answer_editor.place(x=495, y=5, anchor='nw') def _change_status(self, new_status): if new_status == self.status: return self.status = new_status if 'browse' == self.status: self._set_edit(DISABLED) if 'new' == self.status: self._set_edit(NORMAL) if 'edit' == self.status: self._set_edit(NORMAL) def _set_edit(self, status): self.model_combobox.configure(state=status) self.stem_combobox.configure(state=status) self.stem_pic_button.configure(state=status) self.ana_pic_button.configure(state=status) self.stem_editor.configure(state=status) self.ana_editor.configure(state=status) self.answer_editor.configure(state=status) self.answer_combobox.configure(state=status) self.ana_combobox.configure(state=status) self.ana_editor.configure(state=status)
stdListBox.configure(yscrollcommand=stdScrollbar.set) stdScrollbar.config(command=stdListBox.yview) #bind event to std listbox so words show in frame 5 stdListBox.bind('<<ListboxSelect>>', onselect) #FRAME 5 backSearchBtn = HoverButton(frame5, text="Search", command=back_search, padx=2, pady=2) backSearchInput = Entry(frame5, width=36, justify = "left", font=('Consolas', 10, 'bold')) backSearchBtn.place(x=10, y=25) backSearchInput.place(x=80, y=25) backMatchCanvas = LabelFrame(frame5, text='Words already standardized w/ selected', bg='grey88', width=350, height=800) backMatchCanvas.place(x=5,y=95) backMatchBox = st.ScrolledText(backMatchCanvas, width=44, height=50, wrap="none") backMatchBox.configure(background = "black", foreground="white", font=('Consolas', 10, 'bold')) backMatchBox.place(x=5,y=5) loadFileBtn = HoverButton(frame5, text="Load", command=load_file, padx=2, pady=2) loadFileBtn.place(x=10,y=910) loadFileInput = Entry(frame5, width=32, justify = "left", font=('Consolas', 10, 'bold')) loadFileInput.place(x=75,y=910) saveFileBtn = HoverButton(frame5, text="Save", command=save_file, padx=2, pady=2) saveFileBtn.place(x=10,y=950) saveFileInput = Entry(frame5, width=32, justify = "left", font=('Consolas', 10, 'bold')) saveFileInput.place(x=75,y=950) # MAIN LOOP
menubar.add_cascade(label='Beta', menu=betaMenu) menubar.add_cascade(label='关于', menu=aboutMenu) aboutMenu.add_command(label='小组', command=lambda: tkinter.messagebox.showinfo("测试中", "测试中")) crawlerMenu.add_command(label='修改uidlist', command = lambda: os.startfile('source'+os.sep+'uidlist.txt')) crawlerMenu.add_separator() crawlerMenu.add_command(label='运行', command=lambda: tkinter.messagebox.showinfo("测试中", "测试中")) betaMenu.add_command(label='导入语料库', command=lambda: tkinter.messagebox.showinfo("测试中", "测试中")) betaMenu.add_command(label='训练模型', command=lambda: tkinter.messagebox.showinfo("测试中", "测试中")) betaMenu.add_separator() betaMenu.add_command(label='分析', command=lambda: tkinter.messagebox.showinfo("测试中", "测试中")) ''' # left label frame leftLabelFrame = LabelFrame(mainWindow, text = "选择要查看的类别", labelanchor="nw") leftLabelFrame.place(relx=0.05, rely=0.05, relwidth=0.9, relheight=0.9) leftBg = Frame(leftLabelFrame) mapBotton1 = Button(leftBg, text = "地图", command = lambda: showWindow('map')).grid(row=1) wordBotton1 = Button(leftBg, text = "词云", command = lambda: showWindow('wordcloud')).grid(row=3) chartBotton1 = Button(leftBg, text = "图表", command = lambda: showWindow('chart')).grid(row=5) betaBotton1 = Button(leftBg, text = "NLP情绪分析(Beta)", command = lambda: showWindow('sentiment')).grid(row=7) emptyBottom1 = Frame(leftBg).grid(row=8) setGrid(leftBg, 20) leftBg.pack() # Right label frame ''' rightLabelFrame = LabelFrame(mainWindow, text = "查看现有示例", labelanchor="nw") rightLabelFrame.place(relx=0.51, rely=0.02, relwidth=0.47, relheight=0.96)
class GeoDemonstrator(Tk, GeoMixinTrans, GeoMixinHelp): # Konstruktor aplikacije def __init__(self): # Log poruka o pokretanju aplikacije print('Dobro došli u aplikaciju GeoDemonstrator!') # Pozivanje konstruktora roditeljske klase super().__init__() # Postavljanje naziva aplikacije self.title('GeoDemonstrator') # Inicijalizacija liste tačaka self.tačke = [] self.ttačke = [] # Inicijalizacija liste identifikatora # na platnu trenutno iscrtanih tačaka self.id_tač = [] # Inicijalizacija figure self.figura = None # Inicijalizacija transformacija iz platna # u iscrtani koordinatni sistem i obrnuto self.puk = Skal(1 / 7, -1 / 7) * Trans(-204, -132) self.kup = Trans(204, 132) * Skal(7, -7) # Inicijalizacija elemenata GKI self.init_gki() # Inicijalizacija elemenata GKI def init_gki(self): # Postavljanje veličine i pozicije prozora self.geometry('450x450+75+75') # Onemogućavanje promene veličine prozora, # pošto je Tk prilično plastičan, pa promene # ugrožavaju zamišljeni izgled aplikacije self.resizable(False, False) # Inicijalizacija glavnog menija self.init_meni() # Inicijalizacija platna self.init_platno() # Kontrola unosa tačaka self.init_unos() # Inicijalizacija glavnog menija def init_meni(self): # Pravljenje glavnog menija meni = Menu(self) # Postavljanje sporednog padajućeg menija self.umeni = Menu(meni) self.umeni.add_command(label='Zaključi unos', command=self.promena_unosa) self.umeni.add_command(label='Ispravi figuru', command=self.ispravi) self.umeni.add_command(label='Očisti platno', command=partial(self.novo_platno, True)) # Postavljanje glavnog menija i vezivanje # komandi za odgovarajuće funkcionalnosti meni.add_cascade(label='Opcije', menu=self.umeni) meni.add_command(label='Pomoć (H)', command=self.pomoć) meni.add_command(label='Info (G)', command=self.info) self.config(menu=meni) # Vezivanje tipki za akcije analogne # onima iz prethodno postavljenog menija; # od F1 se odustalo jer se ne ponaša kako # treba na operativnom sistemu Windows self.bind('<H>', self.pomoć) self.bind('<h>', self.pomoć) self.bind('<G>', self.info) self.bind('<g>', self.info) self.bind('<Escape>', self.kraj) # Vezivanje protokola zatvaranja prozora # za istu akciju kao za Kraj i Escape self.protocol('WM_DELETE_WINDOW', self.kraj) # Inicijalizacija platna def init_platno(self): # Pravljenje okvira za platno okvir_p = LabelFrame(self, text='Zakoračite u svet geometrijskih' ' transformacija', padx=10, pady=10) okvir_p.place(x=10, y=10, height=300, width=430) # Postavljanje platna unutar okvira self.platno = Canvas(okvir_p, height=261, width=405) self.platno.place(x=0, y=0) # Postavljanje koordinatnog sistema na platno; # slika nije lokalna promenljiva, pošto bi je u # tom slučaju 'pojeo' sakupljač otpadaka self.slika = self.učitaj_sliku('koord.gif') self.platno.create_image(203, 131, image=self.slika) # Vezivanje čuvanja tačke za klik na platno self.unos = True self.platno.bind('<Button-1>', self.dodaj_tačku) # Vezivanje promene unosa za desni klik, # a ispravljanja figure za srednji, prema # sugestiji asistenta, čime se dobija na # lakoći korišćenja, bez potrebe za menijem self.platno.bind('<Button-2>', self.ispravi) self.platno.bind('<Button-3>', self.promena_unosa) # Okvir za magični svet transformacija def init_unos(self): # Pravljenje okvira za elemente self.okvir_d = LabelFrame(self, text='Unosite tačke klikovima' ' po platnu', padx=10, pady=10) self.okvir_d.place(x=10, y=315, height=128, width=430) # Inicijalizacija polja sa transformacijama self.init_trans() # Oznake parametara koje korisnik unosi x_koord_labela = Label(self, text='x:') y_koord_labela = Label(self, text='y:') ugao_labela = Label(self, text='\u03b8:') # Postavljanje oznaka na prozor x_koord_labela.place(x=185, y=348) y_koord_labela.place(x=185, y=375) ugao_labela.place(x=185, y=403) # Polja za unos vrednosti transformacija self.x_koord = Entry(self, width=4, state='disabled') self.y_koord = Entry(self, width=4, state='disabled') self.ugao = Entry(self, width=4, state='disabled') # Postavljanje polja na prozor self.x_koord.place(x=200, y=348) self.y_koord.place(x=200, y=375) self.ugao.place(x=200, y=403) # Postavljanje ostalih elemenata self.init_centar() self.init_inverz() # Transformacijski okvir def init_trans(self): # Mapa za preslikavanje niske u # odgavarajuću klasu transformacije self.funkcije = { 'translacija': Trans, 'skaliranje': Skal, 'smicanje': Smic, 'rotacija': Rot, 'refleksija': Refl } # Pravljenje okvira za odabir transformacije okvir_t = LabelFrame(self, text='Izaberite transformaciju', padx=23, pady=7) okvir_t.place(x=18, y=337, height=95, width=158) # U zavisnosti od vrednosti var koju pročitamo iz # padajućeg menija, poziva se prava transformacija self.tr = StringVar(self) self.tr.set('') # Funkcija za praćenje promenljive; izveštava o odabiru # transformacije i kontroliše pristup poljima za unos # parametara u zavisnosti od odabira; nepakovana lista # argumenata *args je neophodna kako bi se prosledili # (i zanemarili) dodatni podaci o promeni odabira, slično # kao što npr. kolbek funkcije u GLUT-u obavezno primaju # koordinate događaja, iako one često nisu nužan podatak self.tr.trace( 'w', lambda *args: print('Odabrana transformacija:' ' {}.'.format(self.tr.get())) or self.kontrola( )) # Padajuća lista geometrijskih transformacija; # umesto dosad korišćene fje place za postavljanje # objekta na tačno određeno mesto na prozoru, ovde # se koristi pack, koji objekat optimalno spakuje # na raspoloživom prostoru; iz tog razloga je i # roditeljski element upravo transformacioni okvir, # u koji se pakuje, a ne self, kako je dosad bilo OptionMenu(okvir_t, self.tr, 'translacija', 'skaliranje', 'smicanje', 'rotacija', 'refleksija').pack(fill='x') # Dugme za pokretanje transformacije self.dugme_t = Button(okvir_t, text='Transformiši', command=self.transformiši, state='disabled') self.dugme_t.pack(fill='x') # Odabir centra transformacije def init_centar(self): # Promenljiva za praćenje self.centar = StringVar(self) self.centar.set(None) self.centar.trace( 'w', lambda *args: print('Odabran {}' ' za centar transformacije.'.format( self.centar.get())) if self.centar.get() != 'None' else None) # Oznaka za odabir centra odabir_centra = Label(self, text='Centar transformacije:') odabir_centra.place(x=265, y=330) # Dugme za transformaciju sa centrom # u koordinatnom početku self.radio1 = Radiobutton(self, text='centar platna', padx=3, variable=self.centar, value='centar platna', state='disabled', command=partial(self.kontrola, True)) self.radio1.place(x=242, y=350) # Dugme za transformaciju sa centrom # u centru mase (baricentru) figure self.radio2 = Radiobutton(self, text='centar mase', padx=3, variable=self.centar, value='centar mase', state='disabled', command=partial(self.kontrola, True)) self.radio2.place(x=242, y=370) # Dugme za transformaciju sa centrom # u korisnički unetoj tački self.radio3 = Radiobutton(self, text='uneta tačka', padx=3, variable=self.centar, value='korisnički unos', state='disabled', command=partial(self.kontrola, True)) self.radio3.place(x=242, y=390) # Oznake za unos centra transformacija t1_labela = Label(self, text='t1:') t2_labela = Label(self, text='t2:') # Postavljanje oznaka na prozor t1_labela.place(x=360, y=358) t2_labela.place(x=360, y=385) # Polja za unos centra transformacija self.t1_koord = Entry(self, width=4, state='disabled') self.t2_koord = Entry(self, width=4, state='disabled') # Postavljanje polja na prozor self.t1_koord.place(x=380, y=358) self.t2_koord.place(x=380, y=385) # Funkcija za praćenje inverza def init_inverz(self): self.inv = BooleanVar(self) self.inv.trace( 'w', lambda *args: print('Odabrana inverzna' ' transformacija.') if self.inv.get() else print('Odabrana klasična transformacija.')) # Dugme za odabir inverza self.inverz = Checkbutton(self, text='Invertuj promenu', variable=self.inv, state='disabled') self.inverz.place(x=262, y=410)
# made by Shreyas Pahune import tkinter as tk from random import randrange import tkinter.font as font from tkinter import messagebox from tkinter import LabelFrame window = tk.Tk() window.title("Guessing Game") window.config(bg="#41aea9") myFont = font.Font(family='Comic Sans MS Bold') window.iconbitmap(r"D:\software/python/endsem_1/favicon.ico") # Constantia Bold # Comic Sans MS Bold lblInst_frame = LabelFrame(window, border=5, width=300, height=45, bg="teal") lblInst_frame.place(x=268, y=26) lblInst = tk.Label(window, text="Guess a number from 0 to 9", bg="#41aea9", fg="#e8ffff", font=myFont) lblLine0_frame = LabelFrame(window, border=5, width=240, height=45, bg="teal") lblLine0_frame.place(x=130, y=155) lblLine0 = tk.Label(window, text="---------------------------------------------------------------------", bg="#41aea9", fg="#e8ffff", font=myFont) lblNoGuess_frame = LabelFrame( window, border=5, width=152, height=45, bg="teal") lblNoGuess_frame.place(x=591, y=155) lblNoGuess = tk.Label(window, text="No of Guesses: 0", bg="#41aea9", fg="#e8ffff", font=myFont) lblMaxGuess = tk.Label(window, text="Max Guess: 3", bg="#41aea9", fg="#e8ffff", font=myFont) lblLine1 = tk.Label(window, text="---------------------------------------------------------------------", bg="#41aea9", fg="#e8ffff", font=myFont)
class GraphicalUserInterface(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.parent = parent self.__initUI() def __initUI(self): self.parent.title("Fuel Manager") # parameters that the user can modify self.__exchvar = BooleanVar() self.__exchrate = True self.__datevar = BooleanVar() self.__datetime = True self.__empty_tank_var = BooleanVar() self.__empty_tank = False self.__airport_file = "input files/airport.csv" self.__aircraft_file = "input files/aircraft.csv" self.__currency_file = "input files/countrycurrency.csv" self.__exchange_rate_file = "input files/currencyrates.csv" self.__itinerary_file = "input files/testroutes.csv" self.__output_file = "bestroutes/bestroutes.csv" self.__home_airport = ["DUB"] self.__other_airports = ["LHR", "CDG", "JFK", "AAL", "AMS", "ORK"] self.__hubs = ["MHP"] self.__stopover_cost = 0 self.__constraints = "JFK AAL / JFK CDG" self.__aircraft_code = "747" # main frame frame = Frame(self, relief=RAISED, borderwidth=1) frame.pack(fill=BOTH, expand=True) self.pack(fill=BOTH, expand=True) # manage single itinerary frame self.manual_frame = LabelFrame(self, text="Manage a single itinerary", font=("Helvetica", 14), width=300) self.manual_frame.place(x=50, y=50) # Empty row to put some space between the other rows and to control the width of this frame because # I don't know what I'm doing self.empty_label = Label(self.manual_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=0, sticky="W") # Text field where user can enter home airport self.home_airport_label = Label(self.manual_frame, width=22, text="Home airport:", anchor='w') self.home_airport_label.grid(row=1, sticky="W") self.home_airport_entry = Entry(self.manual_frame, width=50) self.home_airport_entry.grid(row=2, sticky="E") self.home_airport_entry.insert(0, self.__home_airport) self.empty_label = Label(self.manual_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=3, sticky="W") # Text field where user can enter other airports self.other_airports_label = Label(self.manual_frame, width=22, text="Other airports:", anchor='w') self.other_airports_label.grid(row=4, sticky="W") self.other_airports_entry = Entry(self.manual_frame, width=50) self.other_airports_entry.grid(row=5, sticky="E") self.other_airports_entry.insert(0, self.__other_airports) self.empty_label = Label(self.manual_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=6, sticky="W") # Text field where user can enter aircraft code self.aircraft_label = Label(self.manual_frame, width=22, text="Aircraft code:", anchor='w') self.aircraft_label.grid(row=7, sticky="W") self.aircraft_entry = Entry(self.manual_frame, width=50) self.aircraft_entry.grid(row=8, sticky="E") self.aircraft_entry.insert(0, self.__aircraft_code) self.empty_label = Label(self.manual_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=9, sticky="W") # Text field where user can enter constraints self.constraints_label = Label(self.manual_frame, width=22, text="Constraints:", anchor='w') self.constraints_label.grid(row=13, sticky="W") self.constraints_entry = Entry(self.manual_frame, width=50) self.constraints_entry.grid(row=14, sticky="E") self.constraints_entry.insert(0, self.__constraints) self.constraints_explanation_label = \ Label(self.manual_frame, width=50, text="Each constraint should consist of three-letter airport codes" "\nseparated by spaces. To enter more than one constraint," "\nuse ' / ' to separate them", anchor='w', justify='left') self.constraints_explanation_label.grid(row=15, sticky="W") self.empty_label = Label(self.manual_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=16, sticky="W") # run button self.run_button = Button(self.manual_frame, text='Manage itinerary', command=self.__manage_single_itinerary, bg="#CCE1E8") self.run_button.grid(row=16, sticky="E") # manage list of itineraries frame self.itinerary_list_frame = LabelFrame(self, text="Manage a list of itineraries", font=("Helvetica", 14), width=300) self.itinerary_list_frame.place(x=50, y=375) # Empty row to put some space between the other rows and to control the width of this frame self.empty_label = Label(self.itinerary_list_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=12, sticky="W") # Text field where user can enter itinerary filepath self.itinerary_label = Label(self.itinerary_list_frame, width=22, text="Itinerary list: ", anchor='w') self.itinerary_label.grid(row=13, sticky="W") self.itinerary_entry = Entry(self.itinerary_list_frame, width=50) self.itinerary_entry.grid(row=13, sticky="E") self.itinerary_entry.insert(0, self.__itinerary_file) self.itinerary_button = Button(self.itinerary_list_frame, text='Browse...', command=self.__get_itinerary_filename) self.itinerary_button.grid(row=14, sticky="E") self.empty_label = Label(self.itinerary_list_frame, text=" ", width=60, height=2, font=("Helvetica", 1)) self.empty_label.grid(row=15, sticky="W") # run button self.run_button = Button(self.itinerary_list_frame, text='Manage list of itineraries', command=self.__manage_list, bg="#CCE1E8") self.run_button.grid(row=16, sticky="E") # Fuel management settings frame self.general_frame = LabelFrame(self, text="Fuel management settings", font=("Helvetica", 14), width=300) self.general_frame.place(x=500, y=50) # Empty row to put some space between the other rows and to control the width of this frame self.empty_label = Label(self.general_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=0, sticky="W") # Text field where user can enter hubs self.hubs_label = Label(self.general_frame, width=22, text="Hubs:", anchor='w') self.hubs_label.grid(row=1, sticky="W") self.hubs_entry = Entry(self.general_frame, width=50) self.hubs_entry.grid(row=2, sticky="E") self.hubs_entry.insert(0, self.__hubs) self.empty_label = Label(self.general_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=3, sticky="W") # Text field where user can enter cost of extra stopovers self.stopover_cost_label = Label(self.general_frame, width=40, text="Cost of each extra stopover (euros):", anchor='w') self.stopover_cost_label.grid(row=4, sticky="W") self.stopover_cost_entry = Entry(self.general_frame, width=50) self.stopover_cost_entry.grid(row=5, sticky="E") self.stopover_cost_entry.insert(0, self.__stopover_cost) self.empty_label = Label(self.general_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=6, sticky="W") # bring home extra fuel checkbox self.empty_tank_cb = Checkbutton(self.general_frame, text="Always return to home airport with an empty tank", variable=self.__empty_tank_var, command=self.__empty_tank_toggle) self.empty_tank_cb.grid(row=7, sticky="W") self.empty_label = Label(self.general_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=8, sticky="W") # manage inputs frame self.input_frame = LabelFrame(self, text="Inputs", font=("Helvetica", 14), width=300) self.input_frame.place(x=500, y=250) self.empty_label = Label(self.input_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=0, sticky="W") # Text field where user can enter airport filepath self.airport_label = Label(self.input_frame, width=22, text="Airport list: ", anchor='w') self.airport_label.grid(row=1, sticky="W") self.airport_entry = Entry(self.input_frame, width=50) self.airport_entry.grid(row=1, sticky="E") self.airport_entry.insert(0, self.__airport_file) self.airport_button = Button(self.input_frame, text='Browse...', command=self.__get_airport_filename) self.airport_button.grid(row=2, sticky="E") self.empty_label = Label(self.input_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=3, sticky="W") # Text field where user can enter aircraft filepath self.aircraft_file_label = Label(self.input_frame, width=22, text="Aircraft list: ", anchor='w') self.aircraft_file_label.grid(row=4, sticky="W") self.aircraft_file_entry = Entry(self.input_frame, width=50) self.aircraft_file_entry.grid(row=4, sticky="E") self.aircraft_file_entry.insert(0, self.__aircraft_file) self.aircraft_file_button = Button(self.input_frame, text='Browse...', command=self.__get_aircraft_filename) self.aircraft_file_button.grid(row=5, sticky="E") self.empty_label = Label(self.input_frame, text=" ", width=425, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=6, sticky="W") # Text field where user can enter country-currency filepath self.currency_label = Label(self.input_frame, width=22, text="Currency list: ", anchor='w') self.currency_label.grid(row=7, sticky="W") self.currency_entry = Entry(self.input_frame, width=50) self.currency_entry.grid(row=7, sticky="E") self.currency_entry.insert(0, self.__currency_file) self.currency_button = Button(self.input_frame, text='Browse...', command=self.__get_currency_filename) self.currency_button.grid(row=8, sticky="E") self.empty_label = Label(self.input_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=9, sticky="W") # Text field where user can enter exchange rate filepath self.exchange_rate_label = Label(self.input_frame, width=22, text="Exchange rate list: ", anchor='w') self.exchange_rate_label.grid(row=10, sticky="W") self.exchange_rate_entry = Entry(self.input_frame, width=50) self.exchange_rate_entry.grid(row=10, sticky="E") self.exchange_rate_entry.insert(0, self.__exchange_rate_file) self.exchange_rate_button = Button(self.input_frame, text='Browse...', command=self.__get_exchange_rate_filename) self.exchange_rate_button.grid(row=11, sticky="E") # real-time exchange rates checkbox self.forex = Checkbutton(self.input_frame, text="Use real-time exchange rates", variable=self.__exchvar, command=self.__forex_toggle) self.forex.select() self.forex.grid(row=12, sticky="W") # manage output frame self.output_frame = LabelFrame(self, text="Output", font=("Helvetica", 14), width=300) self.output_frame.place(x=500, y=550) self.empty_label = Label(self.output_frame, text=" ", width=60, height=1, font=("Helvetica", 1)) self.empty_label.grid(row=0, sticky="W") # Text field where user can enter output filepath self.output_label = Label(self.output_frame, width=22, text="Output file: ", anchor='w') self.output_label.grid(row=1, sticky="W") self.output_entry = Entry(self.output_frame, width=50) self.output_entry.grid(row=1, sticky="E") self.output_entry.insert(0, self.__output_file) self.output_button = Button(self.output_frame, text='Browse...', command=self.__get_output_filename) self.output_button.grid(row=2, sticky="E") # append date to output filename checkbox self.datetime_cb = Checkbutton(self.output_frame, text="Append date and time to filename (e.g., bestroutes 20151218 160000.csv)", variable=self.__datevar, command=self.__datetime_toggle) self.datetime_cb.grid(row=3, sticky="W") self.datetime_cb.select() # GUI methods def __forex_toggle(self): if self.__exchvar.get() == True: self.__exchrate = True else: self.__exchrate = False def __datetime_toggle(self): if self.__datevar.get() == True: self.__datetime = True else: self.__datetime = False def __empty_tank_toggle(self): if self.__empty_tank_var.get() == True: self.__empty_tank = True else: self.__empty_tank = False def __get_airport_filename(self): self.__airport_file = filedialog.askopenfilename( filetypes=(("Comma-separated values files", "*.csv"), ("All files", "*.*"))) self.airport_entry.delete(0, END) self.airport_entry.insert(0, self.__airport_file) def __get_aircraft_filename(self): self.__aircraft_file = filedialog.askopenfilename( filetypes=(("Comma-separated values files", "*.csv"), ("All files", "*.*"))) self.aircraft_file_entry.delete(0, END) self.aircraft_file_entry.insert(0, self.__aircraft_file) def __get_currency_filename(self): self.__currency_file = filedialog.askopenfilename( filetypes=(("Comma-separated values files", "*.csv"), ("All files", "*.*"))) self.currency_entry.delete(0, END) self.currency_entry.insert(0, self.__currency_file) def __get_exchange_rate_filename(self): self.__exchange_rate_file = filedialog.askopenfilename( filetypes=(("Comma-separated values files", "*.csv"), ("All files", "*.*"))) self.exchange_rate_entry.delete(0, END) self.exchange_rate_entry.insert(0, self.__exchange_rate_file) def __get_itinerary_filename(self): self.__itinerary_file = filedialog.askopenfilename( filetypes=(("Comma-separated values files", "*.csv"), ("All files", "*.*"))) self.itinerary_entry.delete(0, END) self.itinerary_entry.insert(0, self.__itinerary_file) def __get_output_filename(self): self.__output_file = filedialog.asksaveasfilename(defaultextension=".csv", filetypes=( ("Comma-separated values file", "*.csv"), ("All Files", "*.*"))) self.output_entry.delete(0, END) self.output_entry.insert(0, self.__output_file) def __manage_list(self): # validate user inputs hubs, stopover_cost = validate_inputs_for_list_of_itineraries(self.hubs_entry.get().upper().split(), self.stopover_cost_entry.get()) print("Managing list of itineraries...") manage_list_of_routes(self.__exchrate, self.__datetime, self.__empty_tank, hubs, stopover_cost, self.itinerary_entry.get(), self.airport_entry.get(), self.aircraft_file_entry.get(), self.currency_entry.get(), self.exchange_rate_entry.get(), self.output_entry.get()) def __manage_single_itinerary(self): # validate user inputs try: hubs, stopover_cost, constraints_list, home_airport, other_airports, aircraft_code = \ validate_inputs_for_single_itinerary(self.hubs_entry.get().upper().split(), self.stopover_cost_entry.get(), self.constraints_entry.get().upper().split(), self.home_airport_entry.get().upper(), self.other_airports_entry.get().upper().split(), self.aircraft_entry.get().upper()) except TypeError: return print("Managing single itinerary...") manage_single_route(home_airport, other_airports, aircraft_code, self.__exchrate, self.__datetime, self.__empty_tank, hubs, stopover_cost, constraints_list, self.airport_entry.get(), self.aircraft_file_entry.get(), self.currency_entry.get(), self.exchange_rate_entry.get(), self.output_entry.get())
def ui_process(self): """ Ui主程序 :param :return: """ root = Tk() self.root = root # 设置窗口位置 root.title("豆瓣电影小助手(可筛选、下载自定义电影)----吾爱破解论坛 www.52pojie.cn") self.center_window(root, 1000, 565) root.resizable(0, 0) # 框体大小可调性,分别表示x,y方向的可变性 # 从排行榜 电影搜索布局开始 # 容器控件 labelframe = LabelFrame(root, width=660, height=300, text="搜索电影") labelframe.place(x=5, y=5) self.labelframe = labelframe # 电影类型 L_typeId = Label(labelframe, text='电影类型') L_typeId.place(x=0, y=10) self.L_typeId = L_typeId #下拉列表框 comvalue = StringVar() C_type = ttk.Combobox(labelframe, width=5, textvariable=comvalue, state='readonly') # 将影片类型输入到下拉列表框中 jsonMovieData = loads(movieData) #json数据 movieList = [] for subMovieData in jsonMovieData: #对每一种类的电影题材进行操作 movieList.append(subMovieData['title']) C_type["values"] = movieList #初始化 C_type.current(9) # 选择第一个 C_type.place(x=65, y=8) self.C_type = C_type # 欲获取的电影数量 L_count = Label(labelframe, text='获取数量=') L_count.place(x=150, y=10) self.L_count = L_count # 文本框 T_count = Entry(labelframe, width=5) T_count.delete(0, END) T_count.insert(0, '500') T_count.place(x=220, y=7) self.T_count = T_count # 评分 L_rating = Label(labelframe, text='影片评分>') L_rating.place(x=280, y=10) self.L_rating = L_rating # 文本框 T_rating = Entry(labelframe, width=5) T_rating.delete(0, END) T_rating.insert(0, '8.0') T_rating.place(x=350, y=7) self.T_rating = T_rating # 评价人数 L_vote = Label(labelframe, text='评价人数>') L_vote.place(x=410, y=10) self.L_vote = L_vote # 文本框 T_vote = Entry(labelframe, width=7) T_vote.delete(0, END) T_vote.insert(0, '100000') T_vote.place(x=480, y=7) self.T_vote = T_vote # 查询按钮 #lambda表示绑定的函数需要带参数,请勿删除lambda,否则会出现异常 #thread_it表示新开启一个线程执行这个函数,防止GUI界面假死无响应 B_0 = Button(labelframe, text="从排行榜搜索") B_0.place(x=560, y=10) self.B_0 = B_0 # 框架布局,承载多个控件 frame_root = Frame(labelframe, width=400) frame_l = Frame(frame_root) frame_r = Frame(frame_root) self.frame_root = frame_root self.frame_l = frame_l self.frame_r = frame_r # 表格 columns = ("影片名字", "影片评分", "同类排名", "评价人数") treeview = ttk.Treeview(frame_l, height=10, show="headings", columns=columns) treeview.column("影片名字", width=210, anchor='center') # 表示列,不显示 treeview.column("影片评分", width=210, anchor='center') treeview.column("同类排名", width=100, anchor='center') treeview.column("评价人数", width=100, anchor='center') treeview.heading("影片名字", text="影片名字") # 显示表头 treeview.heading("影片评分", text="影片评分") treeview.heading("同类排名", text="同类排名") treeview.heading("评价人数", text="评价人数") #垂直滚动条 vbar = ttk.Scrollbar(frame_r, command=treeview.yview) treeview.configure(yscrollcommand=vbar.set) treeview.pack() self.treeview = treeview vbar.pack(side=RIGHT, fill=Y) self.vbar = vbar # 框架的位置布局 frame_l.grid(row=0, column=0, sticky=NSEW) frame_r.grid(row=0, column=1, sticky=NS) frame_root.place(x=5, y=70) # 从排行榜 电影搜索布局结束 # 输入关键字 电影搜索布局开始 # 影片名称 L_vote_keyword = Label(labelframe, text='影片名称') L_vote_keyword.place(x=0, y=40) #L_vote_keyword.grid(row=0,column=0) self.L_vote_keyword = L_vote_keyword # 文本框 T_vote_keyword = Entry(labelframe, width=53) T_vote_keyword.delete(0, END) T_vote_keyword.insert(0, '我不是药神') T_vote_keyword.place(x=66, y=37) self.T_vote_keyword = T_vote_keyword # 查询按钮 #lambda表示绑定的函数需要带参数,请勿删除lambda,否则会出现异常 #thread_it表示新开启一个线程执行这个函数,防止GUI界面假死无响应 B_0_keyword = Button(labelframe, text="从关键字搜索") B_0_keyword.place(x=560, y=40) self.B_0_keyword = B_0_keyword # 输入关键字 电影搜索布局结束 # 电影详情布局开始 # 容器控件 labelframe_movie_detail = LabelFrame(root, text="影片详情") labelframe_movie_detail.place(x=670, y=5) self.labelframe_movie_detail = labelframe_movie_detail # 框架布局,承载多个控件 frame_left_movie_detail = Frame(labelframe_movie_detail, width=160, height=280) frame_left_movie_detail.grid(row=0, column=0) self.frame_left_movie_detail = frame_left_movie_detail frame_right_movie_detail = Frame(labelframe_movie_detail, width=160, height=280) frame_right_movie_detail.grid(row=0, column=1) self.frame_right_movie_detail = frame_right_movie_detail #影片图片 label_img = Label(frame_left_movie_detail, text="", anchor=N) label_img.place(x=0, y=0) #布局 self.label_img = label_img # IMDB评分 ft_rating_imdb = font.Font(weight=font.BOLD) label_movie_rating_imdb = Label(frame_left_movie_detail, text="IMDB评分", fg='#7F00FF', font=ft_rating_imdb, anchor=NW) label_movie_rating_imdb.place(x=0, y=250) self.label_movie_rating_imdb = label_movie_rating_imdb # 查询按钮 B_0_imdb = Button(frame_left_movie_detail, text="初始化") B_0_imdb.place(x=115, y=250) self.B_0_imdb = B_0_imdb #影片名字 ft = font.Font(size=15, weight=font.BOLD) label_movie_name = Label(frame_right_movie_detail, text="影片名字", fg='#FF0000', font=ft, anchor=NW) label_movie_name.place(x=0, y=0) self.label_movie_name = label_movie_name #影片评分 ft_rating = font.Font(weight=font.BOLD) label_movie_rating = Label(frame_right_movie_detail, text="影片评价", fg='#7F00FF', font=ft_rating, anchor=NW) label_movie_rating.place(x=0, y=30) self.label_movie_rating = label_movie_rating #影片年代 ft_time = font.Font(weight=font.BOLD) label_movie_time = Label(frame_right_movie_detail, text="影片日期", fg='#666600', font=ft_time, anchor=NW) label_movie_time.place(x=0, y=60) self.label_movie_time = label_movie_time #影片类型 ft_type = font.Font(weight=font.BOLD) label_movie_type = Label(frame_right_movie_detail, text="影片类型", fg='#330033', font=ft_type, anchor=NW) label_movie_type.place(x=0, y=90) self.label_movie_type = label_movie_type #影片演员 label_movie_actor = Label(frame_right_movie_detail, text="影片演员", wraplength=135, justify='left', anchor=NW) label_movie_actor.place(x=0, y=120) self.label_movie_actor = label_movie_actor # 电影详情布局结束 # 在线播放布局开始 labelframe_movie_play_online = LabelFrame(root, width=324, height=230, text="在线观看") labelframe_movie_play_online.place(x=5, y=305) self.labelframe_movie_play_online = labelframe_movie_play_online # 框架布局,承载多个控件 frame_root_play_online = Frame(labelframe_movie_play_online, width=324) frame_l_play_online = Frame(frame_root_play_online) frame_r_play_online = Frame(frame_root_play_online) self.frame_root_play_online = frame_root_play_online self.frame_l_play_online = frame_l_play_online self.frame_r_play_online = frame_r_play_online # 表格 columns_play_online = ("来源名称", "是否免费", "播放地址") treeview_play_online = ttk.Treeview(frame_l_play_online, height=10, show="headings", columns=columns_play_online) treeview_play_online.column("来源名称", width=90, anchor='center') treeview_play_online.column("是否免费", width=80, anchor='center') treeview_play_online.column("播放地址", width=120, anchor='center') treeview_play_online.heading("来源名称", text="来源名称") treeview_play_online.heading("是否免费", text="是否免费") treeview_play_online.heading("播放地址", text="播放地址") #垂直滚动条 vbar_play_online = ttk.Scrollbar(frame_r_play_online, command=treeview_play_online.yview) treeview_play_online.configure(yscrollcommand=vbar_play_online.set) treeview_play_online.pack() self.treeview_play_online = treeview_play_online vbar_play_online.pack(side=RIGHT, fill=Y) self.vbar_play_online = vbar_play_online # 框架的位置布局 frame_l_play_online.grid(row=0, column=0, sticky=NSEW) frame_r_play_online.grid(row=0, column=1, sticky=NS) frame_root_play_online.place(x=5, y=0) # 在线播放布局结束 # 保存到云盘布局开始 labelframe_movie_save_cloud_disk = LabelFrame(root, width=324, height=230, text="云盘搜索") labelframe_movie_save_cloud_disk.place(x=340, y=305) self.labelframe_movie_save_cloud_disk = labelframe_movie_save_cloud_disk # 框架布局,承载多个控件 frame_root_save_cloud_disk = Frame(labelframe_movie_save_cloud_disk, width=324) frame_l_save_cloud_disk = Frame(frame_root_save_cloud_disk) frame_r_save_cloud_disk = Frame(frame_root_save_cloud_disk) self.frame_root_save_cloud_disk = frame_root_save_cloud_disk self.frame_l_save_cloud_disk = frame_l_save_cloud_disk self.frame_r_save_cloud_disk = frame_r_save_cloud_disk # 表格 columns_save_cloud_disk = ("来源名称", "是否有效", "播放地址") treeview_save_cloud_disk = ttk.Treeview( frame_l_save_cloud_disk, height=10, show="headings", columns=columns_save_cloud_disk) treeview_save_cloud_disk.column("来源名称", width=90, anchor='center') treeview_save_cloud_disk.column("是否有效", width=80, anchor='center') treeview_save_cloud_disk.column("播放地址", width=120, anchor='center') treeview_save_cloud_disk.heading("来源名称", text="来源名称") treeview_save_cloud_disk.heading("是否有效", text="是否有效") treeview_save_cloud_disk.heading("播放地址", text="播放地址") #垂直滚动条 vbar_save_cloud_disk = ttk.Scrollbar( frame_r_save_cloud_disk, command=treeview_save_cloud_disk.yview) treeview_save_cloud_disk.configure( yscrollcommand=vbar_save_cloud_disk.set) treeview_save_cloud_disk.pack() self.treeview_save_cloud_disk = treeview_save_cloud_disk vbar_save_cloud_disk.pack(side=RIGHT, fill=Y) self.vbar_save_cloud_disk = vbar_save_cloud_disk # 框架的位置布局 frame_l_save_cloud_disk.grid(row=0, column=0, sticky=NSEW) frame_r_save_cloud_disk.grid(row=0, column=1, sticky=NS) frame_root_save_cloud_disk.place(x=5, y=0) # 保存到云盘布局结束 # BT下载布局开始 labelframe_movie_bt_download = LabelFrame(root, width=324, height=230, text="影视下载") labelframe_movie_bt_download.place(x=670, y=305) self.labelframe_movie_bt_download = labelframe_movie_bt_download # 框架布局,承载多个控件 frame_root_bt_download = Frame(labelframe_movie_bt_download, width=324) frame_l_bt_download = Frame(frame_root_bt_download) frame_r_bt_download = Frame(frame_root_bt_download) self.frame_root_bt_download = frame_root_bt_download self.frame_l_bt_download = frame_l_bt_download self.frame_r_bt_download = frame_r_bt_download # 表格 columns_bt_download = ("来源名称", "是否有效", "播放地址") treeview_bt_download = ttk.Treeview(frame_l_bt_download, height=10, show="headings", columns=columns_bt_download) treeview_bt_download.column("来源名称", width=90, anchor='center') treeview_bt_download.column("是否有效", width=80, anchor='center') treeview_bt_download.column("播放地址", width=120, anchor='center') treeview_bt_download.heading("来源名称", text="来源名称") treeview_bt_download.heading("是否有效", text="是否有效") treeview_bt_download.heading("播放地址", text="播放地址") #垂直滚动条 vbar_bt_download = ttk.Scrollbar(frame_r_bt_download, command=treeview_bt_download.yview) treeview_bt_download.configure(yscrollcommand=vbar_bt_download.set) treeview_bt_download.pack() self.treeview_bt_download = treeview_bt_download vbar_bt_download.pack(side=RIGHT, fill=Y) self.vbar_bt_download = vbar_bt_download # 框架的位置布局 frame_l_bt_download.grid(row=0, column=0, sticky=NSEW) frame_r_bt_download.grid(row=0, column=1, sticky=NS) frame_root_bt_download.place(x=5, y=0) # BT下载布局结束 #项目的一些信息 ft = font.Font(size=14, weight=font.BOLD) project_statement = Label( root, text="豆瓣电影小助手(可筛选、下载自定义电影)----吾爱破解论坛 www.52pojie.cn", fg='#FF0000', font=ft, anchor=NW) project_statement.place(x=5, y=540) self.project_statement = project_statement #绑定事件 treeview.bind('<<TreeviewSelect>>', self.show_movie_data) # 表格绑定选择事件 treeview.bind('<Double-1>', self.open_in_browser_douban_url) # 表格绑定鼠标左键事件 treeview_play_online.bind('<Double-1>', self.open_in_browser) # 表格绑定左键双击事件 treeview_save_cloud_disk.bind( '<Double-1>', self.open_in_browser_cloud_disk) # 表格绑定左键双击事件 treeview_bt_download.bind( '<Double-1>', self.open_in_browser_bt_download) # 表格绑定左键双击事件 B_0.configure( command=lambda: thread_it(self.searh_movie_in_rating)) #按钮绑定单击事件 B_0_keyword.configure( command=lambda: thread_it(self.searh_movie_in_keyword)) #按钮绑定单击事件 B_0_imdb.configure( command=lambda: thread_it(self.show_IDMB_rating)) # 按钮绑定单击事件 T_vote_keyword.bind('<Return>', handlerAdaptor( self.keyboard_T_vote_keyword)) # 文本框绑定选择事件 project_statement.bind('<ButtonPress-1>', self.project_statement_show) # 标签绑定鼠标单击事件 project_statement.bind('<Enter>', self.project_statement_get_focus) # 标签绑定获得焦点事件 project_statement.bind('<Leave>', self.project_statement_lose_focus) # 标签绑定失去焦点事件 root.mainloop()
def ui_process(self): root = Tk() root.iconbitmap('logo.ico') self.root = root # 设置窗口位置 root.title("影视助手") self.center_window(root, 1200, 565) root.resizable(0, 0) # 框体大小可调性,分别表示x,y方向的可变性Ranking #################################################################################################排行榜 ranking_frame = LabelFrame(root, width=200, height=300, text="排行榜") ranking_frame.place(x=5, y=5) label_select = Label(ranking_frame, text='请选择') label_select.place(x=5, y=5) comvalue = StringVar() ranking_type = ttk.Combobox(ranking_frame, width=5, textvariable=comvalue, state='readonly') movieList = ['电视剧', '电影'] ranking_type["values"] = movieList # 初始化 ranking_type.current(0) # 选择第一个 ranking_type.place(x=45, y=5) self.ranking_type = ranking_type # label_bar = Label(ranking_frame, text='条形图') # label_bar.place(x=110, y=5) self.label_bar = Label(ranking_frame, text="条形图", fg="blue", cursor="hand2") self.label_bar.place(x=110, y=10) # self.label_bar.bind("<Button-1>", lambda event: open(r'E:/python projects/project_an/htmls/'+self.ranking_type.get()+r'Bar图.html')) self.label_bar.bind( "<Button-1>", handlerAdaptor(fun=self.openLocalHtml, url='Bar图.html')) self.label_reli = Label(ranking_frame, text="热力图", fg="blue", cursor="hand2") self.label_reli.place(x=150, y=10) # self.label_reli.bind("<Button-1>", lambda event: open(HTLMSPATH+self.ranking_type.get()+r'热力图.html')) self.label_reli.bind( "<Button-1>", handlerAdaptor(fun=self.openLocalHtml, url='热力图.html')) frame_root_ranking = Frame(ranking_frame) frame_l_ranking = Frame(frame_root_ranking) frame_r_ranking = Frame(frame_root_ranking) self.ranking_frame = ranking_frame self.frame_l_ranking = frame_l_ranking self.frame_r_ranking = frame_r_ranking columns = ("名字", "热度") treeview_ranking = ttk.Treeview(frame_l_ranking, height=10, show="headings", columns=columns) treeview_ranking.column("名字", width=100, anchor='center') # 表示列,不显示 treeview_ranking.column("热度", width=60, anchor='center') treeview_ranking.heading("名字", text="名字") # 显示表头 treeview_ranking.heading("热度", text="热度") # 垂直滚动条 vbar_ranking = ttk.Scrollbar(frame_r_ranking, command=treeview_ranking.yview) treeview_ranking.configure(yscrollcommand=vbar_ranking.set) treeview_ranking.pack() self.treeview_ranking = treeview_ranking vbar_ranking.pack(side=RIGHT, fill=Y) self.vbar_ranking = vbar_ranking # 框架的位置布局 frame_l_ranking.grid(row=0, column=0, sticky=NSEW) frame_r_ranking.grid(row=0, column=1, sticky=NS) frame_root_ranking.place(x=5, y=45) #################################################################################################搜索电影 # 容器控件 labelframe = LabelFrame(root, width=650, height=300, text="搜索电影(点击搜索结果查看详情)") labelframe.place(x=215, y=5) self.labelframe = labelframe # 电影搜索 # 影片名称 L_vote_keyword = Label(labelframe, text='影片名称') L_vote_keyword.place(x=0, y=10) #L_vote_keyword.grid(row=0,column=0) self.L_vote_keyword = L_vote_keyword # 文本框 T_vote_keyword = Entry(labelframe, width=53) T_vote_keyword.delete(0, END) T_vote_keyword.insert(0, '') T_vote_keyword.place(x=66, y=7) self.T_vote_keyword = T_vote_keyword # 查询按钮 #lambda表示绑定的函数需要带参数,请勿删除lambda,否则会出现异常 #thread_it表示新开启一个线程执行这个函数,防止GUI界面假死无响应 B_0_keyword = Button(labelframe, text="搜索") B_0_keyword.place(x=460, y=7) frame_root = Frame(labelframe, width=400) frame_l = Frame(frame_root) frame_r = Frame(frame_root) self.frame_root = frame_root self.frame_l = frame_l self.frame_r = frame_r self.B_0_keyword = B_0_keyword columns = ("名字", "评分", "相关") treeview = ttk.Treeview(frame_l, height=10, show="headings", columns=columns) treeview.column("名字", width=120, anchor='center') # 表示列,不显示 treeview.column("评分", width=120, anchor='center') treeview.column("相关", width=280, anchor='center') treeview.heading("名字", text="名字") # 显示表头 treeview.heading("评分", text="评分") treeview.heading("相关", text="相关") # 垂直滚动条 vbar = ttk.Scrollbar(frame_r, command=treeview.yview) treeview.configure(yscrollcommand=vbar.set) # rbar = ttk.Scrollbar(frame_r, command=treeview.xview) # treeview.configure(xscrollcommand=rbar.set) treeview.pack() self.treeview = treeview vbar.pack(side=RIGHT, fill=Y) self.vbar = vbar # rbar.pack(side= BOTTOM, fill=X) # self.rbar = rbar # 框架的位置布局 frame_l.grid(row=0, column=0, sticky=NSEW) frame_r.grid(row=0, column=1, sticky=NS) frame_root.place(x=5, y=45) #################################################################################################详情 labelframe_movie_detail = LabelFrame(root, text="影片详情") labelframe_movie_detail.place(x=770, y=5) self.labelframe_movie_detail = labelframe_movie_detail # 框架布局,承载多个控件 frame_left_movie_detail = Frame(labelframe_movie_detail, width=160, height=380) frame_left_movie_detail.grid(row=0, column=0) self.frame_left_movie_detail = frame_left_movie_detail frame_right_movie_detail = Frame(labelframe_movie_detail, width=260, height=380) frame_right_movie_detail.grid(row=0, column=1) self.frame_right_movie_detail = frame_right_movie_detail #影片图片 self.label_img = Label(frame_left_movie_detail, text="", anchor=N) self.label_img.place(x=0, y=0) #布局 self.label_img = self.label_img self.douban = Label(frame_left_movie_detail, text="", fg="blue", cursor="hand2") self.douban.place(x=0, y=210) self.douban.bind("<Button-1>", lambda event: open(self.doubanUrl)) ft = font.Font(size=8, weight=font.BOLD) label_details = Label(frame_right_movie_detail, text='', justify='left', anchor=NW, wraplength=250) label_details.place(x=10, y=10) # label_details.pack() self.label_details = label_details #################################################################################################在线播放 labelframe_movie_play_online = LabelFrame(root, width=310, height=235, text="在线观看(双击播放)") labelframe_movie_play_online.place(x=5, y=305) self.labelframe_movie_play_online = labelframe_movie_play_online # 框架布局,承载多个控件 frame_root_play_online = Frame(labelframe_movie_play_online, width=324) frame_l_play_online = Frame(frame_root_play_online) frame_r_play_online = Frame(frame_root_play_online) self.frame_root_play_online = frame_root_play_online self.frame_l_play_online = frame_l_play_online self.frame_r_play_online = frame_r_play_online # 表格 columns_play_online = ("名称", "来源", "播放地址") treeview_play_online = ttk.Treeview(frame_l_play_online, height=9, show="headings", columns=columns_play_online) treeview_play_online.column("名称", width=110, anchor='center') treeview_play_online.column("来源", width=50, anchor='center') treeview_play_online.column("播放地址", width=120, anchor='center') treeview_play_online.heading("名称", text="名称") treeview_play_online.heading("来源", text="来源") treeview_play_online.heading("播放地址", text="播放地址") #垂直滚动条 vbar_play_online = ttk.Scrollbar(frame_r_play_online, command=treeview_play_online.yview) treeview_play_online.configure(yscrollcommand=vbar_play_online.set) treeview_play_online.pack() self.treeview_play_online = treeview_play_online vbar_play_online.pack(side=RIGHT, fill=Y) self.vbar_play_online = vbar_play_online # 框架的位置布局 frame_l_play_online.grid(row=0, column=0, sticky=NSEW) frame_r_play_online.grid(row=0, column=1, sticky=NS) frame_root_play_online.place(x=5, y=0) #################################################################################################下载 labelframe_movie_bt_download = LabelFrame( root, width=440, height=235, text="影视下载(选中条目右击复制下载地址,双击进入网页介绍)") labelframe_movie_bt_download.place(x=320, y=305) self.labelframe_movie_bt_download = labelframe_movie_bt_download # 框架布局,承载多个控件 frame_root_bt_download = Frame(labelframe_movie_bt_download, width=324) frame_l_bt_download = Frame(frame_root_bt_download) frame_r_bt_download = Frame(frame_root_bt_download) self.frame_root_bt_download = frame_root_bt_download self.frame_l_bt_download = frame_l_bt_download self.frame_r_bt_download = frame_r_bt_download # 表格 columns_bt_download = ("标题", "来源", "地址") treeview_bt_download = ttk.Treeview(frame_l_bt_download, height=9, show="headings", columns=columns_bt_download) treeview_bt_download.column("标题", width=110, anchor='center') treeview_bt_download.column("来源", width=100, anchor='center') treeview_bt_download.column("地址", width=200, anchor='center') treeview_bt_download.heading("标题", text="标题") treeview_bt_download.heading("来源", text="来源") treeview_bt_download.heading("地址", text="地址") #垂直滚动条 vbar_bt_download = ttk.Scrollbar(frame_r_bt_download, command=treeview_bt_download.yview) treeview_bt_download.configure(yscrollcommand=vbar_bt_download.set) treeview_bt_download.pack() self.treeview_bt_download = treeview_bt_download vbar_bt_download.pack(side=RIGHT, fill=Y) self.vbar_bt_download = vbar_bt_download # 框架的位置布局 frame_l_bt_download.grid(row=0, column=0, sticky=NSEW) frame_r_bt_download.grid(row=0, column=1, sticky=NS) frame_root_bt_download.place(x=5, y=0) #################################################################################################云盘 labelframe_movie_save_cloud_disk = LabelFrame(root, width=420, height=135, text="云盘搜索") labelframe_movie_save_cloud_disk.place(x=770, y=405) self.labelframe_movie_save_cloud_disk = labelframe_movie_save_cloud_disk # 框架布局,承载多个控件 frame_root_save_cloud_disk = Frame(labelframe_movie_save_cloud_disk, width=420) frame_l_save_cloud_disk = Frame(frame_root_save_cloud_disk) frame_r_save_cloud_disk = Frame(frame_root_save_cloud_disk) self.frame_root_save_cloud_disk = frame_root_save_cloud_disk self.frame_l_save_cloud_disk = frame_l_save_cloud_disk self.frame_r_save_cloud_disk = frame_r_save_cloud_disk # 表格 columns_save_cloud_disk = ("来源名称", "是否有效", "播放地址") treeview_save_cloud_disk = ttk.Treeview( frame_l_save_cloud_disk, height=4, show="headings", columns=columns_save_cloud_disk) treeview_save_cloud_disk.column("来源名称", width=120, anchor='center') treeview_save_cloud_disk.column("是否有效", width=110, anchor='center') treeview_save_cloud_disk.column("播放地址", width=150, anchor='center') treeview_save_cloud_disk.heading("来源名称", text="来源名称") treeview_save_cloud_disk.heading("是否有效", text="是否有效") treeview_save_cloud_disk.heading("播放地址", text="播放地址") # 垂直滚动条 vbar_save_cloud_disk = ttk.Scrollbar( frame_r_save_cloud_disk, command=treeview_save_cloud_disk.yview) treeview_save_cloud_disk.configure( yscrollcommand=vbar_save_cloud_disk.set) treeview_save_cloud_disk.pack() self.treeview_save_cloud_disk = treeview_save_cloud_disk vbar_save_cloud_disk.pack(side=RIGHT, fill=Y) self.vbar_save_cloud_disk = vbar_save_cloud_disk # 框架的位置布局 frame_l_save_cloud_disk.grid(row=0, column=0, sticky=NSEW) frame_r_save_cloud_disk.grid(row=0, column=1, sticky=NS) frame_root_save_cloud_disk.place(x=5, y=0) # 保存到云盘布局结束 #绑定事件 treeview.bind('<ButtonRelease-1>', self.open_details_event) #搜索结果单击绑定详情 treeview_bt_download.bind('<ButtonRelease-3>', self.copyURL) #下载列表绑定选中右击复制和双击打开网页 treeview_bt_download.bind('<Double-1>', self.open_in_browser) treeview_play_online.bind('<Double-1>', self.open_in_browser_online) #在线播放绑定左键双击播放 # treeview_save_cloud_disk.bind('<Double-1>', self.open_in_browser_cloud_disk) # 表格绑定左键双击事件 ranking_type.bind('<<ComboboxSelected>>', self.open_ranking_event) #排行榜combox绑定修改事件 B_0_keyword.configure( command=lambda: thread_it(self.searh_movie_in_keyword)) #按钮绑定单击事件 T_vote_keyword.bind('<Return>', handlerAdaptor( self.keyboard_T_vote_keyword)) # 文本框绑定回车 # label_bar.bind('<Double-1>',open(r'E:\python projects\project_an\htmls\电影Bar图.html')) # self.open_ranking()#初始化排行榜 thread_it(self.open_ranking) root.mainloop()
class MachineLearning: def __init__(self): self.data = None self.table = None self.selection_x = None self.selection_y = None self.X = None self.y = None self.X_test_l = None self.X_train_l = None self.y_test_l = None self.y_train_l = None self.X_test = None self.X_train = None self.y_test = None self.y_train = None self.le = LabelEncoder() self.linreg_model = None self.linreg_predictions = None self.logreg_model = None self.logreg_predictions = None self.dtree_model = None self.dtree_predictions = None self.rforest_model = None self.rforest_predictions = None self.window = Tk() self.color = 'grey95' self.window.geometry('620x700') self.window.resizable(False, False) self.window.configure(background=self.color) self.window.title('Machine Learning') self.window.iconbitmap('py.ico') self.heading = Label(self.window, text="Machine Learning", bg=self.color, pady=20, font=("Helvetica", 35, "bold")) self.heading.place(width=620, height=100, bordermode=OUTSIDE, x=0, y=0) # File Selection and viewing self.frame = LabelFrame(self.window, text='File Selection', bg=self.color) self.frame.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=100) self.name_label = Label(self.frame, text="File Name : ", bg=self.color, padx=10, pady=10, font=("Helvetica", 15)) self.name_label.place(width=120, height=30, bordermode=INSIDE, x=10, y=13) self.name = StringVar() self.name_entry = Entry(self.frame, exportselection=False, textvariable=self.name, font=("Helvetica", 12)) self.name_entry.place(width=250, height=30, bordermode=INSIDE, x=130, y=13) self.name_select = Button(self.frame, text='Select', command=lambda: self.select()) self.name_select.place(width=50, height=30, bordermode=INSIDE, x=395, y=13) self.df_show = Button(self.frame, text='Show', command=lambda: self.create_table(), state=DISABLED) self.df_show.place(width=50, height=30, bordermode=INSIDE, x=455, y=13) self.df_hide = Button(self.frame, text='Hide', command=lambda: self.hide(), state=DISABLED) self.df_hide.place(width=50, height=30, bordermode=INSIDE, x=515, y=13) # Train Test Split self.ttsplit = LabelFrame(self.window, text='Train Test Split', bg=self.color) self.ttsplit.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=200) self.select_x = Button(self.ttsplit, text='X', command=lambda: self.get_x(), state=DISABLED) self.select_x.place(width=80, height=30, bordermode=INSIDE, x=10, y=13) self.select_y = Button(self.ttsplit, text='y', command=lambda: self.get_y(), state=DISABLED) self.select_y.place(width=80, height=30, bordermode=INSIDE, x=100, y=13) self.test_size_label = Label(self.ttsplit, text="Test Size : ", bg=self.color) self.test_size_label.place(width=60, height=30, bordermode=INSIDE, x=200, y=13) self.test_size = StringVar() self.test_size.set('0.25') self.test_size_entry = Entry(self.ttsplit, exportselection=False, textvariable=self.test_size, font=("Helvetica", 10)) self.test_size_entry.place(width=50, height=30, bordermode=INSIDE, x=260, y=13) self.rstate_label = Label(self.ttsplit, text="Random State : ", bg=self.color) self.rstate_label.place(width=100, height=30, bordermode=INSIDE, x=330, y=13) self.rstate = StringVar() self.rstate.set('None') self.rstate_entry = Entry(self.ttsplit, exportselection=False, textvariable=self.rstate, font=("Helvetica", 10)) self.rstate_entry.place(width=50, height=30, bordermode=INSIDE, x=430, y=13) self.split_button = Button(self.ttsplit, text='Split', command=lambda: self.split(), state=DISABLED) self.split_button.place(width=80, height=30, bordermode=INSIDE, x=490, y=13) # Linear Regression self.linreg = LabelFrame(self.window, text='Linear Regression', bg=self.color) self.linreg.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=300) self.linreg_pred = Button(self.linreg, text='Predict', command=lambda: self.pred_linreg(), state=DISABLED) self.linreg_pred.place(width=125, height=30, bordermode=INSIDE, x=8, y=13) self.coefficients = Button(self.linreg, text='Coefficients', command=lambda: self.coeff(), state=DISABLED) self.coefficients.place(width=125, height=30, bordermode=INSIDE, x=153, y=13) self.scatter_button = Button(self.linreg, text='Scatter Plot', command=lambda: self.scatter(), state=DISABLED) self.scatter_button.place(width=125, height=30, bordermode=INSIDE, x=298, y=13) self.linreg_error = Button(self.linreg, text='Error', command=lambda: self.errors_linreg(), state=DISABLED) self.linreg_error.place(width=125, height=30, bordermode=INSIDE, x=443, y=13) # Logistic Regression self.logreg = LabelFrame(self.window, text='Logistic Regression', bg=self.color) self.logreg.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=400) self.logreg_pred = Button(self.logreg, text='Predict', command=lambda: self.pred_logreg(), state=DISABLED) self.logreg_pred.place(width=125, height=30, bordermode=INSIDE, x=8, y=13) self.logreg_cm = Button(self.logreg, text='Confusion Matrix', command=lambda: self.cm_logreg(), state=DISABLED) self.logreg_cm.place(width=125, height=30, bordermode=INSIDE, x=153, y=13) self.logreg_cr = Button(self.logreg, text='Classification Report', command=lambda: self.cr_logreg(), state=DISABLED) self.logreg_cr.place(width=125, height=30, bordermode=INSIDE, x=298, y=13) self.logreg_error = Button(self.logreg, text='Error', command=lambda: self.errors_logreg(), state=DISABLED) self.logreg_error.place(width=125, height=30, bordermode=INSIDE, x=443, y=13) # Decision Tree self.dtree = LabelFrame(self.window, text='Decision Tree', bg=self.color) self.dtree.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=500) self.dtree_pred = Button(self.dtree, text='Predict', command=lambda: self.pred_dtree(), state=DISABLED) self.dtree_pred.place(width=125, height=30, bordermode=INSIDE, x=8, y=13) self.dtree_cm = Button(self.dtree, text='Confusion Matrix', command=lambda: self.cm_dtree(), state=DISABLED) self.dtree_cm.place(width=125, height=30, bordermode=INSIDE, x=153, y=13) self.dtree_cr = Button(self.dtree, text='Classification Report', command=lambda: self.cr_dtree(), state=DISABLED) self.dtree_cr.place(width=125, height=30, bordermode=INSIDE, x=298, y=13) self.dtree_error = Button(self.dtree, text='Error', command=lambda: self.errors_dtree(), state=DISABLED) self.dtree_error.place(width=125, height=30, bordermode=INSIDE, x=443, y=13) # Random Forest self.rforest = LabelFrame(self.window, text='Random Forest', bg=self.color) self.rforest.place(width=580, height=80, bordermode=OUTSIDE, x=20, y=600) self.rforest_pred = Button(self.rforest, text='Predict', command=lambda: self.pred_rforest(), state=DISABLED) self.rforest_pred.place(width=125, height=30, bordermode=INSIDE, x=8, y=13) self.rforest_cm = Button(self.rforest, text='Confusion Matrix', command=lambda: self.cm_rforest(), state=DISABLED) self.rforest_cm.place(width=125, height=30, bordermode=INSIDE, x=153, y=13) self.rforest_cr = Button(self.rforest, text='Classification Report', command=lambda: self.cr_rforest(), state=DISABLED) self.rforest_cr.place(width=125, height=30, bordermode=INSIDE, x=298, y=13) self.rforest_error = Button(self.rforest, text='Error', command=lambda: self.errors_rforest(), state=DISABLED) self.rforest_error.place(width=125, height=30, bordermode=INSIDE, x=443, y=13) self.window.mainloop() def select(self): try: self.data = pd.read_csv(self.name.get()) self.df_show['state'] = NORMAL self.df_hide['state'] = NORMAL self.name_entry['state'] = DISABLED self.name_select['state'] = DISABLED self.select_x['state'] = NORMAL except FileNotFoundError: self.name.set("Invalid") def create_table(self): try: self.table.window.deiconify() except AttributeError: if self.data.shape[0] > 50: self.table = Table(self.data.head(50), self.window, self.name.get()) else: self.table = Table(self.data, self.window, self.name.get()) except TclError: if self.data.shape[0] > 50: self.table = Table(self.data.head(50), self.window, self.name.get()) else: self.table = Table(self.data, self.window, self.name.get()) def hide(self): try: self.table.window.withdraw() except TclError: return except AttributeError: return def get_x(self): self.selection_x = SelectionX(self.window, self.data) self.X = [] for i in range(len(self.data.columns)): if self.selection_x.variables[i].get() == 1: self.X.append(self.data.columns[i]) self.select_x['state'] = DISABLED self.select_y['state'] = NORMAL def get_y(self): self.selection_y = SelectionY(self.window, self.data) self.y = self.data.columns[self.selection_y.variable.get()] if self.y not in self.X: self.split_button['state'] = NORMAL self.select_y['state'] = DISABLED def split(self): test_size = 0.25 try: test_size = float(self.test_size.get()) if test_size <= 0 or test_size >= 1: test_size = 0.25 except ValueError: test_size = 0.25 self.test_size.set('0.25') random_state = None if self.rstate.get() != 'None': try: random_state = int(self.rstate.get()) except ValueError: random_state = None self.rstate.set('None') self.X_train_l, self.X_test_l, self.y_train_l, self.y_test_l = train_test_split( self.data[self.X], self.data[self.y], test_size=test_size, random_state=random_state) self.X_train, self.X_test, self.y_train, self.y_test = train_test_split( self.data[self.X], self.le.fit_transform(self.data[self.y]), test_size=test_size, random_state=random_state) self.linreg_pred['state'] = NORMAL self.coefficients['state'] = DISABLED self.scatter_button['state'] = DISABLED self.linreg_error['state'] = DISABLED self.logreg_pred['state'] = NORMAL self.logreg_cr['state'] = DISABLED self.logreg_cm['state'] = DISABLED self.logreg_error['state'] = DISABLED self.dtree_pred['state'] = NORMAL self.dtree_cr['state'] = DISABLED self.dtree_cm['state'] = DISABLED self.dtree_error['state'] = DISABLED self.rforest_pred['state'] = NORMAL self.rforest_cm['state'] = DISABLED self.rforest_cr['state'] = DISABLED self.rforest_error['state'] = DISABLED def pred_linreg(self): self.linreg_model = LinearRegression() self.linreg_model.fit(self.X_train_l, self.y_train_l) self.linreg_predictions = self.linreg_model.predict(self.X_test_l) self.linreg_error['state'] = NORMAL self.scatter_button['state'] = NORMAL self.coefficients['state'] = NORMAL def scatter(self): Scatter(self.window, self.y_test_l, self.linreg_predictions) def coeff(self): Coefficients(self.window, self.linreg_model.intercept_, self.linreg_model.coef_, self.X) def errors_linreg(self): temp = [ mean_absolute_error(self.y_test, self.linreg_predictions), mean_squared_error(self.y_test, self.linreg_predictions), np.sqrt(mean_squared_error(self.y_test, self.linreg_predictions)) ] Errors(self.window, temp, 'Linear Regression') def pred_logreg(self): self.logreg_model = LogisticRegression(solver='liblinear') self.logreg_model.fit(self.X_train, self.y_train) self.logreg_predictions = self.logreg_model.predict(self.X_test) self.logreg_cr['state'] = NORMAL self.logreg_cm['state'] = NORMAL self.logreg_error['state'] = NORMAL def cm_logreg(self): ConfusionMatrix( self.window, confusion_matrix( self.le.inverse_transform(self.y_test), self.le.inverse_transform(self.logreg_predictions)), 'Logistic Regression', self.le.classes_) def cr_logreg(self): ClassificationReport( self.window, classification_report( self.le.inverse_transform(self.y_test), self.le.inverse_transform(self.logreg_predictions)), 'Logistic Regression') def errors_logreg(self): temp = [ mean_absolute_error(self.y_test, self.logreg_predictions), mean_squared_error(self.y_test, self.logreg_predictions), np.sqrt(mean_squared_error(self.y_test, self.logreg_predictions)) ] Errors(self.window, temp, 'Logistic Regression') def pred_dtree(self): self.dtree_model = DecisionTreeClassifier() self.dtree_model.fit(self.X_train, self.y_train) self.dtree_predictions = self.dtree_model.predict(self.X_test) self.dtree_cr['state'] = NORMAL self.dtree_cm['state'] = NORMAL self.dtree_error['state'] = NORMAL def cm_dtree(self): ConfusionMatrix( self.window, confusion_matrix(self.le.inverse_transform(self.y_test), self.le.inverse_transform( self.dtree_predictions)), 'Decision Tree', self.le.classes_) def cr_dtree(self): ClassificationReport( self.window, classification_report( self.le.inverse_transform(self.y_test), self.le.inverse_transform(self.dtree_predictions)), 'Decision Tree') def errors_dtree(self): temp = [ mean_absolute_error(self.y_test, self.dtree_predictions), mean_squared_error(self.y_test, self.dtree_predictions), np.sqrt(mean_squared_error(self.y_test, self.dtree_predictions)) ] Errors(self.window, temp, 'Decision Tree') def pred_rforest(self): self.rforest_model = RandomForestClassifier(n_estimators=100) self.rforest_model.fit(self.X_train, self.y_train) self.rforest_predictions = self.rforest_model.predict(self.X_test) self.rforest_cr['state'] = NORMAL self.rforest_cm['state'] = NORMAL self.rforest_error['state'] = NORMAL def cm_rforest(self): ConfusionMatrix( self.window, confusion_matrix( self.le.inverse_transform(self.y_test), self.le.inverse_transform(self.rforest_predictions)), 'Random Forest', self.le.classes_) def cr_rforest(self): ClassificationReport( self.window, classification_report( self.le.inverse_transform(self.y_test), self.le.inverse_transform(self.rforest_predictions)), 'Random Forest') def errors_rforest(self): temp = [ mean_absolute_error(self.y_test, self.rforest_predictions), mean_squared_error(self.y_test, self.rforest_predictions), np.sqrt(mean_squared_error(self.y_test, self.rforest_predictions)) ] Errors(self.window, temp, 'Random Forest')
def __init__(self, root): self.root = root self.root.title("wikipedia") self.root.geometry("800x500") self.root.resizable(0, 0) #self.root.iconbitmap("sym.ico") #decleard the textvariables for given entries required for tkinter Entry wiki_search = StringVar() #inputes to be passed lang = StringVar() #language to be passed #this are the however effects only included for styling the buttons while hover on it.it will give the user a clear idea on which button he is in. def on_enter1(e): But_search['background'] = "black" But_search['foreground'] = "cyan" def on_leave1(e): But_search['background'] = "SystemButtonFace" But_search['foreground'] = "SystemButtonText" def on_enter2(e): But_clear['background'] = "black" But_clear['foreground'] = "cyan" def on_leave2(e): But_clear['background'] = "SystemButtonFace" But_clear['foreground'] = "SystemButtonText" def on_enter3(e): But_speak['background'] = "black" But_speak['foreground'] = "cyan" def on_leave3(e): But_speak['background'] = "SystemButtonFace" But_speak['foreground'] = "SystemButtonText" #function to clear input entries as well as the text def clear(): TXT.delete("1.0", "end") wiki_search.set("") TXT.config(bg="white") #function to be to search the given input on wikipedia and also provide the all certain information in textbox def search_on(): try: TXT.delete("1.0", "end") search_text = wiki_search.get() langs = lang.get() wikipedia.set_lang(langs) get_details = wikipedia.summary(search_text) TXT.insert("end", get_details) except: # tkinter.messagebox.showerror("Network Error","your internet is may not working") pass def thread_search(): t1 = threading.Thread(target=search_on) t1.start() """ added speak translator if in case user might not understand the inputs on text this function will help user to speak the give output provided on textbox for more specify I also included an language selector to select and translate the give input in specific language to clerify to user this will never speak directly to the user./ but I have provided a file that will help to this to speak .. when you search the given name.It will first save in TEMP folder in c drive as temps.mp3 .when ever you click this speak button this will try to find this file and the read all the data in given file and then starts to speaks the data """ def speak(): try: time.sleep(1) texts = TXT.get("1.0", "end") tts = gTTS(text=texts, lang=lang.get()) filename = 'C:\\TEMP\\temps.mp3' tts.save(filename) playsound('C:\\TEMP\\temps.mp3') os.remove(filename) #remove temperory file except: tkinter.messagebox.askretrycancel( "Internet Error", "INTERNET CONNECTION MAY GONE OR LANGUAGE ERROR", icon="info") def thread_speak(): t1 = threading.Thread(target=speak) t1.start() #===================frame========================================== Main_Frame = Frame(self.root, width=800, height=500, relief="ridge", bd=3, bg="gray75") #Mainframe Main_Frame.place(x=0, y=0) Frame_top = Frame(Main_Frame, width=795, height=100, bg="green", relief="ridge", bd=4) #topframe Frame_top.place(x=0, y=0) Frame_bottom = Frame(Main_Frame, width=795, height=395, bg="blue", relief="ridge", bd=4) #bottomframe Frame_bottom.place(x=0, y=100) #===============================LabelFrame============================ Lab_top = LabelFrame(Frame_top, text="Search in wikipedia", width=785, height=90, bg="#7282cf", fg="#f9eefb") #LabelFrame Lab_top.place(x=0, y=0) #this entry will provide user to search Ent_search = Entry(Lab_top, width=50, font=('times new roman', 12, 'italic'), relief="ridge", bd=4, bg="snow", textvariable=wiki_search) Ent_search.place(x=21, y=7) #select the langueages lab = Label(Lab_top, text="SELECT LANGUAGE", font=('times new roman', 8, 'italic'), bg="#7282cf", fg="white") lab.place(x=21, y=40) #list of languages are English,hindi,marathi lan_list = ["en", "hi", "mr"] lan_combo = Combobox(Lab_top, values=lan_list, font=('arial', 10), width=14, state="readonly", textvariable=lang) lan_combo.set("en") lan_combo.place(x=139, y=40) #buton to search But_search = Button(Lab_top, text="Search", width=20, font=('times new roman', 10, 'bold'), relief="ridge", bd=4, cursor="hand2", command=thread_search) But_search.place(x=450, y=7) But_search.bind("<Enter>", on_enter1) But_search.bind("<Leave>", on_leave1) #but clear the data But_clear = Button(Lab_top, text="Clear", width=15, font=('times new roman', 10, 'bold'), relief="ridge", bd=4, cursor="hand2", command=clear) But_clear.place(x=630, y=7) But_clear.bind("<Enter>", on_enter2) But_clear.bind("<Leave>", on_leave2) #button to speak But_speak = Button(Lab_top, text="Speak", width=15, font=('times new roman', 10, 'bold'), relief="ridge", bd=4, cursor="hand2", command=thread_speak) But_speak.place(x=630, y=40) But_speak.bind("<Enter>", on_enter3) But_speak.bind("<Leave>", on_leave3) #=============================Frame_bottom+++++++++++++++++++++++++++++++++= #scrollbar on y axis scroll = Scrollbar(Frame_bottom) scroll.pack(side="right", fill="y") TXT = Text(Frame_bottom, width=109, height=24, font=('arial', 10, 'bold'), bd=1, bg="gray95", relief="ridge", state="normal", yscrollcommand=scroll.set) TXT.pack(side="left") scroll.config(command=TXT.yview)
class filtrar: def __init__(self, parent): self.parent = parent self.pathLocation = get_secret("MAIN_PATH") self.func = functions(self) self.contador = None self.mesDe = StringVar() self.anoDe = StringVar() self.anoAte = StringVar() self.mesAte = StringVar() def Filtrar(self): self.top = Toplevel(self.parent) self.top.wm_title("Filtrar Pedidos") self.top.geometry("391x370+100+50") self.contador = 0 self.anoDe.set(strftime("%Y")) self.mesDe.set(self.func.getMes(strftime("%B"))) self.anoAte.set("") self.mesAte.set("") check = IntVar() check.set(0) # Apartir desta data # =========================A PARTIR DE========================================== labelDe = Label(self.top) labelDe['text'] = "A partir de:" labelDe.place(y=5, x=5) labelAno = Label(self.top) labelAno['text'] = "Ano" labelAno.place(y=20, x=50) self.entryAnoDe = Entry(self.top) self.entryAnoDe["textvariable"] = self.anoDe self.entryAnoDe.textvariable = self.anoDe self.entryAnoDe["width"] = 4 self.entryAnoDe.focus() self.entryAnoDe.bind("<Return>", self.setNext) self.entryAnoDe.place(y=40, x=50) labelMes = Label(self.top) labelMes["text"] = "Mes" labelMes.place(y=60, x=50) self.entryMesDe = Entry(self.top) self.entryMesDe["textvariable"] = self.mesDe self.entryMesDe.textvariable = self.mesDe self.entryMesDe["width"] = 10 self.entryMesDe.bind("<Return>", self.setNext) self.entryMesDe.place(y=80, x=50) # =========================ATE================================================== self.frame = LabelFrame(self.top) self.frame['width'] = 100 self.frame['height'] = 117 self.frame['borderwidth'] = 3 self.frame.place(y=2, x=125) self.checkBox = Checkbutton(self.frame) self.checkBox['text'] = "Até" self.checkBox['variable'] = check self.checkBox['command'] = lambda: self.ativaAte(check.get()) self.checkBox['onvalue'] = 1 self.checkBox['offvalue'] = 0 self.checkBox.variable = check self.checkBox.place(y=1, x=2) labelAno = Label(self.frame) labelAno['text'] = "Ano" labelAno.place(y=20, x=5) self.entryAnoAte = Entry(self.frame) self.entryAnoAte["state"] = DISABLED self.entryAnoAte["width"] = 4 self.entryAnoAte['textvariable'] = self.anoAte self.entryAnoAte.bind("<Return>", self.setNext) self.entryAnoAte.place(y=40, x=5) labelMes = Label(self.frame) labelMes["text"] = "Mes" labelMes.place(y=60, x=5) self.entryMesAte = Entry(self.frame) self.entryMesAte["state"] = DISABLED self.entryMesAte["width"] = 10 self.entryMesAte['textvariable'] = self.mesAte self.entryMesAte.bind("<Return>", self.setNext) self.entryMesAte.place(y=80, x=5) # =========================FILTRO=============================================== labelEntry = Label(self.top) labelEntry['text'] = "Filtro" labelEntry.place(y=20, x=265) self.entryFiltro = Entry(self.top) self.entryFiltro['width'] = 15 self.entryFiltro.bind("<Return>", lambda _: self.getFiltrado()) self.entryFiltro.place(y=40, x=240) # ======================================================================= # LABEL PARA COMPLETAR ESPAÇOS # ======================================================================= Label(self.top).pack() Label(self.top).pack() Label(self.top).pack() Label(self.top).pack() Label(self.top).pack() Label(self.top).pack() Label(self.top).pack() # ----------------------------------------------------------------------- self.scrollbar = Scrollbar(self.top) self.scrollbar.pack(side=RIGHT, fill=BOTH) self.customFont = font.Font(family="Arial", size=10) self.textFrame = Text(self.top) self.textFrame['font'] = self.customFont self.textFrame['height'] = 11 self.textFrame['width'] = 51 self.textFrame['borderwidth'] = 3 self.textFrame['takefocus'] = False self.textFrame['yscrollcommand'] = self.scrollbar.set self.textFrame.yscrollcommand = self.scrollbar.set self.textFrame.place(y=160, x=5) self.scrollbar['command'] = self.textFrame.yview self.scrollbar.command = self.textFrame.yview self.labelTotal = Label(self.top) self.labelTotal['text'] = "Total de pedidos: 0" self.labelTotal.place(y=345, x=3) buttonFiltrar = Button(self.top) buttonFiltrar['text'] = "Filtrar" buttonFiltrar['command'] = self.getFiltrado buttonFiltrar.bind("<Return>", lambda _: self.getFiltrado()) buttonFiltrar.place(y=130, x=80) button_limpar = Button(self.top) button_limpar['text'] = "Limpar Resultados" button_limpar['command'] = self.limpar_resultados button_limpar.bind("<Return>", lambda _: self.limpar_resultados()) button_limpar.place(y=130, x=130) buttonCancel = Button(self.top) buttonCancel['text'] = "Voltar" buttonCancel['command'] = self.top.destroy buttonCancel.bind("<Return>", lambda _: self.top.destroy()) buttonCancel.place(y=130, x=250) # toolTips ToolTip(self.entryAnoDe, "Exemplos:\n2016\n2015\n2014") ToolTip(self.entryMesDe, "Exemplos:\nAbril\nDezembro\nJaneiro") ToolTip(self.entryFiltro, "Exemplos:\nURA\n15/04/16\nJoão") msg = "Marque caso queira obter resultados\napartir de uma faixa de data." ToolTip(self.checkBox, msg) def limpar_resultados(self): self.textFrame['state'] = NORMAL self.textFrame.delete(1.0, END) self.contador = 0 self.labelTotal.config(text=f"Total de pedidos: {self.contador}") self.textFrame['state'] = DISABLED self.entryAnoDe.focus() def getListas(self): ano = [] listasMeses = [] meses = [ 'JANEIRO', 'FEVEREIRO', 'MARÇO', 'ABRIL', 'MAIO', 'JUNHO', 'JULHO', 'AGOSTO', 'SETEMBRO', 'OUTUBRO', 'NOVEMBRO', 'DEZEMBRO' ] # =============================================================================== # EXCEPTIONS # =============================================================================== def mudarCor(key, cor): entry = { 0: self.entryAnoAte, 1: self.entryAnoDe, 2: self.entryMesAte, 3: self.entryMesDe, } if key == 4: for i in range(4): entry[i].config(fg=cor) elif key >= 4: for i in range(4): if i != (key - 5): entry[i].config(fg=cor) else: entry[key].config(fg=cor) try: anoDe = int(self.anoDe.get()) mesDe = self.mesDe.get().upper() if anoDe <= 2015: self.entryAnoDe.focus() mudarCor(1, 'red') # AnoDe RED mudarCor(6, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Ano Invalido", parent=self.top) return ("ERRO", "ERRO") elif mesDe not in meses: self.entryMesDe.focus() mudarCor(3, 'red') # MesDeDe RED mudarCor(8, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Mes Invalido", parent=self.top) return ("ERRO", "ERRO") except ValueError: if self.anoDe.get() != "": self.entryAnoDe.focus() mudarCor(1, 'red') # AnoDe RED mudarCor(6, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Ano Invalido", parent=self.top) return ("ERRO", "ERRO") if self.anoAte.get() == "" and self.mesAte.get().upper() == "": anoAte = int(self.anoDe.get()) mesAte = self.mesDe.get().upper() else: try: anoAte = int(self.anoAte.get()) mesAte = self.mesAte.get().upper() if self.anoDe.get() == "": anoDe = anoAte mesDe = mesAte if anoAte <= 2015: self.entryAnoAte.focus() mudarCor(0, 'red') # AnoAte RED mudarCor(5, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Ano Invalido", parent=self.top) return ("ERRO", "ERRO") elif anoAte < anoDe: self.entryAnoDe.focus() mudarCor(0, 'red') # AnoAte e AnoDe RED mudarCor(5, 'black') # Restante BLACK mudarCor(1, 'red') msg = """Ano "De" tem de ser maior que Ano "Ate" """ messagebox.showwarning("ERRO", msg, parent=self.top) return ("ERRO", "ERRO") elif mesAte not in meses: self.entryMesAte.focus() mudarCor(2, 'red') # MesAte RED mudarCor(7, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Mes Invalido", parent=self.top) return ("ERRO", "ERRO") elif anoAte == anoDe: if meses.index(mesDe) > meses.index(mesAte): self.entryMesDe.focus() mudarCor(2, 'red') # MesAte e MesDe RED mudarCor(7, 'black') # Restante BLACK mudarCor(3, 'red') msg = """Mes "De" tem de ser anterior ao Mes "Ate" Exemplo: Mes De: Junho Mes Até: Julho """ messagebox.showwarning("ERRO", msg, parent=self.top) return ("ERRO", "ERRO") except ValueError: self.entryAnoAte.focus() self.entryAnoAte['fg'] = 'red' mudarCor(0, 'red') # AnoAte RED mudarCor(5, 'black') # Restante BLACK messagebox.showwarning("ERRO", "Ano Invalido", parent=self.top) return ("ERRO", "ERRO") mudarCor(4, 'black') # TODOS BALCK # =============================================================================== # Função # =============================================================================== for x in range(anoDe, anoAte + 1): ano.append(x) aux = [] if anoDe == anoAte: if mesDe == mesAte: listasMeses.append([mesDe]) else: for i in range(meses.index(mesDe), meses.index(mesAte) + 1): aux.append(meses[i]) listasMeses.append(aux) elif x != anoDe and x != anoAte: listasMeses.append(meses) elif x == anoDe: index = meses.index(mesDe) for i in range(index, 12): aux.append(meses[i]) listasMeses.append(aux) else: index = meses.index(mesAte) for i in range(0, index + 1): aux.append(meses[i]) listasMeses.append(aux) return (ano, listasMeses) def getFiltrado(self): anos, meses = self.getListas() if anos == "ERRO" or meses == "ERRO": return if self.textFrame.get(1.0) != '\n': self.textFrame['state'] = NORMAL self.textFrame.delete(1.0, END) self.contador = 0 self.textFrame['state'] = NORMAL for cont in range(len(anos)): mes = meses[cont] y = anos[cont] for m in mes: try: _path = os.path.abspath( os.path.join(self.pathLocation, str(y), f"{m}.cfg")) with open(_path, 'r', encoding=ENCODING) as file: lines = file.readlines()[1:] for line in lines: if self.entryFiltro.get().upper() in line.rstrip( ).upper(): self.textFrame.insert(END, line.rstrip() + "\n") self.contador += 1 else: self.contador += 0 self.labelTotal.config( text=f"Total de pedidos: {self.contador}") except IOError: message = """Arquivo %s/%s.cfg não localizado!""" % (y, m) messagebox.showwarning("Erro!", message, parent=self.top) self.textFrame['state'] = DISABLED def ativaAte(self, flag): toolTipAno = ToolTip(self.entryAnoAte, "Exemplos:\n2016\n2015\n2014") toolTipMes = ToolTip(self.entryMesAte, "Exemplos:\nAbril\nDezembro\nJaneiro") if flag == 1: self.entryAnoAte.config(state=NORMAL) self.entryAnoDe.focus() self.entryMesAte.config(state=NORMAL) self.frame['borderwidth'] = 0 toolTipAno.startShowing() toolTipMes.startShowing() self.anoAte.set(self.anoDe.get()) self.mesAte.set(self.mesDe.get().upper()) self.anoDe.set("") self.mesDe.set("") else: self.anoDe.set(self.anoAte.get()) self.mesDe.set(self.mesAte.get().upper()) self.anoAte.set("") self.mesAte.set("") self.entryAnoAte.config(state=DISABLED) self.entryMesAte.config(state=DISABLED) self.entryFiltro.focus() self.frame['borderwidth'] = 3 toolTipAno.stopShowing() toolTipMes.stopShowing() def setNext(self, event): event.widget.tk_focusNext().focus() return ("break")
class RunPage(Frame): def __init__(self, parent, controller): Frame.__init__(self, parent) self.controller = controller self.reserve_time = StringVar() self.reserve_date = StringVar() self.success = StringVar() self.success.set("No") self.counter = IntVar() self.counter.set(0) self.run_flag = IntVar() self.run_flag.set(0) self.T = {} self.message_count_down = False self.show_notice = True self.successed_info = [] self.Config_Path = self.controller.Config_Path self.Cookie_Path = self.controller.Cookie_Path self.frame_1 = LabelFrame( self, text="选择预定日期与开始时间(点击自动选择并查询)", height=100, width=630 ) self.day = 0 self.days = {} self.choose_days = {} for i in range(7): _today = date.today() self.days[i] = StringVar() _day = _today + timedelta(days=i) _day = _day.strftime("%Y-%m-%d") self.days[i].set(_day) self.choose_days[i] = Radiobutton( self.frame_1, text=self.days[i].get(), variable=self.reserve_date, value=self.days[i].get(), command=partial(self.set_reserve_date, i), ) self.times = {} self.choose_times = {} for i in range(7): self.times[i] = StringVar() _time = "{0:02d}:00:00".format(8 + 2 * i) self.times[i].set(_time) self.choose_times[i] = Radiobutton( self.frame_1, text=self.times[i].get(), variable=self.reserve_time, value=self.times[i].get(), command=self.set_reserve_time, ) # ------------------- self.frame_2 = LabelFrame(self, height=150, width=630) self.label_date_1 = Label(self.frame_2, text="预定日期:", anchor=E) self.label_date_2 = Label( self.frame_2, textvariable=self.reserve_date, anchor=W ) self.label_time_1 = Label(self.frame_2, text="预定时间段(2小时):", anchor=E) self.label_time_2 = Label( self.frame_2, textvariable=self.reserve_time, anchor=W ) self.label_couner = Label(self.frame_2, text="刷新次数:", anchor=E) self.couner_num = Label(self.frame_2, textvariable=self.counter) self.label_sucessed = Label(self.frame_2, text="是否预定成功?:", anchor=E) self.is_sucessed = Label(self.frame_2, bg="Red", textvariable=self.success) self.button_start = Button( self.frame_2, text="开始监控", bg="SpringGreen", command=self.start_job ) self.button_stop = Button( self.frame_2, text="结束", state=DISABLED, bg="LightGray", command=self.stop_job, ) self.label_notice = Label(self.frame_2, text="显示警告与提示?", anchor=E) self.button_notice = Button( self.frame_2, text="是", bg="Pink", command=self.turn_on_notice ) self.label_sucessed_place = Label(self.frame_2, text="预定成功的场地:", anchor=E) self.label_successed_place_info = Label(self.frame_2) # ------------------- self.frame_3 = LabelFrame(self, text="场地状态(点击刷新)", height=600, width=630) self.courts = {} self.show_courts = {} for i in range(8): self.courts[i] = IntVar() self.courts[i].set("") self.show_courts[i] = Button( self.frame_3, font=("Helvetica 10"), text="{}号场地".format(i + 1), command=self.get_status, ) self.create_page() def create_page(self): f_x = 56 height = 28 space = 20 f1_width = 98 f3_width = 120 self.frame_1.place( x=f_x - 30, y=space, width=700, height=height * 2 + space * 3 ) for i in range(7): self.choose_days[i].place( x=5 + f1_width * i, y=10, width=f1_width, height=height ) self.choose_times[i].place( x=5 + f1_width * i, y=20 + height, width=f1_width, height=height ) if not self.reserve_date.get(): self.choose_days[2].select() self.day = 2 if not self.reserve_time.get(): self.choose_times[6].select() self.frame_2.place( x=f_x, y=space + height * 4 + space, width=630, height=height * 3 + space * 4, ) self.label_date_1.place(x=space, y=space, width=120, height=height) self.label_date_2.place(x=space + 120, y=space, width=80, height=height) self.label_time_1.place(x=space, y=space * 2 + height, width=120, height=height) self.label_time_2.place( x=space + 120, y=space * 2 + height, width=80, height=height ) self.button_start.place(x=space + 100 + 100, y=space, width=180, height=height) self.button_stop.place( x=space + 120 + 80, y=space * 2 + height, width=180, height=height ) self.label_couner.place( x=space * 2 + 100 + 100 + 180, y=space, width=100, height=height ) self.couner_num.place( x=space * 2 + 100 + 100 + 180 + 100, y=space, width=80, height=height ) self.label_sucessed.place( x=space * 2 + 100 + 100 + 180, y=space * 2 + height, width=100, height=height, ) self.is_sucessed.place( x=space * 2 + 100 + 100 + 180 + 100, y=space * 2 + height, width=80, height=height, ) self.label_notice.place( x=space, y=space * 3 + height * 2, width=120, height=height ) self.button_notice.place( x=space + 120, y=space * 3 + height * 2, width=50, height=height ) # ------------------- self.frame_3.place(x=f_x, y=150 + 100 + space * 4, width=630, height=height * 6) for i in range(8): self.show_courts[i].place( x=10 + (f3_width + 40) * (i % 4), y=10 + (height * 2 + space) * (i // 4), width=f3_width, height=height * 2, ) self.show_courts[i].configure( background="LightGray", highlightbackground="Gold", foreground="Black" ) def job(self): _st = "07:59:30" # 开始时间 _end = "22:00:00" # 结束时间 i = 1 # 刷新次数计数器 infos = backend.load_config(self.Config_Path) while True: if self.run_flag.get() == 0: break elif _st <= strftime("%H:%M:%S", localtime()) < _end: if backend.judge_time(): dt = 2 else: dt = 20 self.update_status(True, infos, dt) else: dt = 40 self.update_status(False, infos, dt) sleep(dt) self.counter.set(i) self.couner_num.configure(textvariable=self.counter) i += 1 def start_job(self): if self.run_flag.get() == 0 and self.success.get() == "No": self.run_flag.set(1) for i in range(7): self.choose_days[i].config(state=DISABLED) self.choose_times[i].config(state=DISABLED) self.button_start.configure( bg="LightGray", state=ACTIVE, text="正在运行 ...", fg="Green" ) self.button_stop.configure(bg="Tomato", state=NORMAL, text="结束", fg="Black") # sort_place_order(self.controller) ct = int(random() * 10000) self.T[ct] = Thread(target=self.job, args=()) self.T[ct].daemon = True self.T[ct].start() elif self.success.get() == "Yes": messagebox.showinfo("提示", " =_=已经预定到啦=_= \n\n 请网页上查看! \n") else: messagebox.showinfo("提示", " =_=已经在运行啦=_= \n\n 不要重复点击! \n") def stop_job(self): if self.run_flag.get() == 1: self.run_flag.set(0) for i in range(7): self.choose_days[i].config(state=NORMAL) self.choose_times[i].config(state=NORMAL) self.button_stop.configure(bg="Gray", state=ACTIVE, text="已经停止", fg="White") self.button_start.configure( bg="SpringGreen", state=NORMAL, text="开始监控", fg="Black" ) else: messagebox.showinfo("提示", " =_=当前没有后台监控任务=_= \n\n 不要重复点击! \n ") def update_status(self, doit=False, infos=None, dt=0, mark=True): """doit 预定 flag,infos 同伴信息,dt 睡眠时间,秒;mark 用于防止递归。""" _date = self.reserve_date.get() _time = self.reserve_time.get() if _date and _time: res = {} court = backend.pian_status res, _ = backend.get_status( self.Config_Path, self.Cookie_Path, (_date, _time) ) if infos and infos["place_sort"]: sorted_keys = sort_place_order(court, infos["place_sort"]) else: sorted_keys = res.keys() for key in sorted_keys: # 2:已预约;4:不开放;1:可预约;3:使用中;5:预约中,'':不可预约 ii = int(court[key]) res_status = res[key][0] res_note = res[key][1] if res_status == 1: self.try_to_reverse(doit, infos, key, ii, _date, _time, dt) elif res_status == 2: self.show_courts[ii - 1].configure( text="{}号场地\n已被预约".format(ii), background="Black", highlightbackground="Gold", foreground="Gold", font=("Helvetica 10"), ) elif res_status == 3: self.show_courts[ii - 1].configure( text="{}号场地\n使用中".format(ii), background="Yellow", highlightbackground="Gold", foreground="Gold", font=("Helvetica 10"), ) elif res_status == 4: self.show_courts[ii - 1].configure( text="{}号场地\n不开放".format(ii), background="Gray", highlightbackground="Gold", foreground="White", font=("Helvetica 10"), ) if res_note: if len(res_note) >= 10: self.show_courts[ii - 1].configure( text="{}号场地(不开放)\n{}".format(ii, res_note), font=("Helvetica 8"), ) else: self.show_courts[ii - 1].configure( text="{}号场地(不开放)\n{}".format(ii, res_note) ) elif res_status == 5: self.show_courts[ii - 1].configure( text="{}号场地\n预约中".format(ii), background="Green", highlightbackground="Gold", foreground="Cyan", font=("Helvetica 10"), ) else: self.show_courts[ii - 1].configure( text="{}号场地\n不可预约".format(ii), background="LightGray", highlightbackground="Gold", foreground="Gold", font=("Helvetica 10"), ) if mark: self.mark_successed_place(court, _date, _time) if doit and infos: # 没有可预定或正在预定的场地,则退出预定 if res and (1, "") not in res.values() and (5, "") not in res.values(): self.stop_job() # 退出线程 messagebox.showinfo( "提示", "-" * 20 + "\n =_=没有可预约的场地=_= \n\n 请选择其他时间和日期的场地预约! \n ", ) def try_to_reverse(self, doit, infos, key, ii, _date, _time, dt): """尝试预定单个场地""" _text = "{}号场地\n可预约".format(ii) if doit and infos and self.success.get() != "Yes" and self.run_flag.get() == 1: is_ok = False try: is_ok = backend.appointment( self.Config_Path, self.Cookie_Path, key, _date, _time, infos, self.day, ) except UserWarning as UW: msg = ( "-" * 20 + "\n{}\n".format(UW) + "-" * 20 + "\n{}秒后重试".format(dt), ) if not self.message_count_down and self.show_notice: mymessage.CountDownMessageBox(self, msg) except Warning as War: _text = "{}号场地\n尝试预约,已失败".format(ii) self.stop_job() # 退出线程 msg = "-" * 20 + "\n错误信息:\n{}\n".format(War) + "-" * 20 if self.show_notice: messagebox.showerror("发生错误", msg) if is_ok: self.success.set("Yes") self.successed_info = [key, _date, _time] self.stop_job() # 退出线程 self.color_target_court(ii, _text) def color_target_court(self, ii, _text): """上色 可预约场地""" self.show_courts[ii - 1].configure( text=_text, background="Green", highlightbackground="Gold", foreground="Gold", font=("Helvetica 10"), ) def mark_successed_place(self, court, _date, _time): """标记已经预定了的场地""" if ( self.successed_info and _date == self.successed_info[1] and _time == self.successed_info[2] ): # 更新场地状态,如果显示已被预定,就表示成功预定该场地。 self.update_status(mark=False) res, _ = backend.get_status( self.Config_Path, self.Cookie_Path, (_date, _time) ) key = self.successed_info[0] if res[key][0] == 2: ii = int(court[key]) # 高亮 成功 YES self.is_sucessed.configure( textvariable=self.success, bg="LightGray", fg="Magenta" ) # 显示预定信息 success_text = str(ii) + "号 " + _date + " " + _time self.label_successed_place_info.configure( fg="Magenta", text=success_text ) self.label_sucessed_place.place( x=20 + 200, y=20 * 3 + 28 * 2, width=180, height=28 ) self.label_successed_place_info.place( x=20 + 380, y=20 * 3 + 28 * 2, width=200, height=28 ) self.show_courts[ii - 1].configure( text="{}号场地\n程序预约了该场地".format(ii), background="Magenta", highlightbackground="Green", foreground="White", font=("Helvetica 10"), ) else: self.successed_info = [] self.success.set("No") def set_reserve_date(self, day): self.update_status() self.day = day def set_reserve_time(self): self.update_status() def get_status(self): if self.run_flag.get() != 1: self.update_status() def turn_on_notice(self): if self.show_notice: self.show_notice = False self.button_notice.configure(text="否", bg="LightGray") else: self.show_notice = True self.button_notice.configure(text="是", bg="Pink")
def showWindow(tag): subWindow = Tk() if tag == 'map': subWindow.title('地图') subWindow.geometry('450x400') rootpath = os.getcwd()+os.sep+'archive'+os.sep+'map' leftBg = Frame(subWindow) var = BooleanVar(leftBg) check = Checkbutton(leftBg, text = "生成HTML文件而非图片", variable=var).grid(row=0, column=1, columnspan=3) hit1 = Button(leftBg, text = "全国各地疫情关注情况热力图1", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况热力图1.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况热力图1.html')).grid(row=2, column=1) hit2 = Button(leftBg, text = "全国各地疫情关注情况热力图2", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况热力图2.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况热力图2.html')).grid(row=4, column=1) hit3 = Button(leftBg, text = "全国各地疫情关注情况热力图3", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况热力图3.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况热力图3.html')).grid(row=6, column=1) fill1 = Button(leftBg, text = "全国各地疫情关注情况填充图1", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况填充图1.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况填充图1.html')).grid(row=8 , column=1) fill2 = Button(leftBg, text = "全国各地疫情关注情况填充图2", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况填充图2.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况填充图2.html')).grid(row=10, column=1) fill3 = Button(leftBg, text = "全国各地疫情关注情况填充图3", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'全国各地疫情关注情况填充图3.png', var.get(), rootpath+os.sep+'html'+os.sep+'全国各地疫情关注情况填充图3.html')).grid(row=12, column=1) hbHit = Button(leftBg, text = "疫情期间湖北各市受关注度分布", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'疫情期间湖北各市受关注度分布.png', var.get(), rootpath+os.sep+'html'+os.sep+'疫情期间湖北各市受关注度分布.html')).grid(row=2, column=3) nationalHit = Button(leftBg, text = "疫情期间全国各地受关注度分布", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'疫情期间全国各地受关注度分布.png', var.get(), rootpath+os.sep+'html'+os.sep+'疫情期间全国各地受关注度分布.html')).grid(row=4, column=3) pst = Button(leftBg, text = "疫情期间全国各地积极度", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'疫情期间全国各地积极度.png', var.get(), rootpath+os.sep+'html'+os.sep+'疫情期间全国各地积极度.html')).grid(row=6, column=3) ngt = Button(leftBg, text = "疫情期间全国各地消极度", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'疫情期间全国各地消极度.png', var.get(), rootpath+os.sep+'html'+os.sep+'疫情期间全国各地消极度.html')).grid(row=8, column=3) stm = Button(leftBg, text = "疫情期间全国各地情绪分布", command = lambda: showImg(rootpath+os.sep+'png'+os.sep+'疫情期间全国各地情绪分布.png', var.get(), rootpath+os.sep+'html'+os.sep+'疫情期间全国各地情绪分布.html')).grid(row=10, column=3) emptyBottom = Frame(leftBg).grid(row=11, column = 4) setGrid(leftBg, 20) leftBg.pack() elif tag == 'wordcloud': subWindow.title('词云图') subWindow.geometry('400x300') rootpath = os.getcwd()+os.sep+'archive'+os.sep+'wordcloud' bg = Frame(subWindow) botton1 = Button(bg, text = "疫情", command = lambda: showImg(rootpath+os.sep+'武汉 疫情 口罩 医院 战疫 钟南山 肺炎.jpg')).grid(row=1) botton2 = Button(bg, text = "作息", command = lambda: showImg(rootpath+os.sep+'熬夜 吃饭 早饭 午饭 晚饭 夜宵 睡觉 起床.jpg')).grid(row=3) botton3 = Button(bg, text = "复工复产", command = lambda: showImg(rootpath+os.sep+'上班 办公室 复工 复产 工作.jpg')).grid(row=5) botton4 = Button(bg, text = "复学", command = lambda: showImg(rootpath+os.sep+'开学 返校 复学.jpg')).grid(row=7) emptyBottom = Frame(bg).grid(row=8) setGrid(bg, 20) bg.pack() elif tag == 'chart': subWindow.title('折线图') subWindow.geometry('400x300') rootpath = os.getcwd()+os.sep+'archive'+os.sep+'chart' # 博客数 leftBg = Frame(subWindow) leftLabelFrame = LabelFrame(subWindow, text = "媒体博客数", labelanchor="nw") leftLabelFrame.place(relx=0.02, rely=0.02, relwidth=0.47, relheight=0.96) leftBg = Frame(leftLabelFrame) mapBotton1 = Button(leftBg, text = "疫情", command = lambda: showImg(rootpath+os.sep+'media武汉 疫情 口罩 医院 战疫 钟南山 肺炎.png')).grid(row=1) wordBotton1 = Button(leftBg, text = "作息", command = lambda: showImg(rootpath+os.sep+'media熬夜 吃饭 早饭 午饭 晚饭 夜宵 睡觉 起床.png')).grid(row=3) chartBotton1 = Button(leftBg, text = "复工复产", command = lambda: showImg(rootpath+os.sep+'media上班 办公室 复工 复产 工作.png')).grid(row=5) betaBotton1 = Button(leftBg, text = "复学", command = lambda: showImg(rootpath+os.sep+'media开学 返校 复学.png')).grid(row=7) emptyBottom1 = Frame(leftBg).grid(row=8) setGrid(leftBg, 20) leftBg.pack() # 评论&转发 rightLabelFrame = LabelFrame(subWindow, text = "评论数与转发数", labelanchor="nw") rightLabelFrame.place(relx=0.51, rely=0.02, relwidth=0.47, relheight=0.96) rightBg = Frame(rightLabelFrame) mapBotton2 = Button(rightBg, text = "疫情", command = lambda: showImg(rootpath+os.sep+'武汉 疫情 口罩 医院 战疫 钟南山 肺炎.png')).grid(row=1) wordBotton2 = Button(rightBg, text = "作息", command = lambda: showImg(rootpath+os.sep+'熬夜 吃饭 早饭 午饭 晚饭 夜宵 睡觉 起床.png')).grid(row=3) chartBotton2 = Button(rightBg, text = "复工复产", command = lambda: showImg(rootpath+os.sep+'上班 办公室 复工 复产 工作.png')).grid(row=5) betaBotton2 = Button(rightBg, text = "复学", command = lambda: showImg(rootpath+os.sep+'开学 返校 复学.png')).grid(row=7) emptyBottom2 = Frame(rightBg).grid(row=8) setGrid(rightBg, 20) rightBg.pack() elif tag == 'sentiment': subWindow.title('NLP情绪分析(Beta)') subWindow.geometry('400x450') rootpath = os.getcwd()+os.sep+'archive'+os.sep+'sentimentchart (Beta)' bg = Frame(subWindow) botton1 = Button(bg, text = "分组1-数量图", command = lambda: showImg(rootpath+os.sep+'bar result1.png')).grid(row=1) botton2 = Button(bg, text = "分组2-数量图", command = lambda: showImg(rootpath+os.sep+'bar result1.png')).grid(row=3) botton3 = Button(bg, text = "分组3-数量图", command = lambda: showImg(rootpath+os.sep+'bar result1.png')).grid(row=5) botton4 = Button(bg, text = "箱型图", command = lambda: showImg(rootpath+os.sep+'box.png')).grid(row=7) botton4 = Button(bg, text = "密度图", command = lambda: showImg(rootpath+os.sep+'density.png')).grid(row=9) emptyBottom = Frame(bg).grid(row=10) setGrid(bg, 20) bg.pack() subWindow.mainloop()
class Aplicacion: def __init__(self): self.ventana1 = tk.Tk() self.ventana1.title('TytusDB') self.ventana1.geometry("850x450+100+100") self.ventana1.configure(background='white') #self.load = tk.Image.open("icondb.png") #self.ventana1.iconphoto(False, ImageTk.PhotoImage(self.load)) #TEXTO DE ENTRADA self.scrolledtext1 = st.ScrolledText(self.ventana1, wrap=tk.WORD, width=50, height=7, font=("Times New Roman", 15)) self.scrolledtext1.place(x=290, y=40) self.framecopia() #TEXTO DE SALIDA self.scrolledtext2 = st.ScrolledText(self.ventana1, wrap=tk.WORD, width=50, height=7, font=("Times New Roman", 15)) self.scrolledtext2.place(x=290, y=250) #MENU self.menubar = Menu(self.ventana1, background="gray") self.ventana1.config(menu=self.menubar) self.fileMenu = Menu(self.menubar) self.fileMenu.add_command(label="Exit", command=self.Exit) self.menubar.add_cascade(label="File", menu=self.fileMenu) self.menubar.add_cascade(label="Object") self.menubar.add_cascade(label="Tools") self.FileA = Menu(self.menubar) self.FileA.add_command(label="Acerca de", command=self.MensajeAcercaDe) self.menubar.add_cascade(label="Help", menu=self.FileA) #BARRA DE HERRAMIENTAS DEL CENTRO self.BarraHerramientas = LabelFrame(self.ventana1, text='', background="white") self.BarraHerramientas.grid(row=0, column=0, columnspan=3, pady=95) self.BarraHerramientas.place(x=450, y=210) #IMAGEN DEL CENTRO self.load1 = Image.open("tytus.gif") self.render1 = ImageTk.PhotoImage(self.load1) self.img1 = Label(self.ventana1, image=self.render1) self.img1.image = self.render1 self.img1.place(x=290, y=210) tk.Label(self.ventana1, text="Salida", font=("Arial", 20), background='#B5F5E0', foreground="black").place(x=370, y=210) #BOTON CORRER self.boton1 = ttk.Button(self.BarraHerramientas, text="RUN", command=self.copiar) self.boton1.pack() #IMAGEN self.load = Image.open("icondb.png") self.render = ImageTk.PhotoImage(self.load) self.img = Label(self.ventana1, image=self.render) self.img.image = self.render self.img.place(x=0, y=0) self.ventana1.iconphoto(False, ImageTk.PhotoImage(self.load)) self.ventana1.mainloop() #CONFIGURANDO PARA LA BASE DE DATOS. def framecopia(self): self.Bases = LabelFrame(self.ventana1, text='BASES DE DATOS EXISTENTES', background="white") self.Bases.grid(row=0, column=0, columnspan=3, pady=95) Label(self.Bases, text='BASES DE DATOS 1').grid(row=1, column=0) Label(self.Bases, text='BASES DE DATOS 2').grid(row=2, column=0) Label(self.Bases, text='BASES DE DATOS 3').grid(row=3, column=0) Label(self.Bases, text='BASES DE DATOS 3.1').grid(row=4, column=1) Label(self.Bases, text='BASES DE DATOS 3.2').grid(row=5, column=1) Label(self.Bases, text='BASES DE DATOS 4').grid(row=6, column=0) def copiar(self): #iniciofila=self.dato1.get() #iniciocolumna=self.dato2.get() #finfila=self.dato3.get() #fincolumna=self.dato4.get() datos = self.scrolledtext1.get(1.0, tk.END) self.scrolledtext2.delete("1.0", tk.END) self.scrolledtext2.insert("1.0", datos) def MensajeAcercaDe(self): messagebox.showinfo( message= "ESTE PROGRAMA ES REALIZADO \n POR EL GRUPO 8:\n \n Version 1.0.0", title="TytusDB") def Exit(self): messagebox.showinfo(message="Gracias por utilizar este programa! :v", title="TytusDB") quit()
class ExerciseFrame(Frame): def __init__(self, master, subject, font_name): super().__init__(master) self.master = master self.subject = subject self.pack(fill=BOTH, expand=1) # 自身Frame最大化 # counting 显示信息 # self._answer_times = 0 # 做过几次 self._answer_times_variable = StringVar() # 做过几次变量 # self._correct_times = 0 # 答对过几次 self._correct_variable = StringVar() # 答对次数变量 self._rate_variable = StringVar() # 答对率变量 # self._weight = 0.0 # 题目权重 self._weight_variable = StringVar() # 权重变量 self._info_variable = StringVar() # self._answer_string = '' # 答案 self._answer_variable = StringVar() # 答案变量 self._answer_variable.set(ANSWER_PSEUDO) # 字体 self._my_font = Font(family=font_name, size=14) self._my_small_font = Font(family=font_name, size=12) self._my_bold_font = Font(family=font_name, size=14, weight='bold') self._my_big_font = Font(family=font_name, size=28, weight='bold') self._init_stem() self._init_counting() self._init_input() def _init_stem(self): # 题干&解析按钮 self._stem_button = Button(self, text='题干', font=self._my_small_font, width=8, height=1, relief='flat', command=self._show_stem) self._stem_button.place(x=15, y=5, anchor='nw') self._ana_button = Button(self, text='解析', font=self._my_small_font, width=8, height=1, relief='flat', command=self._show_ana) # self._ana_button.place(x=100, y=5, anchor='nw') self._canvas_stem = Canvas(self) self._canvas_stem.config(width=900, height=400, bg='white', relief='flat') self._canvas_ana = Canvas(self) self._canvas_ana.config(width=900, height=400, bg='white', relief='flat') self._show_stem() def _init_counting(self): self._counting_frame = LabelFrame(self, text="统计", font=self._my_bold_font, padx=5, pady=5, width=250, height=416) self._label_times = Label(self._counting_frame, text="答题次数:", font=self._my_font, width=8, anchor="e") self._label_correct = Label(self._counting_frame, text="答对次数:", font=self._my_font, width=8, anchor="e") self._lable_rate = Label(self._counting_frame, text="答 对 率:", font=self._my_font, width=8, anchor="e") self._lable_weight = Label(self._counting_frame, text="权 值:", font=self._my_font, width=8, anchor="e") self._value_times = Label(self._counting_frame, textvariable=self._answer_times_variable, font=self._my_font, wraplength=80, justify="left") self._value_correct = Label(self._counting_frame, textvariable=self._correct_variable, font=self._my_font, wraplength=80, justify="left") self._value_rate = Label(self._counting_frame, textvariable=self._rate_variable, font=self._my_font, wraplength=80, justify="left") self._value_weight = Label(self._counting_frame, textvariable=self._weight_variable, font=self._my_font, wraplength=80, justify="left") self._label_info = Label(self._counting_frame, textvariable=self._info_variable, font=self._my_big_font, wraplength=180, justify="right", fg='blue') self._counting_frame.place(x=935, y=30, anchor='nw') self._label_times.place(x=5, y=5, anchor='nw') self._value_times.place(x=125, y=5, anchor='nw') self._label_correct.place(x=5, y=35, anchor='nw') self._value_correct.place(x=125, y=35, anchor='nw') self._lable_rate.place(x=5, y=65, anchor='nw') self._value_rate.place(x=125, y=65, anchor='nw') self._lable_weight.place(x=5, y=95, anchor='nw') self._value_weight.place(x=125, y=95, anchor='nw') self._label_info.place(x=70, y=300, anchor='nw') def _init_input(self): self._input_frame = LabelFrame(self, text="答题区域", font=self._my_bold_font, padx=5, pady=5, width=1170, height=138) self._input_frame.place(x=15, y=450, anchor='nw') self._button_check = Button(self._input_frame, text="提交答案", command=self._check, font=self._my_font, width=16) self._button_check.place(x=930, y=2, anchor='nw') self._label_answer = Label(self._input_frame, textvariable=self._answer_variable, font=self._my_font, fg='black') self._label_answer.place(x=10, y=55, anchor='nw') self._button_next = Button(self._input_frame, text="下一道题", command=self._next, font=self._my_font, width=16) self._button_next.bind("<Return>", self._next) # 解决回车问题 self._button_return = Button(self._input_frame, text="回主界面", command=self._return, font=self._my_font, width=16) self._button_return.bind("<Return>", self._return) # 解决回车问题 def set_exercise(self, e, seq, total): global photo_stem, photo_ana self.exercise = e self.seq = seq self.total = total string_info = "%d/%d" % (self.seq, self.total) self._info_variable.set(string_info) self._answer_times_variable.set(self.exercise.answer_times) self._correct_variable.set(self.exercise.correct_times) rate_value = round(self.exercise.get_correct_rate() * 100, 2) self._rate_variable.set(str(rate_value) + '%') self._weight_variable.set(round(self.exercise.weight, 2)) if STYLE.IMG_FILE == self.exercise.d_style and \ len(self.exercise.stem) > 0: pic_stem_file_name = SCRIPT_PATH + "/../raw/" + \ Subject.get_string(self.subject) + '/' + \ str(self.exercise.id) + "-stem.png" image_stem = Image.open(pic_stem_file_name) photo_stem = ImageTk.PhotoImage(image_stem) self._canvas_stem.create_image(5, 5, anchor=NW, image=photo_stem) if STYLE.TEXT_IN_DB == self.exercise.d_style and \ len(self.exercise.stem) > 0: self._canvas_stem.create_text((10, 5), text=self.exercise.stem, font=self._my_font, anchor='nw', width=860) if STYLE.IMG_FILE == self.exercise.e_style and \ len(self.exercise.explain) > 0: pic_ana_file_name = SCRIPT_PATH + "/../raw/" + \ Subject.get_string(self.subject) + '/' + \ str(self.exercise.id) + "-ana.png" image_ana = Image.open(pic_ana_file_name) photo_ana = ImageTk.PhotoImage(image_ana) self._canvas_ana.create_image(5, 5, anchor=NW, image=photo_ana) if STYLE.TEXT_IN_DB == self.exercise.e_style and \ len(self.exercise.explain) > 0: self._canvas_ana.create_text((10, 5), text=self.exercise.explain, font=self._my_font, anchor='nw', width=860) def _check(self, is_correct=False): print("ExerciseFrame _check, is_correct=", is_correct) self._answer_times_variable.set(self.exercise.answer_times) self._correct_variable.set(self.exercise.correct_times) rate_value = round(self.exercise.get_correct_rate() * 100, 2) self._rate_variable.set(str(rate_value) + '%') self._weight_variable.set(round(self.exercise.weight, 2)) if is_correct: self.master.event_generate("<<check-correct>>") else: self.master.event_generate("<<check-wrong>>") promopt_string = '' # check之后显示答案和ana按钮 if is_correct: self._label_answer.configure(fg='green') promopt_string += "答对了! " if self.seq == self.total: self._button_return.place(x=930, y=50, anchor='nw') self._button_return.focus() else: self._button_next.place(x=930, y=50, anchor='nw') self._button_next.focus() else: self._label_answer.configure(fg='red') promopt_string += "答错了! 正确答案是: " + self.exercise.key + "。" if len(self.exercise.explain) > 0: promopt_string += " 请点击解析按钮查看解析。" self._ana_button.place(x=100, y=5, anchor='nw') self._answer_variable.set(promopt_string) def _next(self, event=None): print("Exercise Frame _next called") self.master.event_generate("<<next>>") def _return(self, event=None): self.master.event_generate("<<finish>>") def _show_stem(self): self._ana_button.configure(bg='lightgray', fg='black') self._stem_button.configure(bg='blue', fg='white') self._canvas_ana.place_forget() self._canvas_stem.place(x=14, y=42, anchor='nw') def _show_ana(self): self._stem_button.configure(bg='lightgray', fg='black') self._ana_button.configure(bg='blue', fg='white') self._canvas_stem.place_forget() self._canvas_ana.place(x=14, y=42, anchor='nw')
class App_Button(object): """docstring for App_Button""" def __init__(self, master, text=None, styles=None, command=None, image=None, title=None, disabled=False): super(App_Button, self).__init__() self.master = master self.text = text self.styles = styles self.command = command self.image = image self.title = title self.disabled = disabled self.putButton() def putButton(self): self.btn_wrapper = LabelFrame(self.master, relief=FLAT, borderwidth=0) self.btn = Button(self.btn_wrapper, text=self.text, relief=FLAT, bg=self.styles['btn_bg'], padx=self.styles['padx'], pady=self.styles['pady'], fg=self.styles['btn_fg'], borderwidth=0, font=self.styles['big_font'], command=self.command, image=self.image, activeforeground=self.styles['a_fg'], activebackground=self.styles['a_bg'], cursor="hand2") self.btn.image = self.image if self.disabled: self.btn.bind("<Button-1>", lambda x: "break") else: self.btn.bind("<Enter>", self.mouseover) self.btn.bind("<Leave>", self.mouseout) self.btn.pack() if self.title is not None: self.tooltip = App_Tooltip(self.btn, text=self.title) def mouseover(self, event): self.btn.config(fg=self.styles['h_fg']) self.btn.config(bg=self.styles['h_bg']) def mouseout(self, event): self.btn.config(fg=self.styles['btn_fg']) self.btn.config(bg=self.styles['btn_bg']) def bind(self, *args, **kwargs): self.btn.bind(*args, **kwargs) def bind_wrapper(self, *args, **kwargs): self.btn_wrapper.bind(*args, **kwargs) def pack(self, *args, **kwargs): self.btn_wrapper.pack(*args, **kwargs) def place(self, *args, **kwargs): self.btn_wrapper.place(*args, **kwargs) def config(self, *args, **kwargs): self.btn.config(*args, **kwargs) def set_tooltip(self, text): self.tooltip.configure(text=text) def pack_forget(self): self.btn_wrapper.pack_forget() def place_forget(self): self.btn_wrapper.place_forget() def winfo_rootx(self): return self.btn_wrapper.winfo_rootx() def winfo_rooty(self): return self.btn_wrapper.winfo_rooty() def winfo_height(self): return self.btn_wrapper.winfo_height() def winfo_width(self): return self.btn_wrapper.winfo_width()
new_item = Menu(menu, tearoff=0) new_item.add_command(label='Открыть', command=clicked) new_item.add_command(label='Закрыть программу', command=quit) menu.add_cascade(label='Файл', menu=new_item) ph = PhotoImage(file="open.png") ph1 = PhotoImage(file="train.png") photo = Image.open('not loaded.png') photo = photo.resize((430, 116)) photo.save('Temp\q.png') window.photo = PhotoImage(file='Temp\q.png') vlabel = Label(window, image=window.photo) vlabel.place(x=200, y=20) selected = IntVar() label_frame = LabelFrame(window, text='Функции активации') label_frame.place(x=20, y=100) Radiobutton(label_frame, text='Сигмоидная', value=1, variable=selected).grid(row=0, column=0, sticky=W) Radiobutton(label_frame, text='Линейная', value=2, variable=selected).grid(row=1, column=0, sticky=W) Radiobutton(label_frame, text='ReLu', value=3, variable=selected).grid(row=2, column=0, sticky=W) Radiobutton(label_frame, text='Гиперболический тангенс', value=4, variable=selected).grid(row=3, column=0, sticky=W) Radiobutton(label_frame, text='softmax', value=5, variable=selected).grid(row=4, column=0, sticky=W) Sel = selected.get() Selspis = ['sigmoid', 'linear', 'relu', 'tahn', 'softmax'] btn = Button(height=50, width=50, image=ph, command=openimg)