class Scratchpad: def __init__(self): self.window = Tk() self.window.title("Onager Scratchpad") self.create_frame() self.create_editing_window() self.window.bind('<F7>', self.save_file) self.window.bind('<F5>', self.open_file) def create_frame(self): frame_style = Style() frame_style.theme_use('alt') frame_style.configure("TFrame", relief='raised') self.frame = Frame(self.window, style="frame_style.TFrame") self.frame.rowconfigure(1) self.frame.columnconfigure(1) self.frame.grid(row=0, column=0) def create_editing_window(self): self.editing_window = ScrolledText(self.frame) self.editing_window.configure(fg='gold', bg='blue', font='serif 12', padx='15', pady='15', wrap='word', borderwidth='10', relief='sunken', tabs='48', insertbackground='cyan') self.editing_window.grid(row=0, column=0) def save_file(self, event=None): name = asksaveasfilename() outfile = open(name, 'w') contents = self.editing_window.get(0.0, END) outfile.write(contents) outfile.close() def open_file(self, event=None): name = askopenfilename() infile = open(name, 'r') contents = infile.read() self.editing_window.insert(INSERT, contents) infile.close()
class Logger(Frame): ERROR, BORRING, EVENT, NORMAL = "error", "borring", "event", None def __init__(self, *args, **kw): text_height = kw.pop("text_height", 25) Frame.__init__(self, *args, **kw) self.deque = deque() self.txt = ScrolledText(self, wrap=WORD, state=DISABLED, relief=SUNKEN, height=text_height) self.txt.grid(column=0, row=0, sticky=(N, W, E, S)) self.txt.configure(LoggerColors.default) for k, v in LoggerColors.tags.items(): self.txt.tag_configure(k, v) self.columnconfigure(0, weight=1) self.rowconfigure(0, weight=1) self.after(100, self._toscreen) def __call__(self, *args): self.deque.appendleft(args) def _toscreen(self): if len(self.deque): self.txt["state"] = NORMAL while(len(self.deque)): self.txt.insert( END, "\n[{}] ".format(strftime("%H:%M:%S")), "time", *self.deque.pop()) self.txt.yview(END) self.txt["state"] = DISABLED self.after(100, self._toscreen)
class Type: def __init__(self, master, essay, tips): self.master = master self.essay = essay shuffle(tips) self.tips = iter(cycle(tips)) self.temp = self.essay[1] self.passage = Label(self.master, text=self.essay[0], padx=45, pady=50, bg='#ffffbb', font=('Verdana', 15), relief=RAISED, justify=LEFT, wraplength=1269) self.passage.pack(side=TOP, fill=X) self.textinput = ScrolledText(self.master, width=90, height=18, bd=10, font=('Garamond', 15), state=NORMAL, wrap=WORD) self.textinput.place(x=290, y=290) self.timer_clicked = False minutes = self.temp // 60 seconds = self.temp % 60 self.countdown = Label(text='{}:{:02d}'.format(minutes, (seconds)), font=('Arial', 19), bg='yellow', relief=GROOVE) self.countdown.place(x=620, y=250) self.countdown.bind('<Button-1>', self.count) self.textinput.bind('<Control-Return>', lambda dummy=0: self.submit()) self.submitted = False self.draw() def draw(self): self.result = Label(text='', font=('Arial', 18, 'bold')) self.result.place(x=50, y=350) self.remark = Label(text='', font=('Arial', 18, 'bold')) self.remark.place(x=65, y=550) self.random_tip = Button(self.master, text='Tips', font=('Arial', 12, 'bold'), fg='black', bg='powder blue', relief=GROOVE, width=10, command=self.show_tips) self.random_tip.place(x=1180, y=370) self.exit_btn = Button(self.master, text='Quit', font=('Arial', 12, 'bold'), fg='black', bg='powder blue', relief=GROOVE, width=10, command=lambda: self.master.destroy()) self.exit_btn.place(x=1180, y=420) self.restart_btn = Button(self.master, text='Restart', font=('Arial', 12, 'bold'), fg='black', bg='powder blue', width=10, relief=GROOVE, command=self.restart) self.restart_btn.place(x=1180, y=550) level = ['Easy', 'Normal', 'Hard'] self.level_var = StringVar() self.level_var.set('Normal') self.difficulty_easy = ttk.Radiobutton(self.master, text='Easy', variable=self.level_var, value='Easy', command=self.level_change) self.difficulty_easy.place(x=1280, y=280) self.difficulty_normal = ttk.Radiobutton(self.master, text='Normal', variable=self.level_var, value='Normal', command=self.level_change) self.difficulty_normal.place(x=1280, y=300) self.difficulty_hard = ttk.Radiobutton(self.master, text='Hard', variable=self.level_var, value='Hard', command=self.level_change) self.difficulty_hard.place(x=1280, y=320) self.difficulty = Label(self.master, text=f'Difficulty: Normal', font=('Times', 14), fg='orange') self.difficulty.place(x=1190, y=230) self.start_text = Label(self.master, text='Click the Timer to Start!', font=('Courier', 13, 'bold underline')) self.start_text.place(x=530, y=220) def submit(self): self.submitted = True def calculate(self): total = self.essay[0].split() typed_words = self.textinput.get(1.0, END).split() correct = [] incorrect = [] wrong_case = [] excess_words = [] if len(typed_words) == len(total): for i in range(len(total)): if total[i] == typed_words[i]: correct.append(total[i]) else: incorrect.append(typed_words[i]) if typed_words[i].lower() == total[i].lower(): wrong_case.append(typed_words[i]) elif len(typed_words) < len(total): diff = len(total) - len(typed_words) for i in range(len(typed_words)): if typed_words[i] == total[i]: correct.append(typed_words[i]) else: incorrect.append(typed_words[i]) if typed_words[i].lower() == total[i].lower(): wrong_case.append(typed_words[i]) empty = ['space'] * diff for e in empty: incorrect.append(e) else: for i in range(len(total)): if typed_words[i] == total[i]: correct.append(typed_words[i]) else: incorrect.append(typed_words[i]) if typed_words[i].lower() == total[i].lower(): wrong_case.append(typed_words[i]) for i in range(1, len(typed_words) - len(total)): excess_words.append(typed_words[-i]) for i in excess_words: incorrect.append(i) score = 100 - ((len(incorrect) / len(total)) * 100) self.result.configure( text=f'Accuracy: {round(score) if score > 0 else 0}%\n\n' + f'Wrong Case: {len(wrong_case)}\n\n Excess Words: {len(excess_words)}' ) if score >= 70: color = 'green' word = 'PASS' else: color = 'red' word = 'FAIL' self.remark.configure(text=f"Remark: {word}", fg=color) return True def run(self, name, temp): self.start_text.destroy() self.timer_clicked = True self.textinput.delete(1.0, END) self.textinput.focus() try: while 1: mins, secs = divmod(temp, 60) self.countdown.configure(text='{}:{:02d}'.format(mins, secs)) if temp == 0: self.countdown.configure(text='Time UP') self.textinput.configure(state=DISABLED) self.calculate() return elif temp <= 10: self.countdown.configure(bg='red', fg='white') if self.submitted == True: self.calculate() return temp -= 1 sleep(1) self.master.update() except RuntimeError: print('MASTER TYPING HAS BEEN CLOSED') except TclError: print('MASTER TYPING HAS BEEN CLOSED') def count(self, event): if not self.timer_clicked: _thread.start_new_thread(self.run, ('Timer', self.temp)) def restart(self): self.master.destroy() main() def level_change(self): if not self.timer_clicked: if self.level_var.get() == 'Easy': self.temp = self.temp + 30 colour = 'green' elif self.level_var.get() == 'Normal': self.temp = self.essay[1] colour = 'orange' else: self.temp -= 30 colour = 'red' minutes = self.temp // 60 seconds = self.temp % 60 self.difficulty.configure( text=f'Difficulty: {self.level_var.get()}', fg=colour) self.countdown.configure( text='{}:{:02d}'.format(minutes, (seconds))) self.master.update() def show_tips(self): showinfo(title='Tip', message=next(self.tips))
ENBTN = Button(tab1, text="Encrypt Database", command=encrypt, state=DISABLED) ENBTN.grid(column=2, row=5) else: ENBTN = Button(tab1, text="Encrypt Database", command=encrypt) ENBTN.grid(column=2, row=5) if encryptcheck() == 0: DNBTN = Button(tab1, text="Decrypt Database", command=decrypt, state=DISABLED) DNBTN.grid(column=3, row=5) else: DNBTN = Button(tab1, text="Decrypt Database", command=decrypt) DNBTN.grid(column=3, row=5) lbl5 = Label(tab2, text="Log events:") lbl5.grid(column=0,row=0) LOG = ScrolledText(tab2,width=100,height=10,wrap=WORD) LOG.grid(column=0,row=1,columnspan=4) LOG.configure(state='disabled') RE = Button(tab2, text="Refresh", command=update_log) RE.grid(column=0, row=2) splunk = Button(tab2, text="Go see splunk dashboard") splunk.grid(column=1, row=2) splunk.bind("<Button-1>", lambda e: callback("http://127.0.0.1:8000/en-US/app/search/ispj")) ##es = Button(tab2, text="Go see ElasticSearch dashboard") ##es.grid(column=2, row=2) ##es.bind("<Button-1>", lambda e: callback("http://127.0.0.1:8000/en-US/app/search/ispj")) PATH.focus() window.mainloop()
class ToolsGui(): def __init__(self, init_window_name): self.init_window_name = init_window_name self.bs64image = None def md5_upper_event(self, event): self.str_trans_to_md5(True) def fast_copy(self): data = self.result_data_Text.get(0.0, END).strip() pyperclip.copy(data) # 设置窗口 def set_init_window(self): # 左侧视图 self.init_window_name.update() print(self.init_window_name.winfo_width()) frm1 = Frame(self.init_window_name) frm1.pack(fill=BOTH, side=LEFT, expand=True) self.init_data_label = Label(frm1, text="待处理数据", font=("宋体", 15, "bold"), height=2, bg='dodgerblue') self.init_data_label.pack(fill=X) self.init_data_Text = ScrolledText(frm1, undo=True) # 原始数据录入框 self.init_data_Text.pack(fill=BOTH, expand=True) self.log_label = Label(frm1, text="日志", font=("宋体", 15, "bold"), height=2, bg='dodgerblue') self.log_label.pack(fill=X) self.log_data_Text = ScrolledText(frm1, ) # 日志框 self.log_data_Text.pack(fill=BOTH, expand=True) # 中间按钮试图 frm2 = Frame(self.init_window_name) frm2.pack(fill=BOTH, side=LEFT, expand=True) # md5计算 self.str_trans_to_md5_button = Button(frm2, text="MD5计算\n(右键点击大写)", bg="limegreen", command=self.str_trans_to_md5) self.str_trans_to_md5_button.bind('<Button-3>', self.md5_upper_event, add=True) self.str_trans_to_md5_button.pack(fill=BOTH, expand=True) # base64编码 self.str_trans_to_bs64_button = Button(frm2, text="base64编码", bg="gold", command=self.str_trans_to_bs64) self.str_trans_to_bs64_button.pack(fill=BOTH, expand=True) # base64解码 self.bs64_trans_to_str_button = Button(frm2, text="base64解码", bg="limegreen", command=self.bs64_trans_to_str) self.bs64_trans_to_str_button.pack(fill=BOTH, expand=True) # url编码 self.str_trans_to_url_button = Button(frm2, text="URL编码", bg="gold", command=self.str_trans_to_url) self.str_trans_to_url_button.pack(fill=BOTH, expand=True) # url解码 self.url_trans_to_str_button = Button(frm2, text="URL解码", bg="limegreen", command=self.url_trans_to_str) self.url_trans_to_str_button.pack(fill=BOTH, expand=True) # unicode转中文 self.unicode_trans_to_zh_button = Button( frm2, text="Unicode转中文", bg="gold", command=self.unicode_trans_to_zh) self.unicode_trans_to_zh_button.pack(fill=BOTH, expand=True) # json格式化 self.str_trans_to_json_button = Button(frm2, text="Json格式化", bg="limegreen", command=self.str_trans_to_json) self.str_trans_to_json_button.pack(fill=BOTH, expand=True) # base64转图片 self.bs64_trans_to_pic_button = Button(frm2, text="base64转图片", bg="gold", command=self.bs64_trans_to_pic) self.bs64_trans_to_pic_button.pack(fill=BOTH, expand=True) # 图片转base64 self.pic_trans_to_bs64_button = Button(frm2, text="图片转base64", bg="limegreen", command=self.pic_trans_to_bs64) self.pic_trans_to_bs64_button.pack(fill=BOTH, expand=True) # chrome请求头转换 self.header_trans_to_json_button = Button( frm2, text="请求头转Json", bg="gold", command=self.header_trans_to_json) self.header_trans_to_json_button.pack(fill=BOTH, expand=True) # 右侧结果试图 frm3 = Frame(self.init_window_name) frm3.pack(fill=BOTH, side=RIGHT, expand=True) self.result_data_label = Label(frm3, height=2, text="输出结果", font=("宋体", 15, "bold"), bg="dodgerblue") self.result_data_label.pack(fill=X) copybtn = Button(self.result_data_label, text='一键复制', command=self.fast_copy) copybtn.pack(side=RIGHT) self.result_data_Text = ScrolledText(frm3) # 处理结果展示 self.result_data_Text.pack(fill=BOTH, expand=True) # 功能函数 def str_trans_to_md5(self, upper=False): src = self.init_data_Text.get(0.0, END).strip().encode() if src: try: myMd5 = hashlib.md5() myMd5.update(src) res = myMd5.hexdigest() if upper: res = res.upper() self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def str_trans_to_bs64(self): src = self.init_data_Text.get(0.0, END).strip().encode() if src: try: res = base64.b64encode(src) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def bs64_trans_to_str(self): src = self.init_data_Text.get(0.0, END).strip().encode() if src: try: res = base64.b64decode(src).decode() self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def str_trans_to_url(self): src = self.init_data_Text.get(0.0, END).strip().encode() if src: try: res = urllib.parse.quote(src) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def url_trans_to_str(self): src = self.init_data_Text.get(0.0, END).strip() if src: try: res = urllib.parse.unquote(src) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def unicode_trans_to_zh(self): src = self.init_data_Text.get(0.0, END).strip() print(src, type(src)) if src: try: src = src.replace('\\\\u', '\\u') res = src.encode().decode('unicode_escape') print(res, type(res)) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def str_trans_to_json(self): src = self.init_data_Text.get(0.0, END).strip() if src: try: tmp = eval(src) res = json.dumps(tmp, ensure_ascii=False, indent=4) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def pic_trans_to_bs64(self): try: picpath = filedialog.askopenfilename(title='选择图片文件', filetypes=[('PNG图片', '*.png'), ('JPG图片', ('*.jpg', '*.jpe', '*.jpeg')), ('BMP图片', '*.bmp'), ('所有文件', '*')]) if picpath: self.init_data_Text.delete(1.0, END) self.init_data_Text.insert(1.0, '图片路径:\n' + picpath) with open(picpath, 'rb') as handle: image_base64 = str(base64.b64encode(handle.read()), encoding='utf-8') self.write_res_to_text(image_base64) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def bs64_trans_to_pic(self): src = self.init_data_Text.get(0.0, END).strip() if src: try: binary_data = base64.b64decode(src) # print(binary_data) img_data = BytesIO(binary_data) img_open = Image.open(img_data) self.bs64image = ImageTk.PhotoImage(img_open) self.result_data_Text.delete(1.0, END) self.result_data_Text.image_create(END, image=self.bs64image) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) def header_trans_to_json(self): src = self.init_data_Text.get(0.0, END).strip() if ': ' in src: try: lines = src.split('\n') h = {} for line in lines: if line: l = line.split(': ') h[l[0]] = l[1] res = json.dumps(h, ensure_ascii=False, indent=4, separators=(',', ': ')) self.write_res_to_text(res) except Exception as e: self.result_data_Text.delete(1.0, END) self.write_log_to_text("[ERROR]:%s" % e) # 结果展示 def write_res_to_text(self, res): # 输出到界面 self.result_data_Text.delete(1.0, END) self.result_data_Text.insert(1.0, res) self.write_log_to_text("[INFO]:转换成功!") # 日志动态打印 def write_log_to_text(self, logmsg): current_time = time.strftime('[%Y-%m-%d %H:%M:%S]', time.localtime(time.time())) logmsg_in = str(current_time) + logmsg + "\n" # 换行 self.log_data_Text.configure(state='normal') self.log_data_Text.insert(END, logmsg_in) self.log_data_Text.see(END) self.log_data_Text.configure(state='disabled')
def open_detailed_window(link): # article page url article_url = "https://tr.sputniknews.com" + link print(article_url) # article page html article_page = requests.get(article_url) # create soup object for article page article_soup = BeautifulSoup(article_page.content, "lxml") # body part of article article_div = article_soup.find("div", class_="b-article") # article title text # more detailed then main page title article_title = article_div.find("div", "b-article__lead").text.replace('\n', '') # article detailed text including news details article_detail = article_div.find("div", "b-article__text").text # create a new window can open over the main window new_win = Toplevel(root) new_win.geometry("1000x1000") new_win.resizable(0, 0) # create a canvas for movable text like newscast canvas = Canvas(new_win, bg='black') canvas.pack() canvas.create_text(0, -200, text=article_title, font=('Times New Roman', 30, 'bold'), fill='white', tags=("marquee", ), anchor='w') # get canvas dimensions for editing for animation x1, y1, x2, y2 = canvas.bbox("marquee") width = x2 - x1 height = y2 - y1 canvas['width'] = width canvas['height'] = height # moving speed of title text right to left anim_speed = 100 # article image url # image size = 1000x541 article_img_url = article_soup.find("div", "b-article__header").img["src"] print(article_img_url) # get image saved name with saved folder and image name stored at server saved_img_name = os.path.join( "articles_img", article_img_url.split("/")[-1].replace(":", "_")) # create folder for save article image if not exist if not os.path.exists('articles_img'): os.makedirs('articles_img') # download article image if not stored if not os.path.exists(saved_img_name): # get image stream r = requests.get(article_img_url, stream=True) # check image available if r.status_code == 200: # when we not set true image file will be 0 byte r.raw.decode_content = True with open(saved_img_name, "wb") as f: # save getting img to device shutil.copyfileobj(r.raw, f) # load image available for tkinter photo = ImageTk.PhotoImage(Image.open(saved_img_name)) # create article image Label(new_win, image=photo, width=1000).pack() # create scrollable text for article detail using with mouse wheel txt = ScrolledText(new_win, font="arial 20") txt.pack() # add article detail text txt.insert(INSERT, article_detail) txt.configure(state="disabled") def right2left_news_title(): # get current dimensions x1, y1, x2, y2 = canvas.bbox("marquee") if (x2 < 0 or y1 < 0): x1 = canvas.winfo_width() y1 = canvas.winfo_height() // 2 canvas.coords("marquee", x1, y1) else: canvas.move("marquee", -2, 0) # run method always canvas.after(1000 // anim_speed, right2left_news_title) # call method one time,after that will be run always when close the window right2left_news_title() new_win.mainloop()
root.title(user) root['height'] = 600 root['width'] = 800 root.resizable(0, 0) # 禁止放缩窗口 ############################## 创建显示消息的主文本框 listbox = ScrolledText(root, bg='#F5F5DC') listbox.place(x=160, y=0, width=640, height=500) # 文本框使用的字体颜色 listbox.tag_config('red', foreground='red') listbox.tag_config('blue', foreground='blue') listbox.tag_config('green', foreground='green') listbox.tag_config('purple', foreground='purple') listbox.insert(tkinter.END, '欢迎来到这个简陋的小聊天室!斯是陋室,惟吾德馨!', 'blue') # 设置文本框内容不能修改 listbox.configure(state='disabled') ############################## 创建显示在线用户的文本框 online_user_box_on = 0 # 在线用户列表框开关状态 online_user_box = tkinter.Listbox(root, bg='#F5FFFA') online_user_box.place(x=0, y=0, width=160, height=500) # 打开关闭在线用户列表 def users_online(): global online_user_box, online_user_box_on if online_user_box_on == 1: online_user_box.place(x=0, y=0, width=160, height=500) listbox.place(x=160, y=0, width=640, height=500) online_user_box_on = 0 else:
class MainWindow(Frame): #__init__ is called when ever an object of the class is constructed. def __init__(self, topWindow): #construct the main (top) window Frame.__init__(self, topWindow) self.master = topWindow #set topWindow to XGA resolution topWindow.geometry('%dx%d' % (1024, 768)) #topWindow.minsize(1152,864) #definte winow title self.master.title("RadarWorld") #define the ratio of the columns and rows, grid geom. manager will bu used topWindow.columnconfigure(0, weight=20) topWindow.columnconfigure(1, weight=80) topWindow.rowconfigure(0, weight=90) topWindow.rowconfigure(1, weight=3) topWindow.rowconfigure(2, weight=1) #define left side frame INSIDE row=col=0 to place the controls #Two Columns and as many rows as needed leftSideControlsFrame = LabelFrame(topWindow, bd=3, relief=GROOVE, text="Radar Controls") leftSideControlsFrame.grid(row=0, column=0, sticky=W + E + N + S) leftSideControlsFrame.columnconfigure(0, weight=1) leftSideControlsFrame.rowconfigure(0, weight=1) leftSideControlsFrame.rowconfigure(1, weight=1) leftSideControlsFrame.rowconfigure(2, weight=98) #define right side frame inside row=col=1 to place the controls rightSideControlsFrame = Frame(topWindow) rightSideControlsFrame.grid(row=0, column=1, sticky=W + E + N + S) rightSideControlsFrame.columnconfigure( 0, weight=1) # an empty column must be defined for the widgets #build the topwindow self.grid(sticky=W + E + N + S) #* * * * * * define the Ui elements * * * * * * # Menubar: menubar = Menu(topWindow) topWindow.config(menu=menubar) # Menubar - File Menu: fileMenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="File", menu=fileMenu) fileMenu.add_command(label="Open", command=MainWindow.doNothing) fileMenu.add_separator() fileMenu.add_command(label="Exit", command=MainWindow.quit) # Menubar - Edit Menu: editMenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="Edit", menu=editMenu) editMenu.add_command(label="Settings", command=MainWindow.doNothing) # Menubar - Help Menu: helpMenu = Menu(menubar, tearoff=0) menubar.add_cascade(label="Help", menu=helpMenu) helpMenu.add_command(label="About", command=MainWindow.helpMenu_About) # - - - - - Left side elements (controls) - - - - - - spaceHolder = Label(leftSideControlsFrame, text="Avaiable Interfaces:", bd=1, relief=FLAT, anchor=W) spaceHolder.grid(row=0, column=0, padx=10, pady=0, sticky=W + N + E) self.serialPortCmbBox = Combobox( leftSideControlsFrame, values=serialSystemClass.getSerialPorts()) self.serialPortCmbBox.current(0) self.serialPortCmbBox.grid(row=1, column=0, padx=0, pady=0, columnspan=2, sticky=W + E + N + S) self.serialPortCmbBox.bind('<<ComboboxSelected>>', self.on_serialPortCmbBox_select) # - - - - - Right side elements (graph) - - - - - - - #draw the canvas into the frame. Get max frame size after update() #FigureRightSide = plt.Figure(dpi=100) #create new figure from matplotlib.pyplt (plt) lib self.FigureRightSide, (self.ax1, self.ax2) = plt.subplots(2, 1) self.Readings = 5 self.canvasForGraph = FigureCanvasTkAgg( self.FigureRightSide, master=rightSideControlsFrame ) #create canvas for figure int the frame self.canvasForGraph.get_tk_widget().grid(sticky=W + E + N + S) t = np.arange(0, 100, .01) # time data self.ax1.plot(t, 50 * np.sin(2 * np.pi * t)) self.ax2.plot(t, 1 * np.sin(2 * np.pi * t)) #self.FigureRightSide.ax2.clear() #self.ax2.clear() __dir__(MainWindow) # Log Window: self.scrolled_text = ScrolledText(topWindow, height=5) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') #self.scrolled_text.insert(END, "hello") # Status bar: self.statusbarText = StringVar() self.statusBar = Label(topWindow, textvariable=self.statusbarText, bd=1, relief=SUNKEN, anchor=W) # Clock: self.clockText = StringVar() self.clock = Label(topWindow, textvariable=self.clockText, bd=1, relief=SUNKEN, anchor=E) #* * * * * * functions to serve the Ui * * * * * * def helpMenu_About(): messagebox.showinfo("About RadarWorld", "v0.0") def doNothing(): pass #close the GUI (on file-exit, or window close) def quit(): loggerFunctions.closeLoggerFile() #serialSystemClass.closeSerialPort(MainWindow(root).serialPortCmbBox.get()) root.destroy() def on_serialPortCmbBox_select(self, event=None): #get selection from combobox and display in log window print("comboboxes:", self.serialPortCmbBox.get()) log_contents = loggerFunctions.sendToLogger( 'Selected:' + str(self.serialPortCmbBox.get())) MainWindow(root).updateLogWindow(log_contents) #open serial port by with the serialUtilsClass __init__ #ser = serialUtilsClass(self.serialPortCmbBox.get()) #ser.sendData(7) #test = ser.recieveData(5) #test=ser.recieveFrame(b'\0x16', 1031) #print(len(test)) #portList=serialSystemClass.getSerialPorts() #msg= serialSystemClass.openSerialPort(self.serialPortCmbBox.get()) #log_contents = log_contents + msg #MainWindow(root).updateLogWindow(log_contents) #update log window with current message def updateLogWindow(self, logTextToAppend): self.scrolled_text.insert(END, logTextToAppend) self.scrolled_text.see(END) self.scrolled_text.grid(row=1, column=0, columnspan=2, sticky=W + E + N + S) #update the clock in given intervals with the after() function def updateClock(self): now = datetime.datetime.now() clockBarCurrentTime = now.strftime("%d.%m.%Y. %H:%M:%S") self.clockText.set(clockBarCurrentTime) self.clock.grid(row=2, column=1, sticky=W + E + N + S) self.after(1000, self.updateClock) def updateStatusBar(self): #create the list to store the message statusBarTextList = list() statusBarCurrentMsg = "RadarWorld 1.0" #place empty chars to the end of the message statusBarCurrentMsgExtended = statusBarCurrentMsg.ljust( len(statusBarCurrentMsg) + 1) statusBarTextList.append(statusBarCurrentMsgExtended) #add additional text statusBarCurrentState = "Status: Connected via SER" statusBarCurrentMsgExtended = statusBarCurrentState.ljust( len(statusBarCurrentState) + 0) statusBarTextList.append(statusBarCurrentMsgExtended) #update the status bar with the current text self.statusbarText.set(''.join(statusBarTextList)) self.statusBar.grid(row=2, column=0, columnspan=1, sticky=W + E + N + S) #call the own function after 1 sec self.after(1000, self.updateStatusBar) def updateGraph(self): t = np.arange(0, 100, .01) # time data self.ax1.clear() self.ax2.clear() print("self.Readings", self.Readings)
class ChatGrupo(Interface): def __init__(self, tk, dados_cliente: Usuario, grupo: str, soquete: socket): self.soquete = soquete self.dados_cliente = dados_cliente self.grupo = grupo super().__init__(tk) def _iniciar_tela(self): self._mudar_titulo(f"Chat - {self.grupo}") self.main_frame = Frame(self._tk, bg=COR_DE_FUNDO_PADRAO, padx=5, pady=5) self.main_frame.grid_rowconfigure(1, minsize=10) self.main_frame.grid_columnconfigure(1, minsize=15) self.main_frame.grid_columnconfigure(3, minsize=10) self.main_frame.pack(fill=X) self.recv_area = ScrolledText(self.main_frame, font=FONTE_CHAT_MENSAGEM_RECEBIDA, borderwidth=2, width=60, height=15) self.recv_area.configure(state=DISABLED, wrap=WORD) self.recv_area.grid(row=0, column=0) self.send_area = ScrolledText(self.main_frame, font=FONTE_CHAT_MENSAGEM_ENVIADA, borderwidth=2, width=60, height=5) self.send_area.configure(wrap=WORD) self.send_area.grid(row=2, column=0) self.btn_exit = Button(self.main_frame, text="SAIR", font=FONTE_CHAT_BTN_SAIR, padx=50, pady=20, command=self.__acao_btn_exit) self.btn_exit.grid(row=1, column=2) self.btn_send = Button(self.main_frame, text="ENVIAR", font=FONTE_CHAT_BTN_ENVIAR, padx=50, pady=20, command=self.__enviar_mensagem) self.btn_send.grid(row=2, column=2) try: self.soquete.send( codificar( PedidoMensagensGrupoArquivadas(self.dados_cliente, self.grupo))) mensagens_arquivadas = self.soquete.recv(BUFFER) mensagens_arquivadas = descodificar(mensagens_arquivadas, [MensagemGrupo]) if mensagens_arquivadas: for mensagem in mensagens_arquivadas: if mensagem: self.__mostrar_mensagem(mensagem) except ConnectionResetError as erro: print(erro) _conexao_resetada() self.soquete.close() try: self.main_frame.destroy() Login(self._tk) except AttributeError: exit() except ConnectionAbortedError as erro: print(erro) _conexao_abortada() self.soquete.close() try: self.main_frame.destroy() Login(self._tk) except AttributeError: exit() except JSONDecodeError as erro: print(erro) _dados_recebidos_invalidos() self.soquete.close() try: self.main_frame.destroy() Login(self._tk) except AttributeError: exit() self.receber_mensagens = Thread(target=self.__receber_mensagens) self.receber_mensagens.start() def __mostrar_mensagem(self, msg: MensagemGrupo): self.recv_area.configure(state=NORMAL) self.recv_area.insert(END, f"{msg.remetente.nome}: {msg.mensagem}") self.recv_area.insert(END, "\n") self.recv_area.configure(state=DISABLED) self.recv_area.see(END) def __enviar_mensagem(self): msg = self.send_area.get("1.0", END).strip() self.send_area.delete("1.0", END) msg = MensagemGrupo(self.dados_cliente, msg, self.grupo) try: self.soquete.send(codificar(msg)) except ConnectionResetError as erro: print(erro) _conexao_resetada() self.soquete.close() try: self.main_frame.destroy() Login(self._tk) except AttributeError: exit() self.btn_send.config(state=DISABLED) sleep(1) self.btn_send.config(state=NORMAL) def __receber_mensagens(self): while True: try: msg = descodificar(self.soquete.recv(BUFFER), Pedido) if msg: self.__mostrar_mensagem(msg) else: break except ConnectionResetError as erro: print(erro) _conexao_resetada() self.send_area.insert(END, "DESCONECTADO DO CHAT") self.send_area.configure(state=DISABLED) self.send_area.see(END) break except ConnectionAbortedError as erro: print(erro) _conexao_abortada() self.send_area.insert(END, "DESCONECTADO DO CHAT") self.send_area.configure(state=DISABLED) self.send_area.see(END) break except JSONDecodeError as erro: print(erro) _dados_recebidos_invalidos() self.send_area.insert(END, "DESCONECTADO DO CHAT") self.send_area.configure(state=DISABLED) self.send_area.see(END) break def __acao_btn_exit(self): try: self.soquete.send(codificar(None)) self.receber_mensagens.join() self.main_frame.destroy() MenuGrupos(self._tk, self.dados_cliente, self.soquete) except ConnectionResetError as erro: print(erro) _conexao_resetada() self.soquete.close() try: self.main_frame.destroy() Login(self._tk) except AttributeError: exit() def _fechar(self): try: self.soquete.send(codificar(None)) self.receber_mensagens.join() self.soquete.send(codificar(PedidoDesconectar(self.dados_cliente))) except ConnectionResetError as erro: print(erro) _conexao_resetada() finally: self.soquete.close() self._tk.destroy()
class RoomListDialog(tkinter.Toplevel): """Dialog with list of all rooms from drawing.""" def __init__(self, parent, drawing): """Initialize the dialog.""" tkinter.Toplevel.__init__(self, parent) self.title("Seznam místností") rooms = drawing.rooms rooms_count = len(rooms) self.add_label(0, 0, "Počet místností") self.add_value_widget(0, 1, rooms_count) self.txt = ScrolledText(self, undo=True, tabs="4c 7c 10c 24c") self.txt.grid(row=1, column=0, columnspan=2, sticky="nwse", padx=2, pady=2) self.txt.tag_configure("underlined", underline=True) self.txt.tag_configure("blue", foreground="blue") self.txt.tag_configure("green", foreground="green") self.txt.tag_configure("red", foreground="red") self.txt.insert(tkinter.INSERT, "SAP ID\tgr.ID\tzakreslena\tsouřadnic\n", "underlined") for room in rooms: if "room_id" in room: self.txt.insert(tkinter.END, room["room_id"] + "\t", "blue") else: self.txt.insert(tkinter.END, "x\t", "red") if "canvas_id" in room and room["canvas_id"] is not None: self.txt.insert(tkinter.END, str(room["canvas_id"]) + "\t") else: self.txt.insert(tkinter.END, "x\t", "red") if room["polygon"] is not None and len(room["polygon"]) > 0: self.txt.insert(tkinter.END, "ano\t", "green") else: self.txt.insert(tkinter.END, "ne\t", "red") if room["polygon"] is not None: typ = "?" if "type" in room: typ = room["type"] self.txt.insert(tkinter.END, str(len(room["polygon"])) + " (" + typ + ")\n") else: self.txt.insert(tkinter.END, "?\n") self.txt.configure(state="disabled") okButton = tkinter.Button(self, text="OK", command=self.ok) okButton.grid(row=2, column=0, sticky="WE") # close the dialog on 'x' click self.protocol("WM_DELETE_WINDOW", self.destroy) # get the focus self.grab_set() # how the buttons should behave self.bind("<Return>", lambda event: self.ok()) self.bind("<Escape>", lambda event: self.destroy()) # get the focus okButton.focus_set() def ok(self): """Handle event when Ok button is pressed.""" self.destroy() def add_label(self, row, column, text): """Add a label to dialog.""" label = tkinter.Label(self, text=text) label.grid(row=row, column=column, sticky="W", padx=5, pady=5) def add_value_widget(self, row, column, value): """Add a widget with value to dialog.""" widget = self.value_widget(value) widget.grid(row=row, column=column, sticky="W", padx=5, pady=5) def value_widget(self, value): """Create new widget with value.""" widget = tkinter.Entry(self) widget.insert(tkinter.END, value) widget.configure(state='readonly') return widget
def draw(self): self.root.title("AoE2 Definitive Edition RandomMapScript Parser") helv10b = tkfont.Font(family='Helvetica', size=10, weight='bold') row_index = 0 # ### Map Resources tk.Label(self.root, text="Select Map Resources", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) var_map_res = tk.StringVar() combo_map_res = ttk.Combobox(self.root, values=list(MAP_RESOURCES_DICT.values()), justify="center", textvariable=var_map_res) combo_map_res.bind( "<<ComboboxSelected>>", lambda event: self.update_map_resources(var_map_res.get())) combo_map_res.grid(row=row_index, column=1) combo_map_res.current(0) row_index += 1 lbl_map_res_txt = get_dict_first_key(MAP_RESOURCES_DICT) lbl_map_res = tk.Label(self.root, text=lbl_map_res_txt) lbl_map_res.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_map_resources = lbl_map_res # ### Map Size row_index += 1 tk.Label(self.root, text="Select Map Size", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) var_map_size = tk.StringVar() combo_map_size = ttk.Combobox(self.root, values=list(MAP_SIZE_DICT.values()), justify="center", textvariable=var_map_size) combo_map_size.bind( "<<ComboboxSelected>>", lambda event: self.update_map_size(var_map_size.get())) combo_map_size.grid(row=row_index, column=1) combo_map_size.current(0) row_index += 1 lbl_map_size_txt = get_dict_first_key(MAP_SIZE_DICT) lbl_map_size = tk.Label(self.root, text=lbl_map_size_txt) lbl_map_size.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_map_size = lbl_map_size # ### Game Type row_index += 1 tk.Label(self.root, text="Select Game Type", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) var_game_type = tk.StringVar() combo_gamme_type = ttk.Combobox(self.root, values=list(GAME_TYPE_DICT.values()), justify="center", textvariable=var_game_type) combo_gamme_type.bind( "<<ComboboxSelected>>", lambda event: self.update_game_type(var_game_type.get())) combo_gamme_type.grid(row=row_index, column=1) combo_gamme_type.current(0) row_index += 1 lbl_game_type_txt = get_dict_first_key(GAME_TYPE_DICT) lbl_game_type = tk.Label(self.root, text=lbl_game_type_txt) lbl_game_type.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_game_type = lbl_game_type # ### GeneratingObjects.inc row_index += 1 tk.Label(self.root, text="Select GeneratingObjects.inc", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) btn_gen_obj = tk.Button(self.root, text="Browse", command=lambda: self.update_gen_obj()) btn_gen_obj.grid(row=row_index, column=1) row_index += 1 lbl_gen_obj = tk.Label(self.root, text=self._path_gen_obj or "Not selected") lbl_gen_obj.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_gen_obj = lbl_gen_obj # ### Output Dir row_index += 1 tk.Label(self.root, text="Select Output directory", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) btn_out_dir = tk.Button(self.root, text="Browse", command=lambda: self.update_out_dir()) btn_out_dir.grid(row=row_index, column=1) row_index += 1 lbl_out_dir = tk.Label(self.root, text=self._path_out_dir or "Not selected") lbl_out_dir.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_out_dir = lbl_out_dir # ### RMS files row_index += 1 tk.Label(self.root, text="Select RMS files to parse", font=helv10b, bg="lightblue") \ .grid(row=row_index, column=0) btn_rms = tk.Button(self.root, text="Browse", command=lambda: self.update_rms()) btn_rms.grid(row=row_index, column=1) row_index += 1 lbl_rms_files = tk.Label(self.root, text=self._path_rms_file_list or "Not selected") lbl_rms_files.grid(row=row_index, column=0, columnspan=2) self._ptr_lbl_rms_files = lbl_rms_files # ### Run row_index += 1 btn_run = tk.Button(self.root, text="Run", command=lambda: self.run()) btn_run.grid(row=row_index, column=0, columnspan=2) self._ptr_btn_run = btn_run self._btn_default_color = self._ptr_btn_run.cget("background") # ### Logging ScrollText row_index += 1 scroll_log = ScrolledText(height=12) scroll_log.grid(row=row_index, column=0, columnspan=2) scroll_log.configure(state='disabled') self._ptr_scroll = scroll_log self.root.mainloop()
class Toki(tk.Tk): def __init__(self, file=None): super().__init__() self.actions = { 'ENT': '\n', 'BKSP': 'backspace', 'TAB': 'tab', 'HOME': 'home', 'PAGEUP': 'pgup', 'DEL': 'del', 'END': 'end', 'PAGEDOWN': 'pgdn', 'UP': 'up', 'LEFT': 'left', 'DOWN': 'down', 'RIGHT': 'right' } self.insert = False self.file = file self.title('ilo nimi pi sitelen pona') self.menu = tk.Frame(self) self.filemenu = tk.Menubutton(self.menu, font=("sitelen luka tu tu", 14), text='\uE02A') #file self.filemenud = tk.Menu(self.filemenu, tearoff=0) self.filemenud.add_checkbutton( label="\uE02A\uE05D", #new font=("sitelen luka tu tu", 14), command=lambda: Toki().mainloop()) self.filemenud.add_checkbutton( label="o\uE047e\uE02A", #open font=("sitelen luka tu tu", 14), command=self.opennew) self.filemenud.add_separator() self.filemenud.add_checkbutton( label="o\uE009e\uE02A", #save font=("sitelen luka tu tu", 14), command=lambda: self.save(False)) self.filemenud.add_checkbutton( label="o\uE009e\uE02A\uE05D", #save as font=("sitelen luka tu tu", 14), command=lambda: self.save(True)) self.filemenud.add_checkbutton( label="o\uE049e\uE02APDF", #export font=("sitelen luka tu tu", 14), command=self.export) self.filemenud.add_separator() self.filemenud.add_checkbutton( label="o\uE050", #close font=("sitelen luka tu tu", 14), command=self.destroy) self.filemenu["menu"] = self.filemenud self.text = ScrolledText(self, width=40) self.text.configure(font=('sitelen luka tu tu', 20)) self.keyboardFrame = tk.Frame(self, padx=5, pady=5) self.keyboard = Keyboard(self.keyboardFrame) self.menu.pack(expand=tk.YES, fill=tk.X) self.filemenu.grid(row=0) self.keyboardFrame.pack() self.keyboard.grid(row=0) self.text.pack(expand=tk.YES, fill=tk.BOTH) if self.file: self.open(self.file) self.after(0, self.getWord) def getWord(self): words = self.keyboard.getWords() if words: self.text.focus() for w in words: if w in self.actions: pa.press(self.actions[w]) elif w == 'INS': self.insert = not self.insert else: if self.insert: pa.press('del') self.text.insert(tk.INSERT, w) self.after(10, self.getWord) def save(self, new): if new: filename = filedialog.askopenfilename( title="lipu awen li seme?", parent=self, defaultextension='.toki', filetypes=(("lipu Toki", "*.toki"), ("lipu ali", "*.*"))) else: filename = filedialog.asksaveasfilename( title="lipu awen li seme?", parent=self, defaultextension='.toki', filetypes=(("lipu .toki", "*.toki"), ("lipu ali", "*.*"))) if filename: try: with open(filename, 'wb') as f: f.write(self.text.get('1.0', 'end').encode()) self.title('ilo nimi pi sitelen pona: ' + filename) self.file = filename except IOError as e: messagebox.showerror( 'pakala!', 'ni li ike:\nI/O error ({0}): {1}'.format( e.errno, e.strerror)) else: messagebox.showinfo('pona!', 'lipu li awen!') def open(self, filename): try: with open(filename, 'rb') as f: self.text.insert('1.0', f.read().decode()) self.title('ilo nimi pi sitelen pona: ' + filename) self.file = filename except IOError as e: messagebox.showerror( 'pakala!', 'ni li ike:\nI/O error ({0}): {1}'.format(e.errno, e.strerror)) def opennew(self): filename = filedialog.askopenfilename(title="lipu open li seme?", parent=self, defaultextension='.toki', filetypes=(("lipu Toki", "*.toki"), ("lipu ali", "*.*"))) if filename: if self.file: Toki(filename).mainloop() else: self.open(filename) def export(self): filename = filedialog.asksaveasfilename( title="lipu pana li seme?", parent=self, defaultextension='.pdf', filetypes=(("lipu .pdf", "*.pdf"), ("lipu ali", "*.*"))) try: pdf = fpdf.FPDF() pdf.add_page() try: pdf.add_font( 'sitelen luka tu tu', '', (r'C:\Windows\Fonts\sitelen_luka_tu_tu.ttf' if os.name == 'nt' else '/usr/share/fonts/sitelen_luka_tu_tu.ttf'), uni=True) except RuntimeError: pdf.add_font( 'sitelen luka tu tu', '', (r'C:\Windows\Fonts\sitelen_luka_tu_tu.ttf_' if os.name == 'nt' else '/usr/share/fonts/sitelen_luka_tu_tu_.ttf'), uni=True) pdf.set_font('sitelen luka tu tu', size=20) for t in self.text.get('1.0', tk.END).split('\n'): pdf.cell(200, 10, txt=t, ln=1, align='L') pdf.output(filename) except Exception as e: messagebox.showerror('pakala!', 'ni li ike:\n' + str(e)) else: messagebox.showinfo('pona!', 'lipu li pana!')
def __init__(self, parent): tk.Frame.__init__(self, parent, bg='dark slate gray') # Create main containers top_frame = Frame(self, bg='dark slate gray', width=50, height=50, padx=7, pady=3) center = Frame(self, bg='dark slate gray', width=50, height=40, padx=7, pady=3) self.grid_rowconfigure(1, weight=1) self.grid_columnconfigure(0, weight=1) top_frame.grid(row=0, sticky="nsew") center.grid(row=1, sticky="nsew") top_frame.grid_rowconfigure(0, weight=1) top_frame.grid_columnconfigure(1, weight=1) center.grid_rowconfigure(0, weight=1) center.grid_columnconfigure(1, weight=1) # Title widget (top frame) top_mid_label1 = Label(top_frame, text='(1) Data import and preprocessing', font=("Consolas", 13, 'bold'), fg="white", bg='gray25', relief = "raised") top_mid_label1.grid(row=0, column=1, sticky="nsew") # Create sub frame (center frame) ctr_left = Frame(center, bg='gray1', width=150, height=190, highlightthickness=1, highlightbackground="gray15") ctr_right = Frame(center, bg='gray1', height=190, highlightthickness=1, highlightbackground="gray15") ctr_left.grid(row=0, column=0, padx=(0, 7), pady=(0, 3), sticky="ns") ctr_right.grid(row=0, column=1, pady=(0, 3), sticky="nsew") ctr_right.grid_rowconfigure(1, weight=1) ctr_right.grid_columnconfigure(0, weight=1) # File list in directory folder (center-left) global path org_path = os.getcwd() Resource_Step1.org_path = org_path System_Step1.org_path = org_path PageThree.org_path =org_path os.chdir(os.sep.join([str(org_path), "input"])) input_path = os.getcwd() ctr_left_label1 = Label(ctr_left, text='Files', font=("Consolas", 10, 'bold'), fg="white", bg='gray25', anchor="center", relief="raised") ctr_left_label1.grid(row=0, column=0, sticky="we") # ctr_left_label1.config(width=25) dir_scroll = ScrolledText(ctr_left, width=24, height=2, wrap=tk.WORD) dir_scroll.grid(row=1, column=0, rowspan=4) dir_scroll.insert(tk.INSERT, 'Directory : "{}"'.format(input_path)) dir_scroll.configure(background='snow', font=("ms sans Serif", 6)) file_list = os.listdir(input_path) csv_list = [s for s in file_list if '.csv' in s] def selectdata(): global event_log alert_value = 0 alert_message1 = '' if self.cVar1.get() > 0: event_log = pd.read_csv(csv_list[int(self.cVar1.get()) - 1]) dat_name = str(csv_list[int(self.cVar1.get()) - 1]) dat_name = str(dat_name.split('.')[0]) PageThree.dat_name=dat_name alert_value += 1 alert_message1 = 'Completely loaded: {}'.format(csv_list[int(self.cVar1.get()) - 1]) PageTwo.event_log = event_log #orginal data without preprocessing datainfo(event_log) autodetection() messagebox.showinfo("Message", alert_message1) ctr_left_label2.config(highlightbackground="gray1", highlightcolor = "gray1", highlightthickness=2) ctr_right_label2.config(highlightbackground="dark orange", highlightcolor = "dark orange", highlightthickness=2) if alert_value == 0: alert_message1 = "Nothing was checked" messagebox.showinfo("Error", alert_message1) # autodetection: automatically set key attributes (center-right) def autodetection(): # Caseid case_candidate = [list(event_log).index(i) for i in list(event_log) if "case" in i or "Case" in i or "CASE" in i] if len(case_candidate) == 0: pass if len(case_candidate) == 1: caseid_value_chosen.current(case_candidate) if len(case_candidate) > 1: att_list = [list(event_log)[i] for i in case_candidate] case_candidate2 = [att_list.index(i) for i in att_list if "id" in i or "ID" in i] if len(case_candidate2) == 1: caseid_value_chosen.current(case_candidate2) else: caseid_value_chosen.current(case_candidate[0]) # Eventid cand = ["-- no attribute --"] + list(event_log) event_candidate = [cand.index(i) for i in cand if "event" in i or "Event" in i or "EVENT" in i] if len(event_candidate) == 0: pass if len(event_candidate) == 1: eventid_value_chosen.current(event_candidate) if len(event_candidate) > 1: att_list = [cand[i] for i in event_candidate] event_candidate2 = [att_list.index(i) for i in att_list if "id" in i or "ID" in i] if len(event_candidate2) == 1: eventid_value_chosen.current(event_candidate2) else: eventid_value_chosen.current(event_candidate[0]) # Activity activity_candidate = [list(event_log).index(i) for i in list(event_log) if "activity" in i or "Activity" in i or "ACTIVITY" in i] if len(activity_candidate) == 0: activity_candidate = [list(event_log).index(i) for i in list(event_log) if "name" in i or "Name" in i or "NAME" in i] if len(activity_candidate) == 0: pass if len(activity_candidate) == 1: activity_value_chosen.current(activity_candidate) if len(activity_candidate) > 1: activity_value_chosen.current(activity_candidate[0]) if len(activity_candidate) == 1: activity_value_chosen.current(activity_candidate) if len(activity_candidate) > 1: activity_value_chosen.current(activity_candidate[0]) # timestamp time_candidate = [list(event_log).index(i) for i in list(event_log) if "time" in i or "Time" in i or "TIME" in i] if len(time_candidate) == 0: time_candidate = [list(event_log).index(i) for i in list(event_log) if "date" in i or "Date" in i or "DATE" in i] if len(time_candidate) == 0: pass if len(time_candidate) == 1: timestamp_value_chosen.current(time_candidate) if len(time_candidate) > 1: timestamp_value_chosen.current(time_candidate[0]) if len(time_candidate) == 1: timestamp_value_chosen.current(time_candidate) if len(time_candidate) > 1: att_list = [list(event_log)[i] for i in time_candidate] time_candidate2 = [att_list.index(i) for i in att_list if "complete" in i or "Complete" in i or "COMPLETE" in i] if len(time_candidate2) == 1: timestamp_value_chosen.current(time_candidate2) else: timestamp_value_chosen.current(time_candidate[0]) # datainfo: display maximum 20 rows of data (center-right) def datainfo(event_log): l=list(event_log) caseid_value_chosen['values'] = list(event_log) caseid_value_chosen.current(0) eventid_value_chosen['values'] = ["-- no attribute --"] +l eventid_value_chosen.current(0) activity_value_chosen['values'] = list(event_log) activity_value_chosen.current(0) timestamp_value_chosen['values'] = list(event_log) timestamp_value_chosen.current(0) pd.set_option('display.width', 1000) mylist.delete('1.0', END) mylist.insert(tk.CURRENT, event_log[1:20].to_string(index=False)) ctr_left_label2 = LabelFrame(ctr_left, text="csv_list (max=10)", font=("Consolas", 10, 'bold'), fg="white", bg='gray1', bd=3, height=248) ctr_left_label2.config(highlightbackground="dark orange", highlightcolor = "dark orange", highlightthickness=2) ctr_left_label2.grid(row=12, sticky="we", padx=5, pady=(7, 0), ipadx=0, ipady=0) ctr_left_label2.grid_propagate(False) style1 = ttk.Style() style1.configure("Red.TCheckbutton", foreground="aquamarine", background='gray1') style1.map('Red.TCheckbutton', background=[('active', 'gray1')]) i = 0 self.cVar1 = IntVar() self.cVar1.set(0) for values in csv_list[0:10]: globals()['c{}'.format(i)] = ttk.Checkbutton(ctr_left_label2, text=csv_list[i], onvalue=i + 1, offvalue=0, variable=self.cVar1) globals()['c{}'.format(i)].grid(column=0, row=i + 10, sticky='w') globals()['c{}'.format(i)].configure(style="Red.TCheckbutton") i = i + 1 action = tk.Button(ctr_left, text="Load", width = 10, command=selectdata) action.grid(row=13, sticky="we" , padx =60 ,pady= (7,10)) os.chdir(os.sep.join([str(org_path), "utils"])) image1 = PhotoImage(file= "IEL lab logo5.png") # smaller_image1 = image1.subsample(2, 2) smaller_image1 = image1 image_frame = Frame(ctr_left, bg='gray1') image_frame.grid(row=15, pady=(20,0)) panel1 = Label(image_frame, image = smaller_image1, bg ='gray1',borderwidth=0, highlightthickness=0) panel1.photo = smaller_image1 panel1.grid(row=0, column=0) def callback(url): webbrowser.open_new(url) link1 = Label(image_frame, text=" Intelligent Enterprise Lab.", bg = 'gray1', fg="cyan2", cursor="hand2") link1.bind("<Button-1>", lambda e: callback("http://iel.unist.ac.kr/?page=introduction")) link1.grid(row=0, column=1, sticky='w') image2 = PhotoImage(file= "GitHub-Mark-Light-32px.png") # smaller_image2 = image2.subsample(1, 1) smaller_image2=image2 panel2 = Label(image_frame, image = smaller_image2, bg ='gray1',borderwidth=0, highlightthickness=0) panel2.photo = smaller_image2 panel2.grid(row=1, column=0, pady=5) link2 = Label(image_frame, text=" Github repository", bg = 'gray1', fg="cyan2", cursor="hand2") link2.bind("<Button-1>", lambda e: callback("https://github.com/jonghyeonk/AIR-BAGEL")) link2.grid(row=1, column=1, pady=5, sticky='w') os.chdir(os.sep.join([str(org_path), "input"])) # Select key attribute (center-right) ctr_right_label1 = Label(ctr_right, text='Environment', font=("Consolas", 10, 'bold'), fg="white", bg='gray25', relief="raised") ctr_right_label1.grid(row=0, column=0, sticky="nsew") # ctr_right_label1.config(width=45) ctr_right_sub = Frame(ctr_right, bg='gray1', height=190, highlightthickness=1, highlightbackground="gray15") ctr_right_sub.grid(row=1, column=0, sticky="nsew") ctr_right_label2 = LabelFrame(ctr_right_sub, text="Set key attributes", font=("Consolas", 10, 'bold'), fg="white", bg='gray1', bd=3, padx=14, pady=7) ctr_right_label2.grid(row=1, sticky="w", padx=14, pady=(7, 0)) Caseid_Label = Label(ctr_right_label2, text=" 1. Case_ID", font=("Consolas", 10, 'bold'), fg="white", bg='gray10', anchor="w", width=14) Caseid_Label.grid(column=0, row=4) Eventid_Label = Label(ctr_right_label2, text=" 2. Event_ID", font=("Consolas", 10, 'bold'), fg="white", bg='gray10', anchor="w", width=14) Eventid_Label.grid(column=0, row=5) Activity_Label = Label(ctr_right_label2, text=" 3. Activity", font=("Consolas", 10, 'bold'), fg="white", bg='gray10', anchor="w", width=14) Activity_Label.grid(column=0, row=6) Timestamp_Label = Label(ctr_right_label2, text=" 4. Timestamp", font=("Consolas", 10, 'bold'), fg="white", bg='gray10', anchor="w", width=14) Timestamp_Label.grid(column=0, row=7) Timeform_Label = Label(ctr_right_label2, text=" - format", font=("Consolas", 10), fg="white", bg='gray10', anchor="w", width=14) Timeform_Label.grid(column=0, row=8) caseid_value = tk.StringVar() caseid_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=caseid_value) caseid_value_chosen.grid(column=1, row=4) eventid_value = tk.StringVar() eventid_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=eventid_value) eventid_value_chosen.grid(column=1, row=5) activity_value = tk.StringVar() activity_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=activity_value) activity_value_chosen.grid(column=1, row=6) timestamp_value = tk.StringVar() timestamp_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=timestamp_value) timestamp_value_chosen.grid(column=1, row=7) timeform_value = tk.StringVar() timeform_value_chosen = ttk.Combobox(ctr_right_label2, width=26, textvariable=timeform_value) timeform_value_chosen.grid(column=1, row=8) timeform_value_chosen['values'] = ["","2020-01-02 03:04:05.006" , "2020-01-02 03:04:05", "2020-01-02 03:04:05.006 PM", "2020-01-02 03:04:05 PM", "20-01-02 03:04:05.006", "20-01-02 03:04:05", "20-01-02 03:04:05.006 PM", "20-01-02 03:04:05 PM", "2020/01/02 03:04:05.006", "2020/01/02 03:04:05", "2020/01/02 03:04:05.006 PM", "2020/01/02 03:04:05 PM", "20/01/02 03:04:05.006", "20/01/02 03:04:05", "20/01/02 03:04:05.006 PM", "20/01/02 03:04:05 PM", "Self-configuration"] timeform_value_chosen.current(0) def TextBoxUpdate(event=None): if event.widget.get() == "Self-configuration": timeform_value_chosen.current(0) timeform_value_chosen.bind("<<ComboboxSelected>>", TextBoxUpdate) # Scrollbar to represent dataframe (center-left) ctr_right_label3 = LabelFrame(ctr_right_sub, text="Data preview (maximum 20 rows)", font=("Consolas", 10, 'bold'), fg="white", bg='gray1', bd=3, padx=12, width=400, height=135, pady=7) ctr_right_label3.grid(row=3, sticky="w", padx=14, pady=(14, 0)) mylist = Text(ctr_right_label3, width=50, height=6, wrap=NONE) vscroll = Scrollbar(ctr_right_label3, orient=VERTICAL, command=mylist.yview) vscroll.place(in_=mylist, relx=1.0, relheight=1.0, bordermode="outside") mylist['yscroll'] = vscroll.set hscroll = Scrollbar(ctr_right_label3, orient=HORIZONTAL, command=mylist.xview) hscroll.place(in_=mylist, rely=1.0, relwidth=1.0, bordermode="outside") mylist['xscroll'] = hscroll.set mylist.grid(row=0, column=0, padx=(0,20), pady=(0,30)) global n n = 0 def iserror(func, *args, **kw): try: func(*args, **kw) return False except Exception: return True def save_key_attributes(): if len(event_log) > 0: selected_caseid = caseid_value_chosen.get() selected_eventid = eventid_value_chosen.get() selected_activity = activity_value_chosen.get() selected_timestamp = timestamp_value_chosen.get() global extracted_data #event_log only with key attributes if selected_eventid=="-- no attribute --" : extracted_data = event_log[ [selected_caseid, selected_activity, selected_timestamp]] extracted_data["Event"] = list(range(0,len(event_log.index))) cols = extracted_data.columns.tolist() cols = cols[:1]+ cols[-1:] + cols[1:3] extracted_data = extracted_data[cols] if selected_eventid!="-- no attribute --" : extracted_data = event_log[[selected_caseid, selected_eventid, selected_activity, selected_timestamp]] extracted_data.columns = \ ["Case", "Event", "Activity", "Timestamp"] extracted_data = extracted_data.dropna(subset=['Case']) PageTwo.firstpreprocess = extracted_data extracted_data = extracted_data.sort_values(["Case", "Timestamp"], ascending=[True, True]) form_dict = {"2020-01-02 03:04:05.006":"%Y-%m-%d %H:%M:%S.%f", "2020-01-02 03:04:05":"%Y-%m-%d %H:%M:%S", "2020-01-02 03:04:05.006 PM":"%Y-%m-%d %I:%M:%S.%f %p", "2020-01-02 03:04:05 PM":"%Y-%m-%d %I:%M:%S %p", "20-01-02 03:04:05.006":"%y-%m-%d %H:%M:%S.%f", "20-01-02 03:04:05":"%y-%m-%d %H:%M:%S", "20-01-02 03:04:05.006 PM":"%y-%m-%d %I:%M:%S.%f %p", "20-01-02 03:04:05 PM":"%y-%m-%d %I:%M:%S %p", "2020/01/02 03:04:05.006": "%Y/%m/%d %H:%M:%S.%f", "2020/01/02 03:04:05": "%Y/%m/%d %H:%M:%S", "2020/01/02 03:04:05.006 PM": "%Y/%m/%d %I:%M:%S.%f %p", "2020/01/02 03:04:05 PM": "%Y/%m/%d %I:%M:%S %p", "20/01/02 03:04:05.006": "%y/%m/%d %H:%M:%S.%f", "20/01/02 03:04:05": "%y/%m/%d %H:%M:%S", "20/01/02 03:04:05.006 PM": "%y/%m/%d %I:%M:%S.%f %p", "20/01/02 03:04:05 PM": "%y/%m/%d %I:%M:%S %p" } if timeform_value_chosen.get() not in form_dict.keys() : form = timeform_value_chosen.get() if iserror(dt.strptime, extracted_data['Timestamp'][0], form): if "\"" in form or "\'" in form: words = ["Type timestamp format without", "\'", "or", "\""] words = " ".join(words) messagebox.showinfo("Error", words) else: messagebox.showinfo("Error", "Wrong input for timestamp format: use format in 'datetime' packages. (ex: %Y-%m-%d %H:%M:%S)") else: time = extracted_data['Timestamp'].apply(lambda x: dt.strptime(x, form)) unixtime = time.apply(lambda x: (x - dt(1970, 1, 1)).total_seconds()) extracted_data['Timestamp'] = time extracted_data['unixtime'] = unixtime PageTwo.extracted_data = extracted_data messagebox.showinfo("Message", "Loaded") tk.Frame.grid_forget() parent.show_frame1() if timeform_value_chosen.get() in form_dict.keys(): form = form_dict[timeform_value_chosen.get()] if iserror(dt.strptime, extracted_data['Timestamp'][0], form): messagebox.showinfo("Error", "{0} is not matched with {1}".format(extracted_data['Timestamp'][0], form)) else: time = extracted_data['Timestamp'].apply(lambda x: dt.strptime(x, form)) unixtime = time.apply(lambda x: (x - dt(1970, 1, 1)).total_seconds()) extracted_data['Timestamp'] = time extracted_data['unixtime'] = unixtime PageTwo.extracted_data = extracted_data messagebox.showinfo("Message", "Loaded") parent.show_frame1() else: messagebox.showinfo("Error", "Error") button1 = tk.Button(ctr_right_sub, text="Next", width=10, command= save_key_attributes) button1.grid(row=4, padx=(0,20), pady=(7,10), sticky = 'e')
class FlashPacks(): def __init__(self): self.root = Tk() self.root.title("Flash Packs") self.root.configure(bg=app_color) self.root.resizable(height=False, width=False) self.root.geometry("1000x600") self.root.update() self.center_widget(self.root) self.read_decks() #self.main_menu_frame() self.deck_frame(decks[0]) self.root.mainloop() def read_decks(self): try: os.mkdir(res) except Exception: print(f"App Folder Already Exists") try: directories = os.listdir(f"{res}/Decks") for directory in directories: if ".deck" in directory: directory = directory[0:len(directory) - 5] decks.append(Deck(directory)) except Exception: print(f"No decks made......ever") try: os.mkdir(f"{res}/Decks") except Exception: print(f"Decks Folder Already Exists") def center_widget(self, widget): mid_width = int(int(dim[0]) / 2) mid_height = int(int(dim[1]) / 2) w_width = widget.winfo_width() w_height = widget.winfo_height() widget.geometry( f"{w_width}x{w_height}+{int(mid_width-w_width/2)}+{int(mid_height-w_height/2)}" ) def main_menu_frame(self): self.main = Frame(self.root, bg=app_color) deck_label = Label(self.main, text="Choose A Deck", fg=txt_color_1) deck_label.configure(width=110, font=("Times", 40), anchor=W, bg=app_color) deck_label.pack(padx=35) self.deck_list = ScrolledText(self.main) self.deck_list.configure(width=110, height=20, border=1, relief=SUNKEN, state=DISABLED) self.deck_list.pack() self.load_decks() buttons_frame = Frame(self.main, bg=app_color) add_btn = ttk.Button(buttons_frame, text="Add New Deck", command=self.create_deck_pop_up) add_btn.grid(row=0, column=0, padx=100) remove_btn = ttk.Button(buttons_frame, text="Remove Deck", state=DISABLED) remove_btn.grid(row=0, column=1, padx=100) study_btn = ttk.Button(buttons_frame, text="Study Deck", state=DISABLED) study_btn.grid(row=0, column=2, padx=100) buttons_frame.pack(pady=35) self.main.pack(pady=20, padx=20) def load_decks(self): self.deck_list.configure(state=NORMAL) if len(decks) == 0: deck_frame = Frame() deck_name = Label(deck_frame, text="No Decks Available", font=("Times", 30), fg=txt_color_2, width=44, anchor=W, bg="light grey") deck_name.pack(fill=BOTH) deck_cards = Label(deck_frame, text="Number of cards: N/A", font=("Times", 10), anchor=W, bg="light grey") deck_cards.pack(fill=BOTH) deck_used = Label(deck_frame, text="Last Studied: N/A", font=("Times", 10), anchor=W, bg="lightgrey") deck_used.pack(fill=BOTH) self.deck_list.window_create(END, window=deck_frame) self.deck_list.insert(END, "\n") else: for i in range(len(decks)): self.add_deck(decks[i]) self.deck_list.configure(state=DISABLED) def create_deck_pop_up(self): self.name_pop = Toplevel(bg=app_accient_color) self.name_pop.title("New Deck") self.name_pop.geometry("300x100") self.name_pop.update() #self.name_pop.bell() self.center_widget(self.name_pop) name_label = Label(self.name_pop, text="Name the deck", anchor=W, bg=app_accient_color) name_label.pack(fill=BOTH, pady=15, padx=20) entry_frame = Frame(self.name_pop, bg=app_accient_color) self.name_input = Entry(entry_frame) self.name_input.focus_set() self.name_input.bind("<Return>", self.pop_up_enter_hit) self.name_input.grid(row=0, column=0, padx=20) enter_btn = ttk.Button(entry_frame, text="OK", command=self.pop_up_ok_btn_hit) enter_btn.grid(row=0, column=1) entry_frame.pack() self.name_pop.mainloop() def pop_up_enter_hit(self, event): self.pop_up_ok_btn_hit() def pop_up_ok_btn_hit(self): name = self.name_input.get() new_deck = Deck(name) if len(decks) == 0: self.deck_list.configure(state=NORMAL) self.deck_list.delete(1.0, END) self.deck_list.configure(state=DISABLED) duplicate_found = False for deck in decks: if name == deck.deck_name: duplicate_found = True error_msg = Toplevel() error_msg.title("Error") error_msg.resizable(width=False, height=False) error_msg.geometry("250x20") error_msg.update() self.center_widget(error_msg) Label(error_msg, text=f'"{name}" Already Exists').pack() error_msg.mainloop() break if not duplicate_found: self.name_pop.destroy() self.add_deck(new_deck) def add_deck(self, new_deck): bg_color = bg_colors[len(decks) % 2] deck_frame = Frame() deck_name = Label(deck_frame, text=new_deck.deck_name, font=("Times", 30), fg=txt_color_2, width=44, anchor=W, bg=bg_color) deck_name.pack(fill=BOTH) deck_cards = Label(deck_frame, text=f"Number of cards: {len(new_deck.cards)}", font=("Times", 10), anchor=W, bg=bg_color) deck_cards.pack(fill=BOTH) deck_used = Label(deck_frame, text=f"Last Studied: {new_deck.last_studied}", font=("Times", 10), anchor=W, bg=bg_color) deck_used.pack(fill=BOTH) self.deck_list.configure(state=NORMAL) self.deck_list.window_create(END, window=deck_frame) self.deck_list.insert(END, "\n") self.deck_list.configure(state=DISABLED) decks.append(new_deck) def deck_frame(self, deck): cards = deck.cards if len(cards) > 0: self.target_card = cards[int(random.random() * len(cards))] else: self.target_card = "" self.deck_frame = Frame(self.root, bg="white") self.deck_frame.configure(width=600, height=400) cards_frame = Frame(self.deck_frame, bg="white") flash_card = Label(cards_frame, text=self.target_card.face if len(cards) > 0 else "No cards in the Deck", bg="white") flash_card.pack(padx=80, pady=80) buttons_frame = Frame(cards_frame) Button(buttons_frame, text="Flip Card", command=lambda: flash_card.configure(text=self.flip_card( self.target_card, flash_card["text"]))).grid(row=0, column=0) Button(buttons_frame, text="Next", command=lambda: flash_card.configure(text=self.next_card(cards)) ).grid(row=0, column=1) Button(buttons_frame, text="Add Card", command=lambda: self.add_card(deck, cards)).grid(row=0, column=2) buttons_frame.pack() cards_frame.pack() self.deck_frame.pack(pady=100) def flip_card(self, card, current): return card.content if current == card.face else card.face def next_card(self, deck): self.target_card = deck[int(random.random() * len(deck))] return self.target_card.face def add_card(self, deck, cards): self.new_card_pop_up = Toplevel() self.new_card_pop_up.title("New Card") Label(self.new_card_pop_up, text="Front").pack() face = Entry(self.new_card_pop_up) face.pack() Label(self.new_card_pop_up, text="Back").pack() content = Entry(self.new_card_pop_up) content.pack() Button(self.new_card_pop_up, text="OK", command=lambda: self.add_card_ok(face.get(), content.get(), deck, cards)).pack() def add_card_ok(self, face, content, deck, cards): new_card = Card(face, content) deck.add_card(new_card) self.new_card_pop_up.destroy() cards.append(new_card)
root = Tk() root.title("Metin Özetleyici") root.geometry("970x600") root.configure(background='lavender blush') L1 = Label(text="Özetlemek İstediğiniz Metin", font=("Verdana", 13, "bold"), fg="gray40") L1.configure(background='lavender blush') Tittle = Text(bd=5, width=60, height=1) Tittle.insert(INSERT, "Başlığı Giriniz...") Tittle.configure(font=("Verdana 10 italic "), fg="VioletRed3") T1 = ScrolledText(bd=5, width=100, height=10) T1.configure(font=("Verdana 10 italic"), fg="gray40") T1.insert(INSERT, "Metni Giriniz...") L1.place(x=60, y=5) T1.place(x=60, y=70) Tittle.place(x=60, y=35) L2 = Label(text="Metnin Özet Hali", font=("Verdana", 13, "bold"), fg="gray40") L2.configure(background='lavender blush') T2 = ScrolledText(bd=5, width=100, height=10) T2.configure(font=("Verdana 10 italic"), fg="gray40") L2.place(x=60, y=330) T2.place(x=60, y=360) B1 = Button(text="ÖZETLE (TextRank)", bd=2, height=2,
class Console(tkinter.Frame): def __init__(self, parent, settings, max_lines=200, **kwargs): super().__init__(parent, **kwargs) self.settings = settings self.max_lines = max_lines self.console = ScrolledText(self, bg=Theme.CONSOLE_BG, highlightbackground=Theme.BG, highlightcolor=Theme.BG, wrap=tkinter.CHAR, width=40, height=10, state='disabled', relief='flat') # Despite setting height above, this widget gets expanded fully, # if the canvas is smaller than the height, will look odd. self.console.pack(fill=tkinter.BOTH, expand=True) self.font = ('Helvetica', 11, 'bold') # Text color self.console.tag_config('TEXT', foreground=Theme.CONSOLE_TEXT, font=('Helvetica', 11), spacing1=5, spacing3=5) self.console.tag_config('TEXT_ALT', foreground=Theme.CONSOLE_TEXT, background=Theme.CONSOLE_BG_ALT, selectbackground='SystemHighlight', font=('Helvetica', 11), spacing1=5, spacing3=5) # Why does setting 'background' causes highlighted text color to be transparent? # https://web.archive.org/web/20201112014139id_/https://effbot.org/tkinterbook/tkinter-widget-styling.htm self.alt_bg = False # Logging colors self.console.tag_config('INFO', foreground=Theme.LOG_INFO) self.console.tag_config('DEBUG', foreground=Theme.LOG_DEBUG) self.console.tag_config('ERROR', foreground=Theme.LOG_ERROR) self.console.tag_config('WARNING', foreground=Theme.LOG_WARNING) self.console.tag_config('CRITICAL', foreground=Theme.LOG_CRITICAL) self.console.focus() if not self.settings['irc']['username']: self.welcome() self.after(100, self.pooling) def pooling(self): while 1: try: message = QUEUE.get(block=False) self.insert(message) except queue.Empty: break self.after(100, self.pooling) def insert(self, text): self.console.configure(state='normal') # Allow writing try: # Tcl can't render some characters if isinstance(text, Message): self.alt_bg = not self.alt_bg user_color = 'lightblue1' if not text.tags.get('color') else text.tags.get('color') username_tag = f'{text.sender}{"alt_bg" if self.alt_bg else ""}' self.console.tag_config(username_tag, font=self.font, foreground=user_color, background=Theme.CONSOLE_BG_ALT if self.alt_bg else Theme.CONSOLE_BG, selectbackground='SystemHighlight', spacing1=5, spacing3=5) self.console.insert(tkinter.END, text.sender, username_tag) self.console.insert(tkinter.END, f': {text.message}\n', 'TEXT_ALT' if self.alt_bg else 'TEXT') else: message = LOGGER.handlers[1].format(text) # This is not a good way to access this self.console.insert(tkinter.END, f'{message}\n', text.levelname) except tkinter.TclError as e: if isinstance(text, Message): # Replace every char outside of Tcl's allowed range with the ? char. text.message = ''.join((ch if ord(ch) <= 0xFFFF else '\uFFFD') for ch in text.message) self.console.insert(tkinter.END, f': {text.message}\n', 'TEXT') else: self.console.insert(tkinter.END, f'{e}\n', 'ERROR') #https://stackoverflow.com/questions/4609382/getting-the-total-number-of-lines-in-a-tkinter-text-widget self.line_count = int(self.console.index('end-2c').split('.')[0]) if self.line_count > self.max_lines: self.console.delete(1.0, 2.0) self.console.configure(state='disabled') # Disallow writing self.console.yview(tkinter.END) def welcome(self): self.font = ('TkDefaultFont', 11, 'bold') self.console.tag_configure('lightblue', foreground='lightblue1', font=self.font, justify='center') self.console.tag_configure('white', foreground='white', font=self.font) self.console.tag_configure('orange', foreground='orange', font=self.font) self.console.tag_configure('pink', foreground='#FFC8D7', font=self.font) self.console.tag_configure('red', foreground='red', font=self.font, spacing1=2, spacing3=2) self.console.tag_config('grey', foreground='grey', font=('TkDefaultFont', 8, 'bold')) self.console.configure(state='normal') self.console.insert(tkinter.END, '~ Welcome to parky\'s twitch bot! ~\n\n', 'lightblue') self.console.insert(tkinter.END, '\n', 'white') self.console.insert(tkinter.END, 'Quick setup:\n', 'orange') self.console.insert(tkinter.END, '\n', 'white') self.console.insert(tkinter.END, '1', 'red') self.console.insert(tkinter.END, '. Click on the "', 'white') self.settings_img = tkinter.PhotoImage(data=Theme.SETTINGS_ICON) self.console.image_create(tkinter.END, image=self.settings_img) self.console.insert(tkinter.END, '" button.\n', 'white') self.console.insert(tkinter.END, '2', 'red') self.console.insert(tkinter.END, '. Fill in IRC fields to gain chat access!\n', 'white') self.console.insert(tkinter.END, '3', 'red') self.console.insert(tkinter.END, '. ', 'white') self.console.insert(tkinter.END, 'Fill in Twitch API to gain access to channel metadata, such as current title, game, uptime, followers... ', 'white') self.console.insert(tkinter.END, '(optional)\n', 'grey') self.console.insert(tkinter.END, '\n', 'TEXT') self.console.configure(state='disabled')
self.text.configure(state='disabled') # Autoscroll to the bottom self.text.yview(tkinter.END) # This is necessary because we can't modify the Text from other threads self.text.after(0, append) # Sample usage if __name__ == '__main__': # Create the GUI root = tkinter.Tk() from tkinter.scrolledtext import ScrolledText st = ScrolledText(root, state='disabled') st.configure(font='TkFixedFont') st.pack() # Create textLogger text_handler = TextHandler(st) # Add the handler to log log = logging.getLogger() log.addHandler(text_handler) # Log some messages log.debug('debug message') log.info('info message') log.warning('warn message') log.error('error message') log.critical('critical message')
class DisplayImageLabelPlace(): def __init__(self, master, **kwargs): self.word_edited = 0 # false self.master = master frame = tk.Frame(master) frame.configure(bg='#dddddd') frame.grid() self.img_lbl = tk.Label(self.master, width=400, height=6, bg="light gray") self.img_lbl.place(anchor='nw', relwidth=0.35, relheight=0.94) self.page_no_var = tk.IntVar() text_font = tkinter.font.Font(family="Calibri (Body)", size=13, weight="normal") self.page_raw = ScrolledText(self.master, width=50, height=16, wrap=tk.WORD, background='white') self.page_raw.tag_configure('tag-right', justify='right') self.page_raw.configure(font=text_font) # self.page_raw.config (state ='disabled') self.page_raw.place(relx=0.36, rely=0) self.page_edited = ScrolledText(self.master, width=50, height=16, wrap=tk.WORD, background='light gray') self.page_edited.tag_configure('tag-right', justify='right') self.page_edited.configure(font=text_font) self.page_edited.place(relx=0.36, rely=.47) cols = ('#', 'pdf', 'Dic', 'Type') self.listBox = ttk.Treeview(self.master, columns=cols, show='headings', height=25, selectmode="browse") self.listBox.column("#", minwidth=0, width=40, stretch=tk.NO) self.listBox.column("pdf", minwidth=0, width=90, stretch=tk.NO) self.listBox.column("Dic", minwidth=0, width=90, stretch=tk.NO) self.listBox.column("Type", minwidth=0, width=100, stretch=tk.NO) self.listBox.place(relx=0.73, rely=0) for col in cols: self.listBox.heading(col, text=col) verscrlbar = ttk.Scrollbar(self.master, orient="vertical", command=self.listBox.yview) verscrlbar.place(relx=0.97, rely=0, height=530) self.listBox.configure(yscrollcommand=verscrlbar.set) self.listBox.bind("<Double-1>", self.listBox_OnDoubleClick) self.listBox.bind("<ButtonRelease-1>", self.listBox_OnClick) self.listBox.bind("<KeyRelease-Up>", self.listBox_UpArrow) self.listBox.bind("<KeyRelease-Down>", self.listBox_DownArrow) self.edit_word_var = tk.StringVar() self.dict_entry = tk.Entry(self.master, textvariable=self.edit_word_var, width=20, justify='right').place(relx=0.74, rely=0.80) self.word_pdf_type = tk.IntVar() tk.Radiobutton(self.master, text='Specific', variable=self.word_pdf_type, value=0).place(relx=0.85, rely=0.80) tk.Radiobutton(self.master, text='Dict', variable=self.word_pdf_type, value=1).place(relx=0.85, rely=0.84) tk.Button(self.master, text="Save ", fg="red", command=self.save_dict_word).place(relx=0.95, rely=0.80) tk.Button(self.master, text="Save Page", fg="red", command=self.save_dict_page).place(relx=0.95, rely=0.94) tk.Button(self.master, text="GO", command=self.draw_page).place(relx=0.2, rely=0.94) tk.Button(self.master, text="Prev ", command=self.prev_page).place(relx=0.25, rely=0.94) tk.Entry(self.master, textvariable=self.page_no_var, width=4).place(relx=0.3, rely=0.94) tk.Button(self.master, text="Next ", command=self.next_page).place(relx=0.33, rely=0.94) tk.Button(self.master, text="Copy ", command=self.copy_clipboard).place(relx=0.37, rely=0.94) tk.Button(self.master, text="reEdit ", command=self.reedit_page).place(relx=0.41, rely=0.94) tk.Button(self.master, text="Quit ", fg="red", command=quit).place(relx=0.55, rely=0.94) self.page_no_var.set(4) self.draw_page() def draw_page(self): self.word_edited = 0 # False page_no = self.page_no_var.get() page = 'ABH-' + format(page_no, '03') + '.png' # image_path = f'.\\data\\books\\ABH\\pages\\{page}' image_path = os.path.join('.', 'data', 'books', 'ABH', 'pages', page) img_file = Image.open(image_path) img_file.thumbnail((600, 650), Image.ANTIALIAS) self.img_lbl.img = ImageTk.PhotoImage(img_file) self.img_lbl.config(image=self.img_lbl.img) # words= str(((pytesseract.image_to_string(Image.open(image_path), lang='ara')))) page_raw, page_edited = get_db_page(page_no) self.page_raw.config(state='normal') self.page_raw.delete('1.0', 'end') # clear text self.page_raw.insert('end', page_raw, 'tag-right') self.page_raw.config(state='disabled') self.page_edited.config(state='normal') self.page_edited.delete('1.0', 'end') # clear text self.page_edited.insert('end', page_edited, 'tag-right') self.page_edited.config(state='disabled') self.word_pdf_type.set(0) # default Specific for i in self.listBox.get_children(): self.listBox.delete(i) # clear text rows = get_page_dict(page_no) for i, row in enumerate(rows, start=1): self.listBox.insert("", "end", iid=i, values=(i, row[0], row[1], (row[3] if row[3] != None else ''), 0)) self.listBox.selection_set(['1']) # select first line def next_page(self): if self.word_edited: if tk.messagebox.askyesno("Save?", "Save Changes?"): self.save_dict_page() self.page_no_var.set(self.page_no_var.get() + 1) self.draw_page() def prev_page(self): if self.word_edited: if tk.messagebox.askyesno("Save?", "Save Changes?"): self.save_dict_page() self.page_no_var.set(self.page_no_var.get() - 1) self.draw_page() def copy_clipboard(self): pyperclip.copy(self.page_edited.get("1.0", tk.END)) def reedit_page(self): page_no = self.page_no_var.get() page_reedited = rebuild_page_text(page_no) # page_raw, page_reedited = get_db_page(page_no) self.page_edited.config(state='normal') self.page_edited.delete('1.0', 'end') # clear text self.page_edited.insert('end', page_reedited, 'tag-right') self.page_edited.config(state='disabled') def listBox_DictLineChange(self, event): # item = self.self.listBox.item(item,"values") item = self.listBox.focus() # print (event,":", item, self.listBox.selection(), self.listBox.item(item,"values")) items = self.listBox.item(item, "values") self.edit_word_var.set(items[2]) if items[3] in ['', 'Specific', 'None']: self.word_pdf_type.set(0) else: self.word_pdf_type.set(1) def listBox_OnClick(self, event): self.listBox_DictLineChange(event) def listBox_OnDoubleClick(self, event): self.listBox_DictLineChange(event) def listBox_UpArrow(self, event): self.listBox_DictLineChange(event) def listBox_DownArrow(self, event): self.listBox_DictLineChange(event) def save_dict_word(self): # update on the TreeView self.word_edited = 1 word_types = ['Specific', 'Dict'] # item = self.listBox.focus() word_type = word_types[self.word_pdf_type.get()] word_dict = self.edit_word_var.get() selected = self.listBox.focus() temp = self.listBox.item(selected, 'values') self.listBox.item(selected, values=(temp[0], temp[1], word_dict, word_type, 1)) def save_dict_page(self): # save changes in the page's dict to DB page_edited = False for w in self.listBox.get_children(): row = self.listBox.item(w, 'values') if int(row[4]): # row got modified # update_book_word(pdf_word, dict_word, page_no, word_type) update_book_word(row[1], row[2], self.page_no_var.get(), row[3]) page_edited = True self.word_edited = 0 if page_edited: # refresh edited page text page_reedited = rebuild_page_text(self.page_no_var.get()) self.page_edited.config(state='normal') self.page_edited.delete('1.0', 'end') # clear text self.page_edited.insert('end', page_reedited, 'tag-right') self.page_edited.config(state='disabled')
class GUI: """Graphical user interface to clfit. Data attributes that may sensibly be used externally: exe (string) -- path to clfit executable device (string) -- PGPLOT device, passed to clfit fileName (tkinter.StringVar) -- path to OI-FITS/Mapping Data file (use set() & get() methods) ChangeFileButton (tkinter.Button) -- brings up data file dialog box (may wish to disable) initialdir (string) -- initial directory for file dialog boxes preFitCallback -- function to call just before running clfit. If this returns false, clfit won't be run postFitCallback -- function to call after running clfit (if successful) """ def __init__(self, parent, dismissCommand=None): """Constructor. Arguments are: parent -- parent window dismissCommand -- function to call when Dismiss button clicked """ # Initialise data attributes self.parent = parent self.exe = "clfit" self.device = "/xserv" self.fileName = tk.StringVar() self.fileName.set("(unset)") self.initialdir = os.getcwd() self.preFitCallback = None self.postFitCallback = None self.calErr = tk.StringVar() self.calErr.set("0.0") self.cwl = tk.StringVar() self.bw = tk.StringVar() self.wlmin = tk.StringVar() self.wlmax = tk.StringVar() self.target_id = tk.StringVar() self.nofit = tk.IntVar() self.nofit.set(0) self.plots = [ "No plot", "uv", "vis2", "t3amp", "t3phi", "vis2-wl", "t3amp-wl", "t3phi-wl", "vis2-mjd", "t3amp-mjd", "t3phi-mjd", "vis2-st", "t3amp-st", "t3phi-st", "vis2-pa", "post", "mpost", "post2d", "mpost2d", ] self.selPlot = tk.StringVar() self.selPlot.set(self.plots[1]) self.plotXIndex = tk.StringVar() self.plotXIndex.set("1") self.plotYIndex = tk.StringVar() self.plotYIndex.set("2") self.plotXFrom = tk.StringVar() self.plotXTo = tk.StringVar() self.plotYFrom = tk.StringVar() self.plotYTo = tk.StringVar() self.margErr = tk.IntVar() self.margErr.set(0) self.margErrVar = tk.StringVar() self.margErrVar.set("1") # Initialise GUI elements fileFrame = tk.Frame(parent) fileFrame.pack(side=tk.TOP) tk.Label(fileFrame, text="Data file:").pack(side=tk.LEFT) tk.Label(fileFrame, textvariable=self.fileName).pack(side=tk.LEFT) self.ChangeFileButton = tk.Button( fileFrame, text="Change", command=self._ChangeFileName ) self.ChangeFileButton.pack(side=tk.LEFT) calErrFrame = tk.Frame(parent) calErrFrame.pack(side=tk.TOP, fill=tk.X, pady=4) tk.Label( calErrFrame, text="Calibration Error (extra frac. error in system vis.)" ).pack(side=tk.LEFT, anchor=tk.W) tk.Entry(calErrFrame, textvariable=self.calErr, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) wbFrame = tk.Frame(parent) wbFrame.pack(side=tk.TOP, fill=tk.X, pady=4) tk.Label(wbFrame, text="Waveband:").pack(side=tk.LEFT, anchor=tk.W) tk.Entry(wbFrame, textvariable=self.cwl, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) tk.Entry(wbFrame, textvariable=self.bw, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) tk.Label(wbFrame, text="or Wavelength range:").pack(side=tk.LEFT, anchor=tk.W) tk.Entry(wbFrame, textvariable=self.wlmin, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) tk.Entry(wbFrame, textvariable=self.wlmax, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) targetFrame = tk.Frame(parent) targetFrame.pack(side=tk.TOP, fill=tk.X, pady=4) tk.Label( targetFrame, text="TARGET_ID (blank to use 1st in OI_TARGET table):" ).pack(side=tk.LEFT, anchor=tk.W) tk.Entry(targetFrame, textvariable=self.target_id, width=5).pack( side=tk.LEFT, anchor=tk.W, padx=4 ) tk.Label(parent, text="Model:").pack(side=tk.TOP, anchor=tk.W) self.ModelText = ScrolledText( parent, height=19, width=40, font=("Helvetica", 10) ) self.ModelText.pack(side=tk.TOP, expand=1, fill=tk.BOTH) midFrame1 = tk.Frame(parent) midFrame1.pack(side=tk.TOP, fill=tk.X, pady=4) tk.Label(midFrame1, text="Plot:").pack(side=tk.LEFT, anchor=tk.NW) plotFrame = tk.Frame(midFrame1) plotFrame.pack(side=tk.LEFT) ncol = 3 for i in range(len(self.plots)): p = self.plots[i] tk.Radiobutton(plotFrame, text=p, variable=self.selPlot, value=p).grid( row=int((i + 1) / ncol), column=(i + 1) % ncol, sticky=tk.W ) tk.Entry(plotFrame, textvariable=self.plotXIndex, width=3).grid( row=int(len(self.plots) / ncol) - 1, column=ncol ) tk.Entry(plotFrame, textvariable=self.plotYIndex, width=3).grid( row=int(len(self.plots) / ncol), column=ncol ) rangeFrame = tk.Frame(midFrame1) rangeFrame.pack(side=tk.LEFT) tk.Label(rangeFrame, text="X From:").grid(row=0, column=0, sticky=tk.E) tk.Entry(rangeFrame, textvariable=self.plotXFrom, width=5).grid(row=0, column=1) tk.Label(rangeFrame, text="To:").grid(row=0, column=2) tk.Entry(rangeFrame, textvariable=self.plotXTo, width=5).grid(row=0, column=3) tk.Label(rangeFrame, text="Y From:").grid(row=1, column=0, sticky=tk.E) tk.Entry(rangeFrame, textvariable=self.plotYFrom, width=5).grid(row=1, column=1) tk.Label(rangeFrame, text="To:").grid(row=1, column=2) tk.Entry(rangeFrame, textvariable=self.plotYTo, width=5).grid(row=1, column=3) tk.Label(rangeFrame, text="[Y for (m)post2d only]").grid(row=2, columnspan=4) tk.Button(midFrame1, text="Go", command=self.Go).pack( side=tk.RIGHT, anchor=tk.NE, padx=4 ) tk.Button(midFrame1, text="Save model", command=self.SaveModel).pack( side=tk.RIGHT, anchor=tk.NE, padx=4 ) tk.Button(midFrame1, text="Load model", command=self.LoadModel).pack( side=tk.RIGHT, anchor=tk.NE, padx=4 ) midFrame2 = tk.Frame(parent) midFrame2.pack(side=tk.TOP, fill=tk.X, pady=4) tk.Checkbutton( midFrame2, text="Don't fit (report goodness-of-fit only)", variable=self.nofit, ).pack(side=tk.LEFT, anchor=tk.W, padx=8) tk.Entry(midFrame2, textvariable=self.margErrVar, width=5).pack( side=tk.LEFT, anchor=tk.W ) tk.Checkbutton( midFrame2, text="Error bar by marginalising", variable=self.margErr ).pack(side=tk.LEFT, anchor=tk.W) midFrame3 = tk.Frame(parent) midFrame3.pack(side=tk.TOP, fill=tk.X) tk.Label(midFrame3, text="Results:").pack(side=tk.LEFT, anchor=tk.SW) if dismissCommand is None: dismissCommand = parent.quit tk.Button(midFrame3, text="Dismiss", command=dismissCommand).pack( side=tk.RIGHT, padx=4, pady=4 ) tk.Button(midFrame3, text="Clear results", command=self.ClearResults).pack( side=tk.RIGHT, padx=4, pady=4 ) self.Results = ScrolledText( parent, height=31, width=90, font=("Courier", 10), state=tk.DISABLED ) self.Results.tag_config("result", foreground="#1e90ff") # dodger blue self.Results.tag_config("commentary", foreground="#ff8c00") # dark orange self.Results.tag_config("error", foreground="#8b0000") # dark red self.Results.pack(side=tk.TOP, expand=1, fill=tk.BOTH) def LoadModel(self): """Get filename and read model from file.""" fileName = tk_filedialog.askopenfilename( parent=self.parent, initialdir=self.initialdir, filetypes=[("mfit model files", "*.model"), ("All files", "*")], ) if fileName != "": self.ReadModel(fileName) def ReadModel(self, fileName): """Read model from file.""" try: fil = open(fileName, "r") text = fil.read() fil.close() except IOError as e: (errNo, errStr) = e.args self.ShowResult("Error reading %s: %s\n" % (fileName, errStr), "error") else: self.SetModel(text) def SetModel(self, text): """Set model text.""" self.ModelText.delete(1.0, tk.END) self.ModelText.insert(tk.END, text) def ClearResults(self): """Clear results window.""" self.Results.configure(state=tk.NORMAL) self.Results.delete(1.0, tk.END) self.Results.configure(state=tk.DISABLED) def SaveModel(self): """Get filename and write model to file.""" fileName = tk_filedialog.asksaveasfilename( parent=self.parent, initialdir=self.initialdir, filetypes=[("mfit model files", "*.model"), ("All files", "*")], ) if fileName != "": self.WriteModel(fileName) def WriteModel(self, fileName): """Write model text to file.""" fil = open(fileName, "w") fil.write(self.ModelText.get(1.0, tk.END)) fil.close() def _ChangeFileName(self): newName = tk.filedialog.askopenfilename( parent=self.parent, initialdir=self.initialdir, title="Choose data file for fit", filetypes=[ ("(OI-)FITS files", "*fits"), ("COAST Mapping Data files", "*.mapdat"), ("wbCalib / nbCalib files", "*calib"), ("All files", "*"), ], ) if newName != "": self.fileName.set(newName) def ShowResult(self, text, tag): """Display text in 'Results'.""" self.Results.configure(state=tk.NORMAL) self.Results.insert(tk.END, text, tag) self.Results.yview(tk.END) self.Results.configure(state=tk.DISABLED) self.parent.update_idletasks() def Go(self): """Fit the current model.""" # Execute pre-callback if callable(self.preFitCallback): if not self.preFitCallback(): return # Write model text to tempfile self._tempName = tempfile.mktemp(".model") self.WriteModel(self._tempName) # Run clfit so we can grab its output args = ["nice", self.exe, "--device", self.device] try: c = float(self.calErr.get()) except ValueError: pass else: args += f"--calerr {c:.3f}".split() try: cwl = float(self.cwl.get()) bw = float(self.bw.get()) except ValueError: try: wlmin = float(self.wlmin.get()) wlmax = float(self.wlmax.get()) args += f"--waverange {wlmin:.2f} {wlmax:.2f}".split() except ValueError: pass # don't specify waveband(s) else: args += f"--waveband {cwl:.2f} {bw:.2f}".split() try: target_id = int(self.target_id.get()) args += f"--target_id {target_id}".split() except ValueError: pass p = self.selPlot.get() if p != self.plots[0]: # not 'No plot' if p == "post" or p == "mpost": try: index = int(self.plotXIndex.get()) except ValueError: index = 1 if p == "post2d" or p == "mpost2d": try: indx = (int(self.plotXIndex.get()), int(self.plotYIndex.get())) except ValueError: indx = (1, 2) try: xmin = float(self.plotXFrom.get()) xmax = float(self.plotXTo.get()) if p[-2:] == "2d": ymin = float(self.plotYFrom.get()) ymax = float(self.plotYTo.get()) except ValueError: if p == "post" or p == "mpost": args += f"--plot {p} {index}".split() elif p == "post2d" or p == "mpost2d": args += f"--plot {p} {indx[0]} {indx[1]}".split() else: args += f"--plot {p}".split() else: if p == "post" or p == "mpost": args += f"--zoomplot {p} {index} {xmin} {xmax}".split() elif p == "post2d" or p == "mpost2d": args += ( f"--zoomplot {p} {indx[0]} {indx[1]} {xmin:.4f} {xmax:.4f}" f" {ymin:.4f} {ymax:.4f}".split() ) else: args += f"--zoomplot {p} {xmin:.4f} {xmax:.4f}".split() if self.nofit.get(): args += ["--nofit"] if self.margErr.get(): args += f"--margerr {self.margErrVar.get()}".split() args += [self.fileName.get(), self._tempName] self.ShowResult("Running %s:\n" % " ".join(args), tag="commentary") # https://gitpress.io/u/1282/tkinter-read-async-subprocess-output self._proc = Popen(args, bufsize=10, stdout=PIPE, stderr=STDOUT, close_fds=True) oldflags = fcntl.fcntl(self._proc.stdout, fcntl.F_GETFL) fcntl.fcntl(self._proc.stdout, fcntl.F_SETFL, oldflags | os.O_NONBLOCK) self.parent.createfilehandler( self._proc.stdout, tk.READABLE, self._HandleChildOutput ) def _HandleChildOutput(self, fd, mask): """Handle output from child process.""" self._ShowOutput() returncode = self._proc.poll() if returncode is not None: # child process completed time.sleep(0.5) # wait for last output self._ShowOutput() if returncode != 0: self.ShowResult(f"Subprocess exited with code {returncode}\n", "error") else: self.ShowResult("Subprocess exited normally\n", "commentary") self.parent.deletefilehandler(self._proc.stdout) os.remove(self._tempName) # Execute post-callback if callable(self.postFitCallback): self.postFitCallback() def _ShowOutput(self): """Read child process output and pass to ShowResult().""" try: result = self._proc.stdout.read() except IOError as e: (errNo, errMsg) = e.args self.ShowResult("I/O Error %d: %s\n" % (errNo, errMsg), "commentary") else: self.ShowResult(result, "result")
class ConsoleUi: """Poll messages from a logging queue and display them in a scrolled text widget""" def __init__(self, frame): self.frame = frame # Create a ScrolledText wdiget self.scrolled_text = ScrolledText(frame, state='disabled', height=12) self.scrolled_text.grid(row=0, column=0, sticky=(N, S, W, E)) self.scrolled_text.configure(font='TkFixedFont') self.scrolled_text.tag_config('INFO', foreground='black') self.scrolled_text.tag_config('DEBUG', foreground='gray') self.scrolled_text.tag_config('WARNING', foreground='orange') self.scrolled_text.tag_config('ERROR', foreground='red') self.scrolled_text.tag_config('CRITICAL', foreground='red', underline=1) self.scrolled_text.tag_config( 'COPYOVER', foreground='blue', ) self.scrolled_text.tag_config( 'COPYNEW', foreground='green', ) self.scrolled_text.tag_config( 'DELETE', foreground='red', ) self.scrolled_text.tag_config( 'MOVE', foreground='magenta', ) # Start polling messages from the queue self.frame.after(100, self.poll_log_queue) def display(self, record): msg = record # Send special message to clear the log if msg == "__clear__": self.scrolled_text.configure(state='normal') self.scrolled_text.delete(1.0, tk.END) self.scrolled_text.configure(state='disabled') return self.scrolled_text.configure(state='normal') self.scrolled_text.insert(tk.END, msg[1] + '\n', msg[0]) self.scrolled_text.configure(state='disabled') # Autoscroll to the bottom self.scrolled_text.yview(tk.END) def poll_log_queue(self): # Check every 100ms if there is a new message in the queue to display while True: try: record = msg_queue.get(block=False) except queue.Empty: break else: self.display(record) self.frame.after(100, self.poll_log_queue)
def asset_page(asset, origin, origin_details=None, original_origin=None): def open_class(): selected = listbox.curselection() if selected: class_id = asset["classList"][selected[0]]["id"] class_page(class_id, origin="asset", origin_details=asset_id, original_origin=original_origin) def return_to_layer_2_search_results(): if origin_details: layer_2_search_results(origin_details) else: layer_1_search() def return_to_class_page(): if origin_details: class_page(origin_details, "classes") else: layer_1_classes() def return_to_layer_2_critical_items(): layer_1_critical() if not asset: return if isinstance(asset, int): asset_id = asset for obj in db["assets"]: if obj["assetId"] == asset_id: asset = obj break else: asset_id = asset["assetId"] for child in list(window.children.values()): child.destroy() layer_3 = tk.Frame(window) layer_3.pack() asset_detail_page = tk.Frame(layer_3) asset_detail_page.pack() window.title("Asset #" + str(asset_id)) if origin == "search": tk.Button(asset_detail_page, text="Back to search results", command=return_to_layer_2_search_results).pack() elif origin == "critical": tk.Button(asset_detail_page, text="Back to critical items", command=return_to_layer_2_critical_items).pack() elif origin == "class": if origin_details: tk.Button(asset_detail_page, text="Back to " + classes[origin_details]["name"] + " details", command=return_to_class_page).pack() else: tk.Button(asset_detail_page, text="Back to classes", command=return_to_class_page).pack() else: tk.Button(asset_detail_page, text="Go home", command=layer_0_home).pack() if "name" in asset.keys(): tk.Label(asset_detail_page, text="name: " + asset["name"]).pack() else: tk.Label(asset_detail_page, text="(unnamed)").pack() tk.Label(asset_detail_page, text="ID: " + str(asset_id)).pack() if "description" in asset.keys(): tk.Label(asset_detail_page, text="description:\n" + asset["description"]).pack() else: tk.Label(asset_detail_page, text="description:\nnone").pack() if "classList" in asset.keys(): tk.Label(asset_detail_page, text="classes of this asset:").pack() if len(asset["classList"]) > 0: listbox = tk.Listbox(asset_detail_page, selectmode=tk.BROWSE, width=40) listbox.pack() listbox.bind('<Double-1>', lambda x: open_class()) for i, class_obj in enumerate(asset["classList"]): listbox.insert(i, class_obj["name"]) else: tk.Label(asset_detail_page, text="None").pack() else: tk.Label(asset_detail_page, text="None").pack() tk.Label(asset_detail_page, text="raw data about this asset:").pack() detail = ScrolledText(asset_detail_page) detail.pack() for attr, data in asset.items(): if isinstance(data, dict): detail.insert(tk.INSERT, str(attr) + "\n") for key, val in data.items(): detail.insert(tk.INSERT, (str(key) + ": " + str(val)) + "\n") elif isinstance(data, list): detail.insert(tk.INSERT, str(attr) + "\n") for val in data: detail.insert(tk.INSERT, str(val) + "\n") else: detail.insert(tk.INSERT, str(attr) + ": " + str(data) + "\n") detail.configure(state="disabled")
class Notepad(tk.Tk): """A notepad application""" def __init__(self): super().__init__() self.withdraw() #this is how to check platform & set zoom status platform = self.tk.call('tk', 'windowingsystem') self.wm_state('zoomed') if platform == 'win32' else self.attributes( '-zoomed', 1) # code for naming file and about file variables. self.file = pathlib.Path.cwd() / 'Untitled_notepad.txt' self.file_defaults = { 'defaultextension': '*', 'filetypes': [('All Files', '.*')]} # code to find,search and replace variables self.query = None self.matches = None self.findnext = None self.findreplace = None # code to do main menu setup self.menu = tk.Menu(self) self.configure(menu=self.menu) self.menu_file = tk.Menu(self.menu, tearoff=False) self.menu_edit = tk.Menu(self.menu, tearoff=False) # file menu looks like #To open a new file self.menu_file.add_command(label='New', accelerator='Ctrl+N', command=self.new_file) #To open already existing file. self.menu_file.add_command(label='Open...', accelerator='Ctrl+O', command=self.open_file) #To save the current file self.menu_file.add_command(label='Save', accelerator='Ctrl+S', command=self.save_file) #To save an existing file under new name self.menu_file.add_command(label='Save As...', accelerator='Ctrl+Shift+S', command=self.save_file_as) #To Exit current file or loation. self.menu_file.add_command(label='Exit', accelerator='Alt+F4', command=self.quit_App) # edit menu looks like #To give a Feature of undo and Redo. self.menu_edit.add_command(label='Redo', accelerator='Ctrl+Y', command=self.redo_edit) self.menu_edit.add_command(label='Undo', accelerator='Ctrl+Z', command=self.undo_edit) #To give a feature of cut,copy and Paste. self.menu_edit.add_command(label='Cut', accelerator='Ctrl+X', command=self.text_cut) self.menu_edit.add_command(label='Copy', accelerator='Ctrl+C', command=self.text_copy) self.menu_edit.add_command(label='Paste', accelerator='Ctrl+V', command=self.text_paste) #To give the feature of finding something and/or replacing it. self.menu_edit.add_command(label='Find', accelerator='Ctrl+F', command=self.ask_find_next) self.menu_edit.add_command(label='Find and Replace', accelerator='Ctrl+H', command=self.ask_find_replace) #To get the current time and date at the begining of cursor. self.menu_edit.add_command(label='Time/Date', accelerator='F5', command=self.get_datetime) # code to add cascading menus to main menu self.menu.add_cascade(label='File', menu=self.menu_file) self.menu.add_cascade(label='Edit', menu=self.menu_edit) # how to setup text widget self.text_frame = tk.Frame(self) self.text = ScrolledText(self.text_frame, wrap=tk.WORD, font='-size 20', undo=True, maxundo=10, autoseparator=True, blockcursor=False, padx=5, pady=10) # set default tab size to 4 characters self.font = tkfont.Font(family='Courier New', size=12, weight=tkfont.NORMAL, slant=tkfont.ROMAN, underline=False, overstrike=False) self.text.configure(font=self.font) tab_width = self.font.measure(' ' * 4) self.text.configure(tabs=(tab_width,)) self.text.insert(tk.END, self.file.read_text() if self.file.is_file() else '') # packing up all widget to screen self.text.pack(fill=tk.BOTH, expand=tk.YES) self.text_frame.pack(fill=tk.BOTH, expand=tk.YES) # adding up status bar self.status_bar = StatusBar(self, self.text) # this is the final setup self.update_title() #self.eval('tk::PlaceWindow . center') self.deiconify() # -------------defining FILE MENU starts-------------------------------------- def new_file(self, event=None): """Create a new file""" # check for content change before opening new file self.confirm_changes() # reset text widget self.text.delete(1.0, tk.END) self.file = pathlib.Path.cwd() / 'Untitled_notepad.txt' self.update_title() def open_file(self, event=None): """Open an existing file""" # check for content change before opening new file self.confirm_changes() # open new file file = filedialog.askopenfilename( initialdir=self.file.parent, **self.file_defaults) if file: self.text.delete(1.0, tk.END) # delete existing content self.file = pathlib.Path(file) self.text.insert(tk.END, self.file.read_text()) self.update_title() self.status_bar.update_status() def save_file(self, event=None): """Save the currently open file""" if self.file.name == 'Untitled_notepad.txt': file = filedialog.asksaveasfilename( initialfile=self.file, **self.file_defaults) self.file = pathlib.Path(file) if file else self.file self.file.write_text(self.text.get(1.0, tk.END)) self.update_title() def save_file_as(self, event=None): """Save the currently open file with a different name or location""" file = filedialog.asksaveasfilename( initialdir=self.file.parent, **self.file_defaults) if file: self.file = pathlib.Path(file) self.file.write_text(self.text.get(1.0, tk.END)) self.update_title() def confirm_changes(self): """Check to see if content has changed from original file; if so, confirm save""" if self.file.is_file(): original = self.file.read_text() current = self.text.get(1.0, tk.END) if original != current: confirm = messagebox.askyesno( message="Save current file changes?") if confirm: self.save_file() # new unsaved document with content is prompted to save elif self.text.count(1.0, tk.END)[0] > 1: confirm = messagebox.askyesno(message="Save current document?") if confirm: self.save_file() def update_title(self): """Update the title with the file name""" self.title(self.file.name + " - Notepad") def quit_App(self): """Quit application after checking for user changes""" self.confirm_changes() self.destroy() #-----------------FILE Menu definition Ends-------------------------------- #-----------------EDIT MENU definition starts------------------------------ def undo_edit(self): """Undo the last edit in the stack""" try: self.text.edit_undo() except tk.TclError: pass def redo_edit(self): """Redo the last edit in the stack""" try: self.text.edit_redo() except tk.TclError: pass def text_copy(self): """Append selected text to the clipboard""" selected = self.text.get(tk.SEL_FIRST, tk.SEL_LAST) self.text.clipboard_clear() self.text.clipboard_append(selected) def text_paste(self): """Paste clipboard text into text widget at cursor""" self.text.insert(tk.INSERT, self.text.clipboard_get()) def text_cut(self): """Cut selected text and append to clipboard""" selected = self.text.get(tk.SEL_FIRST, tk.SEL_LAST) self.text.delete(tk.SEL_FIRST, tk.SEL_LAST) self.text.clipboard_clear() self.text.clipboard_append(selected) def quit_application(self, event=None): """Quit application after checking for user changes""" self.confirm_changes() self.destroy() def ask_find_next(self, event=None): """Create find next popup widget""" self.findnext = Find(self, self.text) def ask_find_replace(self, event=None): """Create replace popup widget""" self.findreplace = Replace(self, self.text) def get_datetime(self, event=None): """insert date and time at cursor position""" self.text.insert(tk.INSERT, datetime.datetime.now().strftime("%c"))
def update(sv_version, changelog): nonlocal debug updatewindow = tk.Toplevel(master) updatewindow.title(_('Update')) updatewindow.geometry(master.popup_geometry(400, 300)) updatewindow.resizable(False, False) updatewindow.focus() try: updatewindow.iconbitmap('asset/icon.ico') except tk.TclError: pass button_frame = tk.Frame(updatewindow) button_frame.pack(side=tk.BOTTOM, pady=3, fill='x') cancel_button = ttk.Button(button_frame, text=_('Cancel'), command=updatewindow.destroy) update_button = ttk.Button(button_frame, width=28, text=_('Update now')) text_frame = tk.Frame(updatewindow) text_frame.pack(side=tk.TOP, pady=3) text = tk.Label(text_frame, text=_('New version %s is available.') % sv_version) text.pack() changelog_box = ScrolledText(updatewindow, width=57, relief='solid', bd=0) changelog_box.insert(tk.CURRENT, changelog) changelog_box.configure(state=tk.DISABLED) changelog_box.pack(padx=5) updatewindow.grab_set() def start_update(): '''Withdraw main window and start update download''' nonlocal button_frame nonlocal cancel_button nonlocal update_button nonlocal debug nonlocal sv_version master.withdraw() try: os.remove('update.zip') except OSError: pass install = True # For development purposes if not bundle and debug: if not msgbox.askyesno('', 'Install update?'): install = False cancel_button.destroy() update_button.destroy() def cancel(): if msgbox.askokcancel(_('Cancel'), _('Are you sure to cancel?')): os._exit(0) # There's no cancel button so we use close button as one instead updatewindow.protocol("WM_DELETE_WINDOW", cancel) # Define progress variables dl_p = tk.IntVar() dl_p.set(0) dl_pbar = ttk.Progressbar(button_frame, length=150, orient=tk.HORIZONTAL, variable=dl_p) dl_pbar.pack(side='left', padx=5) dl_prog_var = tk.StringVar() dl_prog_var.set('-------- / --------') dl_prog = tk.Label(button_frame, textvariable=dl_prog_var) dl_speed_var = tk.StringVar() dl_speed_var.set('---------') dl_speed = tk.Label(button_frame, textvariable=dl_speed_var) dl_prog.pack(side='right', padx=5) dl_speed.pack(side='right', padx=5) master.update() dl_url = f'https://github.com/sw2719/steam-account-switcher/releases/download/v{sv_version}/Steam_Account_Switcher_v{sv_version}.zip' try: r = req.get(dl_url, stream=True) r.raise_for_status() total_size = int(r.headers.get('content-length')) total_in_MB = round(total_size / 1048576, 1) except req.RequestException: msgbox.showerror(_('Error'), _('Error occured while downloading update.')) os._exit(1) if round(total_in_MB, 1).is_integer(): total_in_MB = int(total_in_MB) def launch_updater(): if not install: return while not os.path.isfile('update.zip'): sleep(1) try: archive = os.path.join(os.getcwd(), 'update.zip') f = zf.ZipFile(archive, mode='r') f.extractall(members=(member for member in f.namelist() if 'updater' in member)) os.execv('updater/updater.exe', sys.argv) except (FileNotFoundError, zf.BadZipfile, OSError): error_msg(_('Error'), _("Couldn't perform automatic update.") + '\n' + _('Update manually by extracting update.zip file.')) def dl_callback(downloader): nonlocal total_in_MB current_size = downloader.total_downloaded current_in_MB = round(current_size / 1048576, 1) if round(current_in_MB, 1).is_integer(): current_in_MB = int(current_in_MB) perc = int(current_size / total_size * 100) prog = f'{current_in_MB}MB / {total_in_MB}MB' dl_p.set(perc) dl_prog_var.set(prog) dl_speed_var.set(downloader.readable_speed + '/s') master.update() if perc == 100 and downloader.total_merged == downloader.total_length: launch_updater() downloader = Downloader(dl_url, 'update.zip', 8) downloader.subscribe(dl_callback) downloader.start() update_button['command'] = lambda: start_update() if LOCALE == 'fr_FR': padx_int = 80 else: padx_int = 110 cancel_button.pack(side='left', padx=(padx_int, 0)) update_button.pack(side='right', padx=(0, padx_int))
class ChatBox(object): """ Creates a chat object/window. It allows multiple player to chat with each other if they wish to. :param sock: This is the socket through which messages will be sent/received. :type sock: python socket """ def __init__(self, sock): self.name = "" # Initially set to empty string self.sock = sock # set socket to a socket already being used def new_message(self, msg): """ When a message is recieved this will show it in the chat window :param msg: New message recieved from other player :type msg: String. """ # concatenate name + message string = msg["name"] + ": " + msg["chat_msg"] # shows the message on the screen self.recvd.insert("end", "%s \n" % string) # always shows last line received self.recvd.see(END) def send(self, event): """ sends a json message to server when you press "Return" key to send a message. """ if self.msg.get().strip() != "": # validates empty string # sets message to be sent message = {"name": self.name, "chat_msg": self.msg.get()} message = json.dumps(message) # converts it in json form self.sock.sendall(message.encode()) # sends message to server self.msg.delete(0, 'end') # clear the variable def start(self, name): """ creates a tkinter window where a person can send/receive messages from others :param name: Name of player (self) :type name: String. """ self.name = name # set name to the name entered in form self.root = Tk() # creates tkinter window self.root.geometry('+%d+%d' % (1000, 0)) self.frame = Frame(self.root) # create a frame on the window # Where the Client enters the message self.msg = Entry(self.frame, width=50, font=('TkDefaultFont', 11)) self.msg.configure(bg='pink') # set background colour of textfield # The text area where all received messages go. self.recvd = ScrolledText(self.frame, height=29, width=50) # Set background colour of received messages self.recvd.configure(bg='lightblue') self.root.title("Chat") # set title of window to chat self.root.minsize(500, 500) # minimum size of tkinter window self.root.maxsize(500, 500) # maximum size of tkinter window self.root.configure(bg='lightblue') # set background of tkinter window self.root.bind('<Return>', self.send) # listens for return key press self.recvd.pack() # packs message box self.msg.pack(ipady=5) # packs textfield self.frame.pack() # packs frame self.root.mainloop() # loop for showing new message
class AdvisorGui: def __init__(self): self.root = Tk() self.root.geometry("600x400") self.imdb_id_entry = None self.num_of_neighbors_entry = None self.num_of_common_movies_entry = None self.log_area = None self.algorithm_nbr = IntVar() self.num_of_neighbors = 4 def start(self): self.init_id_placeholder() self.init_algorithms_selectors() self.init_num_of_neighbors_placeholder() self.init_num_of_movie_placeholder() self.init_info_area() self.init_start_button() self.root.mainloop() def init_id_placeholder(self): Label(self.root, text="Insert your IMDb ID: ").grid(row=0, column=0, sticky="W") default_id = IntVar() self.imdb_id_entry = Entry(textvariable=default_id) self.imdb_id_entry.grid(row=0, column=1, sticky="W") default_id.set(Config.main_user_id) def init_algorithms_selectors(self): Label(self.root, text="Select algorithm: ").grid(row=1, column=0, sticky="W") Radiobutton(self.root, text="User-User", variable=self.algorithm_nbr, value=1).grid(row=1, column=1, sticky="W") Radiobutton(self.root, text="Item-Item", variable=self.algorithm_nbr, value=0).grid(row=1, column=2, sticky="W") def init_num_of_neighbors_placeholder(self): Label(self.root, text="Set num of neighbors: ").grid(row=3, column=0, sticky="W") default_num = IntVar() self.num_of_neighbors_entry = Entry(textvariable=default_num) self.num_of_neighbors_entry.grid(row=3, column=1, sticky="W") default_num.set(Config.num_of_neighbors) def init_num_of_movie_placeholder(self): Label(self.root, text="Set num of movies you want: ").grid(row=4, column=0, sticky="W") default_num = IntVar() self.num_of_common_movies_entry = Entry(textvariable=default_num) self.num_of_common_movies_entry.grid(row=4, column=1, sticky="W") default_num.set(Config.num_of_movies) def init_info_area(self): self.log_area = ScrolledText(self.root, state='disabled', width=70, height=15) self.log_area.grid(column=0, row=5, sticky='w', columnspan=4, padx=12, pady=10) def init_start_button(self): Button(self.root, text="Find movies!", command=self.start_searching).grid(row=10, column=1) def start_searching(self): Config.num_of_neighbors = int(self.num_of_neighbors_entry.get()) Config.num_of_movies = int(self.num_of_common_movies_entry.get()) Config.algorithm_nbr = self.algorithm_nbr.get() Config.main_user_id = self.imdb_id_entry.get() UsersGenerator().update_user(one_update=True) if Config.algorithm_nbr == 1: best_movies = UserUserCF().get_best_movies() else: best_movies = ItemItemCF().get_best_movies() self.log_area.configure(state='normal') self.log_area.delete(1.0, END) self.log_area.insert(INSERT, best_movies) self.log_area.configure(state='disabled')
class BlinkyViewer(object): def __init__(self, window, video_source=0, industrial=False): self.window = window self.window.protocol("WM_DELETE_WINDOW", self.on_closing_callback) # overload "Exit" function for Menu file -> quit self.window.createcommand("exit", self.on_closing_callback) # window update delay self.delay = 33 # milliseconds # control self.checksat = False self.convert_bw = False self.convert_log = False # zoom size self.zoom_patch_size = 31 # open video feed self.video_source = video_source self.processor = ReadSpeedMonitor(monitor=True) # Choose the video source self.industrial = industrial self.vid = None self.start_video() # Keep track of the current frame self.current_frame = None # GEOMETRY # ############ # Here we want to compute the size of the different boxes screen_w = self.window.winfo_screenwidth() screen_h = self.window.winfo_screenheight() vid_h, vid_w = self.vid.shape # set the size of the video canvas self.vid_can_w = int(screen_w * 0.75) self.vid_can_h = int(self.vid_can_w * (vid_h / vid_w)) if self.vid_can_h > 0.9 * screen_h: self.vid_can_h = int(screen_h * 0.75) self.vid_can_w = int(self.vid_can_h * (vid_w / vid_h)) self.window_w = int(1.33 * self.vid_can_w) self.zoom_wh = int(0.33 * self.vid_can_w) self.fig_w = self.zoom_wh self.fig_h = self.vid_can_h - self.zoom_wh self.plist_w = self.zoom_wh self.plist_h = int(0.9 * screen_h) - self.vid_can_h self.buttons_w = int(self.vid_can_w / 3) self.buttons_h = int(0.9 * screen_h) - self.vid_can_h self.console_w = int(self.vid_can_w / 3) self.console_h = int(0.9 * screen_h) - self.vid_can_h self.info_w = self.vid_can_w - self.buttons_w - self.console_w self.info_h = int(0.9 * screen_h) - self.vid_can_h self.window_h = self.vid_can_h + self.plist_h self.window_w = int(1.03 * self.window_w) self.window_h = int(1.03 * self.window_h) self.window.geometry(f"{self.window_w}x{self.window_h}+0+0") # THE LEFT PANEL # ################## # create canvas of the right size self.canvas = Canvas(self.window, width=self.vid_can_w, height=self.vid_can_h) self.canvas.grid(row=0, column=0, rowspan=2, columnspan=4) self.canvas.bind("<Button-1>", self.mouse_callback) # The control frame with all buttons self.frame_control = Frame(self.window) self.frame_control.grid(row=2, column=0, sticky=N) # The Buttons self.frame_control_buttons = Frame(self.frame_control) self.frame_control_buttons.grid(row=0, column=0) self.btn_checksat = Button(self.frame_control_buttons, text="Sat", width=10, command=self.toggle_checksat) self.btn_checksat.grid(row=0, column=0) self.btn_convert_bw = Button(self.frame_control_buttons, text="BW", width=10, command=self.toggle_convert_bw) self.btn_convert_bw.grid(row=1, column=0) self.btn_convert_log = Button(self.frame_control_buttons, text="Log", width=10, command=self.toggle_convert_log) self.btn_convert_log.grid(row=2, column=0) # The processing part self.frame_control_proc = Frame(self.window) self.frame_control_proc.grid(row=2, column=1, sticky="n") self.label_frame = Label(self.frame_control_proc, text=f"Record:") self.label_frame.grid(row=0, column=0, sticky="nw") self.output_filename = DEFAULT_FILENAME self.label_file = Label(self.frame_control_proc, text=f"Output file:") self.label_file.grid(row=1, column=0, sticky="nw") self.entry_filename = Entry(self.frame_control_proc, width=20) self.entry_filename.insert(0, self.output_filename) self.entry_filename.grid(row=1, column=1, sticky="nw") self.label_boxsize = Label(self.frame_control_proc, text="Box size:") self.label_boxsize.grid(row=2, column=0, sticky="nw") self.entry_boxsize = Entry(self.frame_control_proc, width=3) self.entry_boxsize.insert(0, "1") self.entry_boxsize.grid(row=2, column=1, sticky="nw") self.btn_process = Button(self.frame_control_proc, text=PROCESS_LABEL, width=10, command=self.process_callback) self.btn_process.grid(row=3, column=0) self.canvas_info = InfoBox({ "fps_video": 0, "fps_proc": 0 }, self.window, width=self.info_w // 2, height=self.info_h) self.canvas_info.grid(row=2, column=2, sticky="n") # The Console self.canvas_console = Canvas(self.window, width=self.console_w, height=self.console_h) self.canvas_console.grid(row=2, column=3, sticky="ne") self.console = ScrolledText(self.canvas_console, state=DISABLED, borderwidth=2, relief="solid", width=60, height=12) self.console.grid(row=0, column=0, sticky="ne") # THE RIGHT PANEL # ################### # The pixel tracking figure self.pixel_tracker = PixelTracker( row=self.vid.height // 2, col=self.vid.width // 2, width=self.fig_w, height=self.fig_h, buffer_size=100, master=self.window, ) self.pixel_tracker.grid(row=0, column=4) # The zoom self.canvas_zoom = ZoomCanvas( self.zoom_patch_size, self.zoom_wh, self.vid.shape, self.window, ) self.canvas_zoom.grid(row=1, column=4) self.canvas_zoom.bind("<Button-1>", self.zoom_callback) # Notify pixel tracker of initial zoom selection self.pixel_tracker.add(self.canvas_zoom.selected, label=PREVIEW_LABEL) # Buttons to add and remove pixels self.frame_pix_btn = Frame(self.window) self.frame_pix_btn.grid(row=2, column=4) self.btn_add_pixel = Button( self.frame_pix_btn, text="Add Pixel", width=10, command=self.add_pixel_callback, ) self.btn_add_pixel.grid(row=0, column=0, sticky="nw") self.btn_drop_pixel = Button( self.frame_pix_btn, text="Drop Pixel", width=10, command=self.drop_pixel_callback, ) self.btn_drop_pixel.grid(row=0, column=1, sticky="nw") # The selected pixels list self.pixel_list = PixelList( self.frame_pix_btn, width=self.plist_w // 2, height=self.plist_h) #, list_width=40, list_height=10) self.pixel_list.grid(row=0, column=2, rowspan=2, sticky="nw") self.log("Welcome to BlinkyViewer") self.update() # Populate the window window.title("BlinkyViewer") self.window.mainloop() def start_video(self): # first stop the video if already running if self.vid is not None: self.vid.stop() if not self.industrial: self.vid = ThreadedVideoStream(self.video_source) else: if not icube_sdk_available: raise ValueError( "The Driver for the DN3V camera is not available") self.vid = icube_sdk.ICubeCamera(self.video_source, 200) self.vid.start() print("Video FPS:", self.vid.fps) def log(self, message): self.console.configure(state="normal") self.console.insert("end", "\n" + message) self.console.configure(state="disabled") self.console.see("end") def coord_canvas_to_video(self, col, row): """ Transforms from canvas to video coordinate """ c = int((col / self.vid_can_w) * self.vid.width) r = int((row / self.vid_can_h) * self.vid.height) return c, r def coord_video_to_canvas(self, col, row): """ Transforms from video to canvas coordinate """ c = int((col / self.vid.width) * self.vid_can_w) r = int((row / self.vid.height) * self.vid_can_h) return c, r def update(self): fps_proc = self.processor.fps if self.processor is not None else 0. self.canvas_info.update(fps_video=f"{self.vid.fps:6.2f}", fps_proc=f"{fps_proc:6.2f}") new_frame = None # Get a frame from the video source while self.vid.available: new_frame = np.array(self.vid.read(block=False), copy=False) if new_frame is None: break if self.processor is not None: self.processor.process(new_frame) self.pixel_tracker.push(new_frame) # If the video stream stopped, restart it if not self.vid.is_streaming: # if recording, stop if self.process_is_recording(): self.process_callback() # restart video self.start_video() self.log("Looping the video") if new_frame is not None: self.current_frame = new_frame if self.current_frame is not None: # shorten frame = self.current_frame self.pixel_tracker.update() if frame.ndim == 2: frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB) elif self.convert_bw: # convert to black and white frame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) # but convert back to color so that we # an add visual help in color frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2RGB) if self.checksat: sat_pix = np.where(frame == 255) sat_col = (0, 255, 0) for col in range(3): sat_pix[2][:] = col frame[sat_pix] = sat_col[col] if self.convert_log: tmp = frame.astype(np.float32) tmp = np.log2(tmp + 1) frame = (tmp * 255 / np.max(tmp)).astype(np.uint8) # create zoomed-in vignette self.canvas_zoom.update(frame) # Display the video frame frame = cv2.resize(frame, (self.vid_can_w, self.vid_can_h), interpolation=cv2.INTER_NEAREST) # indicate the location of selected pixels frame = self.pixel_tracker.mark( frame, conv_func=self.coord_video_to_canvas) frame = self.canvas_zoom.mark(frame, conv_func=self.coord_video_to_canvas) self.photo = PIL.ImageTk.PhotoImage( image=PIL.Image.fromarray(frame)) self.canvas.create_image(0, 0, image=self.photo, anchor=NW) self.window.after(self.delay, self.update) def toggle_checksat(self): self.checksat = toggle(self.checksat) def toggle_convert_bw(self): self.convert_bw = toggle(self.convert_bw) def toggle_convert_log(self): self.convert_log = toggle(self.convert_log) def add_pixel_callback(self): self.pixel_list.add(self.canvas_zoom.selected) self.pixel_tracker.add(self.canvas_zoom.selected) self.log( f"Selected pixel at {pixel_to_str(self.canvas_zoom.selected)}") def drop_pixel_callback(self): for plbl in self.pixel_list.curselection: self.pixel_tracker.remove(plbl) self.pixel_list.curdelete() self.log(f"Dropped pixel at {pixel_to_str(self.canvas_zoom.selected)}") def choose_file_callback(self): """ Called when pressing on the choose file button """ tmp_filename = asksaveasfilename(defaultextension=".blinky", initialdir=".") if tmp_filename != "": self.output_filename = tmp_filename self.label_file.config(text=f"Output file: {self.output_filename}") def process_is_recording(self): return self.btn_process.cget("text") == STOP_LABEL def process_is_not_recording(self): return self.btn_process.cget("text") == PROCESS_LABEL def process_callback(self): """ Called when pressing the "Process" button """ if self.process_is_not_recording(): bbox = self.entry_boxsize.get() pixel_list = self.pixel_list.get() self.output_filename = self.entry_filename.get() if self.output_filename == "": self.log("Please choose a filename") elif not bbox.isdigit(): self.log("The box size should be a number") elif len(pixel_list) == 0: self.log("No pixel has been selected for recording.") else: bbox = int(bbox) self.log("Start recording") # If the video is from a file, we restart if not isinstance(self.video_source, int): self.vid.stop() if self.processor is not None: self.processor.stop() self.processor = BoxCatcher(pixel_list, [bbox, bbox], monitor=True) # If the video is from a file, we restart if not isinstance(self.video_source, int): self.vid = ThreadedVideoStream(self.video_source) self.btn_process.config(text=STOP_LABEL) self.process_record_start_time = time.perf_counter() elif self.process_is_recording(): self.log("Stop recording") self.btn_process.config(text=PROCESS_LABEL) if isinstance(self.processor, BoxCatcher): # stop the processor self.processor.stop() recording_time = time.perf_counter( ) - self.process_record_start_time fps = self.processor.data.shape[0] / recording_time # save the result in blinky file new_file = BlinkyFile(self.processor.pixels, self.processor.data, fps) new_file.dump(self.output_filename) # Replace by the simple speed meter self.processor = ReadSpeedMonitor(monitor=True) else: raise ValueError("Invalid button state") def mouse_callback(self, event): """ Called when clicking on the main camera display """ col, row = self.coord_canvas_to_video(event.x, event.y) frame_shape = self.vid.shape if col >= frame_shape[1]: col = frame_shape[1] - 1 if row >= frame_shape[0]: row = frame_shape[0] - 1 self.canvas_zoom.set_origin((col, row)) self.pixel_tracker.add(self.canvas_zoom.selected, label=PREVIEW_LABEL) def zoom_callback(self, event): """ Called when clicking on the zoomed out vignette """ self.canvas_zoom.on_click(event) self.pixel_tracker.add( self.canvas_zoom.selected, label=PREVIEW_LABEL, ) def on_closing_callback(self): self.log("Goodbye!") self.vid.stop() if self.processor is not None: self.processor.stop() self.window.destroy()
class Book_gui(ttk.Frame): def __init__(self, master=None): ttk.Frame.__init__(self, master) self.data = Books_data(False) self.kurv = self.data.create_new_transaction() self.build_GUI() self.opdater_transaktions_tabel() self.opdater_tabel() def opdater_tabel(self): l = self.data.get_book_list(200) self.db_view.delete(*self.db_view.get_children()) for b in l: self.db_view.insert("", tk.END, values=(b.titel, b.forfatter, b.aarstal, b.get_rating(), b.id)) def opdater_transaktions_tabel(self): self.trans_view.delete(*self.trans_view.get_children()) for t in self.data.transactions: self.trans_view.insert("", tk.END, values=(t.id, t.get_amount(), t.status)) def on_trans_selected(self, event): t = self.trans_view.item(self.trans_view.focus())['values'] print(t) def on_book_selected(self, event): curItem = self.db_view.item(self.db_view.focus())['values'] if len(curItem) > 0: b = self.data.get_book(curItem[4]) self.lbl_titel.configure(text="Titel: {}".format(b.titel)) self.lbl_forfatter.configure(text="Forfatter: {}".format(b.forfatter)) self.can.delete("all") print(b.ratings[0]/sum(b.ratings)) self.can.create_line(5,195,5,5, arrow=tk.LAST) self.can.create_line(5,195,165,195, arrow=tk.LAST) for i in range(0,len(b.ratings)): self.can.create_rectangle(i*25 + 10,190,i*25 + 30,190-200*(b.ratings[i]/sum(b.ratings))) def slet_bog(self): def close(): dlg.destroy() dlg.update() def confirm(): curItem = self.db_view.item(self.db_view.focus())['values'] if len(curItem) > 0: b = Book() b.titel = curItem[0] b.forfatter = curItem[1] b.aarstal = curItem[2] b.id = int(curItem[4]) self.data.slet_bog(b) self.opdater_tabel() dlg.destroy() dlg.update() dlg = tk.Toplevel() lbl = tk.Label(dlg, text="Vil du slette bogen?") lbl.grid(column=0, row=0) but_annuller = ttk.Button(dlg, text="Fortryd", command=close) but_annuller.grid(column=0,row=1) but_ok = ttk.Button(dlg, text="Bekræft", command=confirm) but_ok.grid(column=1,row=1) def rediger_bog(self): def change_book(): b.titel = en_titel.get() b.forfatter = en_forfatter.get() self.data.update_book(b) b.give_rating(sc_rating.scale.get()) self.opdater_tabel() dlg.destroy() dlg.update() def close(): dlg.destroy() dlg.update() curItem = self.db_view.item(self.db_view.focus())['values'] if len(curItem) > 0: b = self.data.get_book(curItem[4]) dlg = tk.Toplevel() lbl_titel = ttk.Label(dlg, text='Titel') lbl_titel.grid(column =0, row = 0) en_titel = ttk.Entry(dlg) en_titel.grid(column=1, row=0) en_titel.delete(0, tk.END) en_titel.insert(0, b.titel) lbl_forfatter = ttk.Label(dlg, text='Forfatter') lbl_forfatter.grid(column =0, row = 1) en_forfatter = ttk.Entry(dlg) en_forfatter.grid(column=1, row=1) en_forfatter.delete(0, tk.END) en_forfatter.insert(0, b.forfatter) lbl_rating = ttk.Label(dlg, text='Rating') lbl_rating.grid(column =0, row = 2) sc_rating = ttk.LabeledScale(dlg, from_ = 0, to = 5) sc_rating.value = b.get_rating() sc_rating.grid(column=1, row=2) but_annuller = ttk.Button(dlg, text="Annuller", command=close) but_annuller.grid(column=1,row=3) but_ok = ttk.Button(dlg, text="Gem ændringer", command=change_book) but_ok.grid(column=0,row=3) def sorterTitel(self): self.data.sorter("titel") self.opdater_tabel() def sorterForfatter(self): self.data.sorter("forfatter") self.opdater_tabel() def sorterAarstal(self): self.data.sorter("aarstal") self.opdater_tabel() def sorterRating(self): self.data.sorter("rating") self.opdater_tabel() def log_text(self, msg): self.cons.configure(state='normal') self.cons.insert(tk.END, msg + '\n') self.cons.configure(state='disabled') # Autoscroll to the bottom self.cons.yview(tk.END) def ansaet(self): #(Opgave 4) #Denne funktion skal ansætte en ny Employee i butikken self.data.ansaet() self.update_ui() def fyr(self): #(Opgave 4) #Denne funktion skal fyre en af de ansatte self.data.fyr() self.update_ui() def udbetal_loen(self): l = self.data.udbetal_loen() self.log_text("Der blev udbetalt {} i løn".format(l)) self.update_ui() self.after(30000, self.udbetal_loen) def simulate_customer(self): #Udsalg? rabat = self.sc_tilbud.scale.get() * 0.01 amount = int(rabat * randint(100,200) + randint(0,int(500*sqrt(len(self.data.ansatte))))) self.data.indtaegt(amount) self.log_text("En kunde købte for {}".format(amount)) self.update_ui() #Hvis der er udsalg, kommer der hurtigere nye kunder! self.after(int(5000*rabat), self.simulate_customer) def update_ui(self): self.lblAnsatte.configure(text="Antal ansatte: {}".format(len(self.data.ansatte))) self.lblMoney.configure(text="Pengebeholdning: {}".format(self.data.money)) def tilfoj_kurv(self): curItem = self.db_view.item(self.db_view.focus())['values'] if len(curItem) > 0: #Tilføj id til kurven self.kurv.add_item(curItem[4]) self.kurv_text.configure(state='normal') self.kurv_text.delete('1.0', tk.END) for i in self.kurv.items: b = self.data.get_book(i) self.kurv_text.insert(tk.END, b.titel + ',' + str(b.pris) + '\n') self.kurv_text.configure(state='disabled') # Autoscroll to the bottom self.kurv_text.yview(tk.END) self.opdater_transaktions_tabel() def koeb(self): pris = self.kurv.get_amount() self.data.indtaegt(pris) self.kurv.finalize() self.log_text("En kunde fyldte sin kurv for {} kr.".format(pris)) self.kurv_text.configure(state='normal') self.kurv_text.delete('1.0', tk.END) self.kurv_text.configure(state='disabled') self.kurv = self.data.create_new_transaction() self.opdater_transaktions_tabel() def build_GUI(self): self.tabs = ttk.Notebook(self) bog_fane = ttk.Frame(self.tabs) sim_fane = ttk.Frame(self.tabs) self.tabs.add(bog_fane, text='Bøger') self.tabs.add(sim_fane, text='Simulering') right_frame = ttk.Frame(bog_fane) top_frame = ttk.Frame(right_frame) data_frame = ttk.Frame(right_frame) knap_frame = ttk.Frame(bog_fane) self.edit_button = ttk.Button(knap_frame, text="Rediger bog", command=self.rediger_bog) self.edit_button.pack(side=tk.TOP) self.del_button = ttk.Button(knap_frame, text="Slet bog", command=self.slet_bog) self.del_button.pack(side=tk.TOP) self.add_button = ttk.Button(knap_frame, text="Tilføj til kurv", command=self.tilfoj_kurv) self.add_button.pack(side=tk.TOP) self.buy_button = ttk.Button(knap_frame, text="Køb", command=self.koeb) self.buy_button.pack(side=tk.TOP) self.kurv_text = ScrolledText(knap_frame, state='disabled', width=20,height=5) self.kurv_text.pack(side=tk.TOP) self.kurv_text.configure(font='TkFixedFont') self.cons = ScrolledText(sim_fane, state='disabled', height=12) self.cons.pack(side = tk.TOP) self.cons.configure(font='TkFixedFont') self.after(1000, self.simulate_customer) butAnsaet = ttk.Button(sim_fane, text="Ansæt en person", command=self.ansaet) butAnsaet.pack(side=tk.TOP) butFyr = ttk.Button(sim_fane, text="Fyr en person", command=self.fyr) butFyr.pack(side=tk.TOP) self.after(3000, self.udbetal_loen) self.lblMoney = ttk.Label(sim_fane, text="Pengebeholdning: {}".format(self.data.money)) self.lblMoney.pack(side=tk.TOP) self.lblAnsatte = ttk.Label(sim_fane, text="Antal ansatte: {}".format(len(self.data.ansatte))) self.lblAnsatte.pack(side=tk.TOP) self.sc_tilbud = ttk.LabeledScale (sim_fane,from_=50,to=110) self.sc_tilbud.pack(side=tk.TOP) self.db_view = ttk.Treeview(data_frame, column=("column1", "column2", "column3", "column4", "column5"), show='headings') self.db_view.bind("<ButtonRelease-1>", self.on_book_selected) self.db_view.heading("#1", text="Titel", command=self.sorterTitel) self.db_view.column("#1",minwidth=0,width=150, stretch=tk.NO) self.db_view.heading("#2", text="Forfatter", command=self.sorterForfatter) self.db_view.column("#2",minwidth=0,width=150, stretch=tk.NO) self.db_view.heading("#3", text="Årstal", command=self.sorterAarstal) self.db_view.column("#3",minwidth=0,width=80, stretch=tk.NO) self.db_view.heading("#4", text="Rating", command=self.sorterRating) self.db_view.column("#4",minwidth=0,width=80, stretch=tk.NO) self.db_view.heading("#5", text="id") #Læg mærke til at kolonne 5 ikke bliver vist. #Vi kan stadig finde id på den bog der er valgt, #men brugeren kan ikke se id. self.db_view["displaycolumns"]=("column1", "column2", "column3", "column4") ysb = ttk.Scrollbar(data_frame, command=self.db_view.yview, orient=tk.VERTICAL) self.db_view.configure(yscrollcommand=ysb.set) self.db_view.pack(side = tk.TOP, fill=tk.BOTH) self.trans_view = ttk.Treeview(knap_frame, column=("column1", "column2", "column3"), show='headings') self.trans_view.bind("<ButtonRelease-1>", self.on_trans_selected) self.trans_view.heading("#1", text="id") self.trans_view.column("#1",minwidth=0,width=20, stretch=tk.NO) self.trans_view.heading("#2", text="Pris") self.trans_view.column("#2",minwidth=0,width=30, stretch=tk.NO) self.trans_view.heading("#3", text="Status") self.trans_view.column("#3",minwidth=0,width=80, stretch=tk.NO) self.trans_view["displaycolumns"]=("column1", "column2", "column3") ysb = ttk.Scrollbar(data_frame, command=self.trans_view.yview, orient=tk.VERTICAL) self.trans_view.configure(yscrollcommand=ysb.set) self.trans_view.pack(side = tk.TOP, fill=tk.BOTH) #Top Frame self.can = tk.Canvas(top_frame, width=200, height=200) self.can.grid(column=1, row=0, rowspan=2) self.lbl_titel = ttk.Label(top_frame, text='Titel') self.lbl_forfatter = ttk.Label(top_frame, text='Forfatter') self.lbl_titel.grid(column=0, row=0) self.lbl_forfatter.grid(column=0, row=1) top_frame.pack(side=tk.TOP) data_frame.pack(side = tk.TOP) knap_frame.pack(side = tk.LEFT, fill=tk.Y) right_frame.pack(side=tk.RIGHT, fill=tk.Y) self.tabs.pack(expand=1, fill="both") self.pack() self.after(10000, self.udbetal_loen) self.after(1000, self.simulate_customer)
def __init__(self): # 打包图片资源 # 详情参考:https://www.pythonf.cn/read/49736 # 详情参考:https://www.cnblogs.com/darcymei/p/9397173.html def getPath(filename): # 方法一(如果要将资源文件打包到app中,使用此法) bundle_dir = getattr(sys, '_MEIPASS', os.path.abspath(os.path.dirname(__file__))) path = os.path.join(bundle_dir, filename) # 方法二获取路径可以,但如果打包资源好像不行。 # path = os.path.join(os.path.dirname(sys.argv[0]), filename) return path # 界面 window = tk.Tk() window.title("翻译") window.geometry("800x500") window.resizable(0, 0) # 设置窗口大小不可变 window.configure(bg='SkyBlue') str = '注意:原文中不允许出现连续符号,否则无法后续翻译' lab1 = tk.Label(window, text=str, font=('Arial', 10), bg='SkyBlue') lab1.place(x=10, y=465) lab2 = tk.Label(window, text="版本号:3.0", font=('Roman', 15), bg='SkyBlue') lab2.place(x=650, y=465) # 菜单 # 菜单功能 def save_as(): a1 = tkinter.filedialog.asksaveasfilename() #返回文件名 with open(a, 'w') as f: f.write(t1.get('0.0', 'end') + '\n' + t2.get('0.0', 'end')) a2 = '' # 保存路径 def change_path(): nonlocal a2 # 函数内改变函数外的值 a2 = tkinter.filedialog.askdirectory() #返回目录名 def save_translation(): name = tkinter.simpledialog.askstring(title='保存', prompt='请输入保存文件名:', initialvalue='译文.txt') with open(a2 + name, 'w') as f: f.write(t2.get('0.0', 'end')) def save_All(): name = tkinter.simpledialog.askstring(title='保存', prompt='请输入保存文件名:', initialvalue='译文.txt') with open(a2 + name, 'w') as f: f.write(t1.get('0.0', 'end') + '\n' + t2.get('0.0', 'end')) datalist1 = [] # 储存记录 datalist2 = [] i = -1 # 标记迭代 def go_back(): lenth = len(datalist1) if lenth != 0: nonlocal i if i == lenth - 2: i = -1 i += -1 t1.delete('0.0', 'end') t2.delete('0.0', 'end') t1.insert('insert', datalist1[i]) t2.insert('insert', datalist2[i]) if i == -lenth or i == 0: i = -lenth + 1 logo2 = tk.PhotoImage(file=getPath("image\\last.png")) b3 = tk.Button(window, image=logo2, width=50, height=30, command=go_back) b3.place(x=620, y=11) def go_up(): lenth = len(datalist1) nonlocal i if lenth != 0: if i == -lenth + 1: i = 0 i += 1 t1.delete('0.0', 'end') t2.delete('0.0', 'end') t1.insert('insert', datalist1[i]) t2.insert('insert', datalist2[i]) if i == lenth - 1 or i == -1: i = lenth - 2 logo3 = tk.PhotoImage(file=getPath("image\\next.png")) b4 = tk.Button(window, image=logo3, width=50, height=30, command=go_up) b4.place(x=720, y=10) def clear_cache(): nonlocal datalist1, datalist2 del datalist1[:] del datalist2[:] # 创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方 menubar = tk.Menu(window) # 创建一个File菜单项(默认不下拉,下拉内容包括Save,Exit功能项) # 将tearoff设置为1以后,就是表明这个菜单是可以独立出来的,如果是0的话就不可以独立出来 filemenu = tk.Menu(menubar, tearoff=0) Editmenu = tk.Menu(menubar, tearoff=0) # 将上面定义的空菜单命名为File,放在菜单栏中,就是装入那个容器中 menubar.add_cascade(label='File', menu=filemenu) menubar.add_cascade(label='Edit', menu=Editmenu) # 创建第二级菜单,即菜单项里面的菜单 submenu = tk.Menu(filemenu, tearoff=0) # 和上面定义菜单一样,不过此处实在File上创建一个空的菜单 # 给放入的菜单submenu命名为save filemenu.add_cascade(label='保存', menu=submenu, underline=0) # 这里和上面创建原理也一样,在save菜单项中加入一个小菜单命令Submenu_1 submenu.add_command(label='保存译文', command=save_translation) submenu.add_command(label='保存全部', command=save_All) filemenu.add_separator() # 添加一条分隔线 # 用tkinter里面自带的quit()函数 filemenu.add_cascade(label='另存为', command=save_as) filemenu.add_cascade( label='联系作者', command=lambda: tkinter.messagebox.showinfo( '联系', '有什么建议请和作者联系:' + '\n' + 'QQ:2632959526(如一)' + '\n' + '^_^'.center(30))) verstr = '版本1.0:内置老版本有道翻译'+'\n'\ '版本2.0:优化翻译,更新新版本有道翻译'+'\n'\ '版本3.0:新添清除缓存,将前进后退设置为按钮放在界面上,优化界面,加入logo'+'\n' filemenu.add_cascade( label='版本详情', command=lambda: tkinter.messagebox.showinfo('版本变动', verstr)) filemenu.add_command(label='退出', command=window.quit) Editmenu.add_cascade(label='更改默认路径', command=change_path) Editmenu.add_cascade(label='清除缓存', command=clear_cache) window.config(menu=menubar) # 文本框 t1 = ScrolledText(window, height=30, width=50, bg='LightCyan') t1.pack(side='left') t2 = ScrolledText(window, height=30, width=50, bg='LightCyan') t2.pack(side='right') t2.configure(state='disabled') # 只读 lab3 = tk.Label(window, text="logo", font=('Arial', 7), bg='SkyBlue') lab3.place(x=770, y=450) # 说明图片位置,并导入图片到画布上 canvas = tk.Canvas(window, width=30, height=30) image_file = tk.PhotoImage(file=getPath('image\\bg1.gif')) image = canvas.create_image(100, 100, anchor='se', image=image_file) canvas.place(x=765, y=465) # 翻译 def trat(): t2.delete('0.0', 'end') # 将译文清除 t2.configure(state='normal') # 可写 var = t1.get('0.0', 'end') # 无论是谷歌翻译或者是有道翻译我都发现了一个问题,那就是在中译英的过程中,如果碰到中文的句号或者感叹号等使段落结束的标点符号,那么就会切分翻译,最后以元组返回, var1 = var.replace('\n', ' ').replace('。', '.').replace('!', '.') content = '' # 获取翻译内容 # 调用翻译函数 y = Youdao(var1) y.get_result() content = target['translateResult'][0][0]['tgt'] t2.insert('insert', content) datalist1.append(t1.get('0.0', 'end')) datalist2.append(t2.get('0.0', 'end')) count = len(datalist1) logo1 = tk.PhotoImage(file=getPath("image\\translate.png")) b1 = tk.Button(window, image=logo1, width=85, height=35, command=trat) b1.place(x=0, y=10) # 重置 def reset(): print(a2) flag = tk.messagebox.askquestion(title='重置', message='是否重置?') if flag == 'yes': t1.delete('0.0', 'end') t2.delete('0.0', 'end') t2.configure(state='disabled') # 只读 logo4 = tk.PhotoImage(file=getPath("image\\reset.png")) b2 = tk.Button(window, image=logo4, width=40, height=30, command=reset) #b2 = tk.Button(window, text='重置', bg='red', font=('Arial', 12), width=5, height=1, command=reset) b2.place(x=380, y=410) window.mainloop()
class GUI: def __init__(self): self.root = tk.Tk() self.root.minsize(300, 300) self.root.geometry('1000x700') #Initialize variables self.frame_index = 0 self.frame_count = float('NaN') self.text_available = True self.data = [] #Set up view window self.tabbed_views = ttk.Notebook(master=self.root) self.hex_frame = tk.Frame(master=self.tabbed_views) self.hex_window = ScrolledText(master=self.hex_frame, wrap=tk.WORD)#tk.Text(master=self.hex_frame, wrap=tk.WORD) #self.hex_scroll = tk.Scrollbar(master=self.hex_frame, command=self.hex_window.yview()) self.text_frame = tk.Frame(master=self.tabbed_views) self.text_window = ScrolledText(master=self.text_frame) #self.text_scroll = tk.Scrollbar(master=self.text_frame, command=self.text_window.yview()) self.tabbed_views.add(self.hex_frame, text='Hex') self.tabbed_views.add(self.text_frame, text='Text') self.tab_id = self.tabbed_views.select() self.current_tab = self.hex_window # Should point to a selected tab in ttk. #Set up menus self.main_menu = tk.Menu(master=self.root) self.file_menu = tk.Menu(master=self.main_menu) self.file_menu.add_command(label='Load File', command=self.load_file) self.file_menu.add_command(label="Save file", command=self.save_file) self.main_menu.add_cascade(label='File', menu=self.file_menu) #Bind events self.hex_window.bind('<Visibility>', self._switch_tab) self.text_window.bind('<Visibility>', self._switch_tab) #Set up labels self.byte_number_label = tk.Label(self.root) self.error_label = tk.Label(master=self.root, foreground=config.get('PALETTE', 'error_foreground')) self.frame_count_label = tk.Label(text="{} of {}".format(self.frame_index, self.frame_count)) #Set up buttons self.nav_button_frame = tk.Frame() self.previous_frame_btn = tk.Button(master=self.nav_button_frame, text="Previous frame", command=self._print_previous_frame) self.next_frame_btn = tk.Button(master=self.nav_button_frame, text='next frame', command=self._print_next_frame) #Pack and position self.root.config(menu=self.main_menu) self.next_frame_btn.grid(row=0, column=1) self.previous_frame_btn.grid(row=0, column=0) self.frame_count_label.pack() self.nav_button_frame.pack() self.error_label.pack() self.tabbed_views.pack(fill=tk.BOTH, expand=1) self.text_window.pack(fill=tk.BOTH, expand=1) self.hex_window.pack(fill=tk.BOTH, expand=1) self.byte_number_label.pack() def _switch_tab(self, event): try: self._update_data() self.tab_id = self.tabbed_views.select() self.current_tab = event.widget self._update_view() except ValueError: self.tabbed_views.select(self.tab_id) self.report_input_error() return def _update_view(self): if not self.data: "Early exit if no data is present" return #Clear editor window self.frame_count_label.configure(text="{} of {}".format(self.frame_index+1, self.frame_count)) self.current_tab.delete('0.0', tk.END) #Insert new content output = None if self.current_tab is self.hex_window: output = self._hexify_output(self.data[self.frame_index]) elif self.current_tab is self.text_window: output = self._textify_output(self.data[self.frame_index]) if not self.text_available: self.text_window.configure(foreground=config.get("PALETTE", "error_foreground"), wrap=tk.WORD) self.error_label.configure(text="Warning, no text representation available. Hex displayed instead.") else: self.text_window.configure(foreground=config.get('PALETTE', 'standard_foreground'), wrap=tk.CHAR) self.error_label.configure(text="") else: raise RuntimeError self.current_tab.insert(tk.END, output) def _update_data(self): try: self.data[self.frame_index] = self._validate_and_retrieve_data() except IndexError: # No data is previously loaded, assume new data is entered self.data.append(self._validate_and_retrieve_data()) def _validate_and_retrieve_data(self): if self.current_tab is self.hex_window or not self.text_available: return self._validate_hex_data() else: return self._validate_string_data() def report_input_error(self): """Raises an alert window to inform the user that there is erroneous input""" showwarning('Warning', "Invalid input detected. Please check that everything is correct before proceeding") def _print_next_frame(self): #Check so data is loaded, Do nothing if theres no data if not self.data: return #Save changes made in editor to data. try: self.data[self.frame_index] = self._validate_and_retrieve_data() except ValueError as error: self.report_input_error() return #Increment the frame 'pointer' self.frame_index += 1 #Check if the pointer is past the end and if so reset to begining if self.frame_index > len(self.data)-1: self.frame_index -= len(self.data) self._update_view() def _print_previous_frame(self): # Check so data is loaded, Do nothing if theres no data if not self.data: return #Save changes made in editor. try: self.data[self.frame_index] = self._validate_and_retrieve_data() except ValueError as error: self.report_input_error() return self.frame_index -= 1 if self.frame_index < 0: #If we move past the first frame, load the last instead self.frame_index = len(self.data)-1 self._update_view() def load_file(self): filename = filedialog.askopenfilename(initialdir=os.curdir, filetypes=(("All files", "*.*"),("Executable","*.exe"),)) if filename: self.file_cursor_pos = 0 self.current_tab.delete('0.0', tk.END) self.load_file_data(filename) self.frame_count_label.config(text='{} of {}'.format(self.frame_index,self.frame_count)) self._update_view() def load_file_data(self, filename: str): buffer_size = int(config.get(option='buffer_size', section='FILES', fallback=8192)) print(buffer_size) self.data = [] self.frame_index = 0 with open(filename, mode='rb') as file: while True: chunk = file.read(buffer_size) if chunk: self.data.append(chunk) else: break self.frame_count = len(self.data) self.text_available = True if self.frame_count == 0: #Emty file was read. Append empty bytes object to data self.data.append(bytes('')) #for index in range(0, self.frame_count): # self.data[index] = ' '.join([hexify(char) for char in self.data[index]]) return self.data def _hexify_output(self, data): return ' '.join([hexify(char) for char in data]) def _textify_output(self, data): """Returns the string representation of input data if it can be decoded. Falls back to hexify_output if an error occurs. """ try: self.text_available = True return data.decode(STRING_ENCODING) except Exception: self.text_available = False return self._hexify_output(data) def save_file(self): try: self.data[self.frame_index] = self._validate_and_retrieve_data() except ValueError as error: self.report_input_error() return except IndexError: #No data exists in current frame. Append to data self.data.append(self._validate_and_retrieve_data()) filename = filedialog.asksaveasfilename(initialdir=os.curdir) if filename: self._write_file(filename) def _validate_hex_data(self): """Validates that data retrieved from window is valid hex-data by converting it to bytes. Returns the data if it is valid""" data = self.current_tab.get('0.0', tk.END)[:-1] #This returns a newline character at the end, slice to remove return bytes.fromhex(data) def _validate_string_data(self): data = self.current_tab.get('0.0', tk.END)[:-1] return bytes(data, STRING_ENCODING) def _write_file(self, filename): with open(filename, mode='wb') as file: file.write(b''.join(self.data)) def run(self): self.root.mainloop()
class Window(tk.Tk): """Show a Tk window with scrollable text from stdin. Checks stdin for a new line every one millisecond. If the line starts with a \`#', the rest of the line is used as a new title for the window. Otherwise, the line is appended to the textfield, including the newline character. """ def __init__(self): """Initialize the window. Creates a frame, holding a srollable textfield. Finally reading from stdin is initiated. """ super().__init__() self.font = Font(size=20) self.title('State Machine') self.frame = tk.Frame(self) self.frame.pack(fill='both', expand=True) self.text = ScrolledText(self.frame, wrap='word', font=self.font) self.text.configure(state='disabled') self.text.pack(side='top', fill='both', expand=True) self.text.bind('<1>', lambda ev: self.text.focus_set()) self.geometry('500x400') self.after(1, self.do_read) def do_read(self): """Try to read a line from stdin.""" line = sys.stdin.readline() if line is not None and line != '': self.process_line(line) self.after(1, self.do_read) def process_line(self, line): """Process a line for debug display. If a line starts with \`#', change the window's title. Otherwise, write the line to the textbox. Arguments: line: the line to be processed, including newline character """ if line[0] == '#': self.title(line[1:].rstrip('\n')) else: self.write_text(line) def write_text(self, text): """Write text to the end of the textfield. Arguments: text: the text to be added to the textfield. """ self.text.configure(state='normal') self.text.insert('end', text) # Only autoscroll when at end. if self.text.vbar.get()[1] == 1.0: self.text.pos = self.text.index('end - 1 char') self.text.yview_pickplace('end') self.text.configure(state='disabled')
class Consulta_GUI(): def __init__(self, janela): def sair(): driver.quit() self.janela.destroy() self.janela = janela self.menubar = Menu(self.janela) self.janela.config(menu=self.menubar) self.Menu_1 = Menu(self.menubar) self.Menu_2 = Menu(self.menubar) self.Menu_3 = Menu(self.menubar) self.menubar.add_cascade(label='Opcões', menu=self.Menu_1) self.menubar.add_cascade(label='Ajuda', menu=self.Menu_3) self.Menu_1.add_command(label="Sair", command=sair), self.cancelou = BooleanVar() self.cancelou.set(False) self.tipo = IntVar() self.tipo.set(1) def mudartipo(x): self.tipo.set(x) self.r1 = Radiobutton(self.janela, text="Placa ", value=1, variable=self.tipo, command=lambda: mudartipo(1)).place(x=65, y=10, width=70, height=25) self.r2 = Radiobutton(self.janela, text="Chassi", value=2, variable=self.tipo, command=lambda: mudartipo(2)).place(x=140, y=10, width=70, height=25) self.LabelDados = Label(self.janela, text='Dados:', fg="#000").place(x=10, y=10, width=50, height=25) self.Entrada_Dados = ScrolledText(self.janela, fg="#000") self.Entrada_Dados.place(x=10, y=36, width=630, height=190) self.Saida_Dados = ScrolledText(self.janela, fg="#000", wrap=NONE) self.xbar = Scrollbar(orient='horizontal', command=self.Saida_Dados.xview) self.LabelResultado = Label(self.janela, text='Resultado da Pesquisa:', fg="#000").place(x=10, y=225, width=120, height=25) self.Saida_Dados.place(x=10, y=252, width=780, height=237) self.Saida_Dados.configure(xscrollcommand=self.xbar.set) self.xbar.place(x=10, y=490, width=780, height=15) self.Btn_Consultar = Button(self.janela, text="Processar", bg='#228B22', fg='#fff', command=self.Atualizar).place(x=650, y=40, width=120, height=25) self.Btn_Cancelar = Button(self.janela, text="Cancelar", bg='red', fg='#fff', command=self.Cancelar).place(x=650, y=75, width=120, height=25) self.Btn_LimparDados = Button(self.janela, text="Limpar Dados", bg='blue', fg='#fff', command=self.LimparDados).place( x=650, y=110, width=120, height=25) self.Btn_LimparResultado = Button(self.janela, bg='#B0C4DE', fg='#fff', text="Limpar Resultado", command=self.LimparResultado).place( x=650, y=145, width=120, height=25) self.Btn_LimparTudo = Button(self.janela, bg='yellow', fg='black', text="Limpar Tudo", command=self.LimparTudo).place(x=650, y=180, width=120, height=25) self.BarraStatus = Label(self.janela, text='Informe a Placa ou chassi...', fg="#000") self.BarraStatus.place(x=10, y=510, height=15) self.BarraStatusVersao = Label(self.janela, text='versão: ' + versao + ' - ' + dataversao, fg="#000") self.BarraStatusVersao.place(x=650, y=510, height=15) self.PlacaChassi = '' janela.mainloop() def LimparDados(self): self.Entrada_Dados.delete('1.0', END) def LimparResultado(self): self.Saida_Dados.delete('1.0', END) def LimparTudo(self): self.Entrada_Dados.delete('1.0', END) self.Saida_Dados.delete('1.0', END) def Cancelar(self): self.cancelou.set(True) def Pesquisar(self): driver.get( 'https://portal.sesp.mt.gov.br/portaldaseguranca/pages/veiculo/consultaVeiculoRoubado.seam' ) #time.sleep(0.5) # Let the user actually see something! if (self.tipo.get() == 1): driver.find_element_by_css_selector( "#consultaVeiculo\:busca\:veiculoOpcao [value='PLACA']").click( ) time.sleep(0.1) oplaca = driver.find_element_by_css_selector( "#consultaVeiculo\\:j_id46\\:placa") oplaca.send_keys(self.PlacaChassi) else: ochassi = driver.find_element_by_css_selector( "#consultaVeiculo\:chassi\:descricao") ochassi.send_keys(self.PlacaChassi) driver.find_element_by_css_selector( "#consultaVeiculo\:consultar").click() strMarcaModelo = '' strPlaca = '' strAnos = '' strCor = '' strChassi = '' strMensagem = '' time.sleep(0.5) # marca/modelo try: elemento = driver.find_element_by_xpath( '//*[@id="situacao-veiculo"]/div[2]/ul/li[2]') strMarcaModelo = elemento.get_attribute("innerText") pattern = re.compile('\n', re.MULTILINE) strMarcaModelo = pattern.sub('', strMarcaModelo) pattern = re.compile('Marca\/Modelo:', re.MULTILINE) strMarcaModelo = pattern.sub('', strMarcaModelo) except: pass # placa try: elemento = driver.find_element_by_xpath( '//*[@id="situacao-veiculo"]/div[2]/ul/li[3]') strPlaca = elemento.get_attribute("innerText") pattern = re.compile('\n', re.MULTILINE) strPlaca = pattern.sub('', strPlaca) pattern = re.compile('Placa:', re.MULTILINE) strPlaca = pattern.sub('', strPlaca) except: pass # anos try: elemento = driver.find_element_by_xpath( '//*[@id="situacao-veiculo"]/div[2]/ul/li[4]') strAnos = elemento.get_attribute("innerText") pattern = re.compile('\n', re.MULTILINE) strAnos = pattern.sub('', strAnos) pattern = re.compile('Ano:', re.MULTILINE) strAnos = pattern.sub('', strAnos) pattern = re.compile(' \/ ', re.MULTILINE) strAnos = pattern.sub('\t', strAnos) except: pass # cor try: elemento = driver.find_element_by_xpath( '//*[@id="situacao-veiculo"]/div[2]/ul/li[5]') strCor = elemento.get_attribute("innerText") pattern = re.compile('\n', re.MULTILINE) strCor = pattern.sub('', strCor) pattern = re.compile('Cor:', re.MULTILINE) strCor = pattern.sub('', strCor) except: pass # chassi try: elemento = driver.find_element_by_xpath( '//*[@id="situacao-veiculo"]/div[2]/ul/li[6]') strChassi = elemento.get_attribute("innerText") pattern = re.compile('\n', re.MULTILINE) strChassi = pattern.sub('', strChassi) pattern = re.compile('Chassi:', re.MULTILINE) strChassi = pattern.sub('', strChassi) except: pass # REGISTRO NAO ENCONTRADO try: elemento = driver.find_element_by_xpath( '//*[@id="gritter-item-1"]/div/div[1]/span') strMensagem = elemento.get_attribute("innerText") except: pass # REGISTRO NAO ENCONTRADO try: elemento = driver.find_element_by_xpath( '//*[@id="consultaVeiculo:statusVeiculo"]') if strMensagem == '': strMensagem = 'Veículo Roubado/Furtado: ' + elemento.get_attribute( "innerText") else: strMensagem = strMensagem + ' / Veículo Roubado/Furtado: ' + elemento.get_attribute( "innerText") except: pass self.Saida_Dados.insert( END, self.PlacaChassi + '\t' + '=>\t' + strPlaca + '\t' + strMarcaModelo + '\t' + strAnos + '\t' + strCor + '\t' + strChassi + '\t' + strMensagem + '\n') def Atualizar(self): #self.Btn_Consultar.configure(state = 'DISABLED') self.cancelou.set(False) th = threading.Thread(target=self.Processar) th.start() #self.Btn_Consultar.configure(state = 'NORMAL') def Processar(self): dados = self.Entrada_Dados.get('1.0', END) valores = dados.split('\n') # remove itens em branco valores = [i for i in valores if i] try: i = 0 for x in valores: if self.cancelou.get() == True: break i += 1 self.BarraStatus.configure(text='Processando...' + str(i) + ' de ' + str(len(valores)) + ': ' + x) x = x.replace(' ', '') x = x.replace('-', '') self.PlacaChassi = x try: self.Pesquisar() except: self.Pesquisar() if self.cancelou.get() == True: self.BarraStatus.configure(text='Cancelado pelo usuário') else: self.BarraStatus.configure(text='Informe Placa ou Chassi...') except Exception as e: self.BarraStatus.configure(text="Favor reprocessar") messagebox.showinfo("ALLRisk - Consulta Placa MT - erro", e)
create=open("note"+str(lastfound+1)+".txt","w") create.close() to_open.append("note"+str(lastfound+1)+".txt") else: #Stupid hacky bug fix for when it's not the first file create=open("note0.txt","w") create.close() for i in to_open: window.append(Tk()) #Create a new window for each note for i in window: textbox=ScrolledText(i) #Set coloring i.configure(background="#FFFFA0") textbox.configure(background="#FFFFA0") textbox.pack() textboxes.append(textbox) #Make a list of all the textbook objects for i in range(len(window)): window[i].wm_title("note "+str(i)) #Set the title to_open[i] with open(to_open[i],"r") as to_read: for iii in to_read: textbox.insert("0.0",iii) def main(): ii=0 for i in window: textbox=textboxes[ii]
class ChatClientGUI(Frame): def __init__(self, master): Frame.__init__(self, master) self.master = master self.master.protocol("WM_DELETE_WINDOW", self.close_window) self.master.title("Chat Client GUI") self.pack(fill="both", expand=True) self.font = font.Font(font=("Helvetica Neue", 12)) self.background_color = "#333333" self.box_background_color = "#655F5F" self.text_color = "#FFFFFF" # Build the chat self.chat_frame = Frame(self) self.chat_frame.pack(fill="both", expand=True, anchor="nw") self.chat_frame.configure(bg=self.background_color) self.chat_box = ScrolledText(self.chat_frame, font=self.font, wrap="word") self.chat_box.configure(state="disabled", bg=self.box_background_color, fg=self.text_color) self.chat_box.pack(side="left", fill="both", expand=True, padx=5, pady=5, anchor="nw") # Users list self.users_label = Label(self.chat_frame, text="Users in Channel", bg=self.background_color, fg=self.text_color, font=font.Font(font=("Helvetica Neue", 12, "bold"))) self.users_label.pack(side="top", anchor="n") self.users_box = ScrolledText(self.chat_frame, font=self.font, width=25) self.users_box.configure(state="disabled", bg=self.box_background_color, fg=self.text_color) self.users_box.pack(side="right", fill="y", padx=5, pady=5, anchor="ne") # Build the input section self.input_frame = Frame(self, height=1) self.input_frame.pack(side="bottom", fill="x", anchor="sw") self.input_frame.configure(bg=self.background_color) self.chat_input = Entry(self.input_frame, font=self.font) self.chat_input.configure(bg=self.box_background_color, fg=self.text_color, insertbackground=self.text_color) self.chat_input.pack(side="left", fill="x", expand=True, padx=5, pady=5) self.chat_input.bind("<Return>", self.send_message_on_return) self.send_button = Button(self.input_frame, text="Send", width=10, command=self.send_message, bg=self.box_background_color, fg=self.text_color) self.send_button.pack(side="right", fill="x", padx=5, pady=5) # Update the window and then set the minsize self.master.update() self.master.minsize(self.master.winfo_width(), self.master.winfo_height()) # Non tkinter class variables self.instance = None self.running = True # Spawn threads used for chat client and channel users fetch self.chat_client_thread = Thread(target=self.start_chat_client) self.chat_client_thread.start() self.users_fetch = Thread(target=self.get_users) self.users_fetch.start() def send_message(self): message = self.chat_input.get() self.instance.send_privmsg(message) self.write_to_chatbox(message, self.instance.client_username) self.chat_input.delete(0, "end") def send_message_on_return(self, event): # Forward to the send message handler (to get around needing the "event" parameter) self.send_message() del event def write_to_chatbox(self, msg, username): date = f"[{datetime.now():%I:%M:%S}] " formatted_message = f"{date} {username}: {msg}" self.chat_box.configure(state="normal") self.chat_box.insert("end", formatted_message + "\n") self.chat_box.see("end") self.chat_box.configure(state="disabled") def write_many(self, msg, times): for _ in range(times): self.write_to_chatbox(msg) def start_chat_client(self): with open("settings.json", "r") as r: settings = json.load(r) username = settings["username"] token = settings["token"] channel = settings["channel"] server = settings["server"] port = settings["port"] self.instance = IRCClient(username, token, channel, server, port, settings, self) self.instance.start() def get_users(self): while self.running: time.sleep(5) users = self.instance.channels.get(self.instance.channel).users() self.users_box.configure(state="normal") self.users_box.delete('1.0', 'end') for user in users: self.users_box.insert('end', user + "\n") self.users_box.configure(state="disabled") def close_window(self): self.running = False self.instance.disconnect() os._exit(0)
self.text.configure(state='normal') self.text.insert('end', msg + '\n') self.text.configure(state='disabled') self.text.yview('end') # autoscroll to the bottom # This is necessary because we can't modify the Text from other threads self.text.after(0, append) # Sample usage if __name__ == '__main__': # Create the GUI root = tk.Tk() st = ScrolledText(root, state='disabled') st.configure(font='TkFixedFont') st.pack() # Create textLogger text_handler = TextHandler(st) # Add the handler to logger logger = logging.getLogger() logger.addHandler(text_handler) # Log some messages logger.debug('debug message') logger.info('info message') logger.warn('warn message') logger.error('error message') logger.critical('critical message')