class GuiOutput: font = ('courier', 15, 'bold') def __init__(self, parent, width, height): self.width = width self.height = height self.parent = parent self.txt = None if parent: self.popupnow(parent) def popupnow(self, parent): if self.txt: return self.txt = ScrolledText(parent) self.txt.config(font=self.font, height=self.height, width=self.width) self.txt.pack(side=TOP) def write(self, text): self.popupnow(self.parent) self.txt.config(state=NORMAL) self.txt.insert(END, str(text)) self.txt.see(END) self.txt.update() self.txt.config(state=DISABLED) def writelines(self, lines): for line in lines: self.write(line) def flush(self): pass
def __init__(self, master): #使用Frame增加一层容器 global scr_text global b1 global b3 fm1 = Frame(master) scr_text = ScrolledText(fm1,bg="Gainsboro",padx=5,pady=3) scr_text.insert(END, "请点击右侧按钮执行相关操作") scr_text.see(END) scr_text.pack(fill=BOTH,expand=YES,side=TOP,anchor=W,ipadx=3,ipady=3,pady=10,padx=30) fm1.pack(side=LEFT, fill=BOTH, expand=YES) fm2 = Frame(master) Label(fm2,text = "目标路径:").pack() Entry(fm2, textvariable = r_path).pack(padx=20,fill=X) Button(fm2, text = "路径选择", command = self.selectPath).pack(pady=10) b1 = Button(fm2,text="数据存储", command=lambda:self.thread_it(self.save_data_event)) b1['width'] = 25 b1['height'] = 1 b1.pack(ipady=3,pady=10,padx=30) b3 = Button(fm2,text="数据读取", command=lambda:self.thread_it(self.read_data_event)) b3['width'] = 25 b3['height'] = 1 b3.pack(ipady=3,pady=10,padx=30) fm2.pack(side=LEFT)
class ListFrame(Frame): def __init__(self, parent): super(ListFrame, self).__init__(master=parent) self.LEADING = '' self.setup() self.analyze_bar = AnalyzeBar(self, self) # report text self.report_text = ScrolledText(self, bg='white', relief=GROOVE, font='TkFixedFont') self.report_text.grid(row=0, column=0, sticky='news') # status bar self.status_bar = StatusBar(self) def setup(self): self.grid(row=1, column=0, sticky='wens') self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=1) def append(self, string): self.report_text.insert(END, self.LEADING + string + '\n') self.report_text.see(END) def indicate(self, string, freeze): self.status_bar.set_text(string) if freeze: self.master.analyze_bar.freeze() else: self.master.analyze_bar.unfreeze() def clear(self): self.status_bar.set_text('Ready') self.report_text.delete('1.0', END)
class App(Thread): client = socket.socket() client.connect(('localhost', 20001)) def __init__(self, master): Thread.__init__(self) frame = Frame(master) frame.pack() self.gettext = ScrolledText(frame, height=20, width=80) self.gettext.pack() self.gettext.insert(END, 'Bienvenido al Chat Cliente\n\n') self.gettext.configure(state='disabled') sframe = Frame(frame) sframe.pack(anchor='w') self.pro = Label(sframe, text="Cliente>>") self.sendtext = Entry(sframe, width=80) self.sendtext.focus_set() self.sendtext.bind(sequence="<Return>", func=self.Send) self.pro.pack(side=LEFT) self.sendtext.pack(side=LEFT) def Send(self, args): self.gettext.configure(state='normal') text = self.sendtext.get() if text == "": text = " " #self.gettext.insert(END,'Servidor >> {} \n'.format(text)) self.gettext.insert(END, 'Cliente >> {} \n'.format(text)) self.sendtext.delete(0, END) self.client.send(str.encode(text)) self.sendtext.focus_set() self.gettext.configure(state='disabled') self.gettext.see(END) def run(self): Receive(self.client, self.gettext)
class MessageBox(tk.Frame): """ Box for displaying messages. """ def __init__(self,parent, *args, **kwargs): tk.Frame.__init__(self,parent,*args,**kwargs) self.parent = parent self.grandpa = parent.grandpa # there is something wrong with that height self.tbox = ScrolledText(self,width=int(parent.w),height=int(parent.h/4) ) #When using grid, any extra space in the parent is allocated proportionate to the "weight" of a row and/or a column #(ie: a column with a weight of 2 gets twice as much of the space as one with a weight of 1). By default, rows and columns have a weight of 0 (zero), #meaning no extra space is given to them. # #You need to give the column that the widget is in a non-zero weight, # so that any extra space when the window grows is allocated to that column # # You'll also need to specify a weight for the row, and a sticky value of N+S+E+W if you want it to grow in all directions self.grid_rowconfigure(0, weight = 1) self.grid_columnconfigure(0, weight = 1) self.tbox.grid(row = 0) def insert_text(self,text): self.tbox.insert(tk.END,text) self.tbox.see(tk.END) def clear(self): self.tbox.delete(1.0,tk.END)
class TextEditor(): # see PyEdit for more def __init__(self, parent=None): # TODO: 1226 why This can generate independent window ? #frm=Toplevel(Frame.__init__(self, parent)) frm=Toplevel() # TODO : assign title based on cmdline tag frm.title('New Text') # TODO , how to make button and Text in a better Layout format ? # grid() param to learn Button(frm, text='Save', command=self.onSave).grid(row=0,column=0) Button(frm, text='Cut', command=self.onCut).grid(row=0,column=1) Button(frm, text='Paste', command=self.onPaste).grid(row=0,column=2) Button(frm, text='Find', command=self.onFind).grid(row=0,column=3) self.text = ScrolledText(frm) self.text.grid(row=1,columnspan=4) #Button(self, text='Save', command=self.onSave).grid() #Button(self, text='Cut', command=self.onCut).grid() #Button(self, text='Paste', command=self.onPaste).grid() #Button(self, text='Find', command=self.onFind).grid() #self.text = ScrolledText(self) def gettext(self): # returns a string return self.text.get('1.0', END+'-1c') # first through last def onSave(self): filename = asksaveasfilename() #print(filename) if filename: alltext = self.gettext() # first through last open(filename, 'w').write(alltext) # store text in file def onCut(self): text = self.text.get(SEL_FIRST, SEL_LAST) # error if no select self.text.delete(SEL_FIRST, SEL_LAST) # should wrap in try self.text.clipboard_clear() self.text.clipboard_append(text) def onPaste(self): # add clipboard text try: text = self.text.selection_get(selection='CLIPBOARD') self.text.insert(INSERT, text) except TclError: pass # not to be pasted def onFind(self): target = askstring('SimpleEditor', 'Search String?') if target: where = self.text.search(target, INSERT, END) # from insert cursor if where: # returns an index print(where) pastit = where + ('+%dc' % len(target)) # index past target #self.text.tag_remove(SEL, '1.0', END) # remove selection self.text.tag_add(SEL, where, pastit) # select found target self.text.mark_set(INSERT, pastit) # set insert mark self.text.see(INSERT) # scroll display self.text.focus() # select text widget
def _conButtonCmd(self): popwin = PopupWindow("Container Log") popwin.grab_set() popwin.focus() details = self.checkresult.getContainerLogs() stext = ScrolledText(popwin) stext.config(font = ("courier", 15, "normal")) stext.pack() for d in details: stext.insert("end",d) stext.see("end")
def _buttonCmd(self): popwin = PopupWindow("Details") popwin.grab_set() popwin.focus() details = self.checkresult.getDetails() # with os.popen("kubectl describe nodes/115.154.138.241") as re: # details = re.readlines() stext = ScrolledText(popwin) stext.config(font = ("courier", 15, "normal")) stext.pack() for d in details: stext.insert("end",d) stext.see("end")
class Principal(Thread): conexion = socket.socket() conexion.bind(('localhost', 20001)) conexion.listen(5) client, addr = conexion.accept() def __init__(self, master): Thread.__init__(self) frame = Frame(master) frame.pack() self.mensaje = ScrolledText(frame, height=10, width=80, bg='mint cream', state=NORMAL) self.mensaje.pack() sframe = Frame(frame) sframe.pack(anchor='w') self.pro = Label(sframe, text="Servidor >>") self.env_msj = Entry(sframe, width=80) self.env_msj.focus_set() self.env_msj.bind(sequence="<Return>", func=self.enviar) self.pro.pack(side=LEFT) self.env_msj.pack(side=LEFT) self.boton = Button(text="Cerrar", command=ventana.destroy, height=2, width=10, bg="MistyRose3") self.boton.pack(side=RIGHT) self.mensaje.tag_config("yo", foreground='black', font='Fixedsys 14') self.mensaje.insert(END, 'Bienvenido al Chat Servidor\n\n', "yo") self.mensaje.configure(state=DISABLED) def enviar(self, args): self.mensaje.configure(state=NORMAL) text = self.env_msj.get() if text == "": text = " " self.mensaje.tag_config("el", foreground='midnight blue', font='Fixedsys 14') self.mensaje.insert(END, 'Servidor >> %s \n' % text, "el") self.env_msj.delete(0, END) self.client.send(str.encode(text)) self.env_msj.focus_set() self.mensaje.configure(state=DISABLED) self.mensaje.see(END) def run(self): msj_entrante(self.client, self.mensaje)
class GuiOutput(): font = ('courier', 16, 'normal') def __init__(self, parent=None): self.text = ScrolledText(parent) self.text.config(font=self.font) self.text.pack(side=BOTTOM, fill=BOTH, expand=YES) def write(self, text): self.text.insert(END, str(text)) self.text.see(END) self.text.update() # update gui after each line def writelines(self, lines): for line in lines: self.write(line)
def onHist(self): # show recent calcs log popup from tkinter.scrolledtext import ScrolledText # or PP4E.Gui.Tour new = Toplevel() # make new window ok = Button(new, text="OK", command=new.destroy) ok.pack(pady=1, side=BOTTOM) # pack first=clip last text = ScrolledText(new, bg='beige') # add Text + scrollbar text.insert('0.0', self.eval.getHist()) # get Evaluator text text.see(END) # 3.0: scroll to end text.pack(expand=YES, fill=BOTH) # new window goes away on ok press or enter key new.title("PyCalc History") new.bind("<Return>", (lambda event: new.destroy())) ok.focus_set() # make new window modal: new.grab_set() # get keyboard focus, grab app new.wait_window() # don't return till new.destroy
class Visual(tk.Frame): """This class represents visual bot""" botname = BOT_NAME username = USER_NAME def __init__(self, *args): tk.Frame.__init__(self, *args) self.label = tk.Label(self, text=self.botname) self.label.pack() self.chat = ScrolledText(self, wrap=WORD, state=DISABLED, height=CHAT_HEIGHT, width=CHAT_WIDTH) self.chat.pack() self.comment = tk.Text(self, wrap=WORD, height=COMMENT_HEIGHT, width=COMMENT_WIDTH) self.comment.pack() self.button = tk.Button(self, text=BUTTON_TEXT, command=self.button_callback) self.button.pack() self.talk = ProcessSentence() def button_callback(self): text = self.comment.get("1.0", END) self.update_chat(self.talk.get_user_name(), text) text.rstrip(os.linesep) responce = self.talk.check_for_greeting(text) if responce: self.update_chat(self.talk.get_bot_name(), responce + '\n') def update_chat(self, name, text): self.chat.configure(state=NORMAL) self.chat.insert('end', name + " : ", 'GREEN') self.chat.tag_config('GREEN', foreground='GREEN') self.chat.insert('end', text) self.chat.see(END) self.chat.configure(state=DISABLED)
class GuiOutput: font = ('courier', 9, 'normal') # in class for all, self for one def __init__(self, parent=None): self.text = None if parent: self.popupnow(parent) # pop up now or on first write def popupnow(self, parent=None): # in parent now, Toplevel later if self.text: return self.text = ScrolledText(parent or Toplevel()) self.text.config(font=self.font) self.text.pack() def write(self, text): self.popupnow() self.text.insert(END, str(text)) self.text.see(END) self.text.update() # update gui after each line def writelines(self, lines): # lines already have '\n' for line in lines: self.write(line) # or map(self.write, lines)
class ResultFrame(Frame): def __init__(self, master): super().__init__(master, bd=1, relief=SUNKEN) self.grid_columnconfigure(1, weight=1) self.pack(fill=BOTH, expand=1, padx=10, pady=10) self.result_frame_text = ScrolledText(self) # self.result_frame_text = ScrolledText(self, state="disabled") self.result_frame_text.pack(fill=BOTH, expand=1) # Redirect stdout and stderr to this frame. sys.stdout = self sys.stderr = self def write(self, text): sys.__stdout__.write(text) # self.result_frame_text.config(state="normal") self.result_frame_text.insert(END, text) # self.result_frame_text.config(state="disabled") self.result_frame_text.see(END)
class MyGUI: def __init__(self, reps=3): self.reps = reps self.text = ScrolledText() self.text.pack() threadChecker(self.text) self.text.bind('<Button-1>', lambda event: list(map(self.onEvent, range(6)))) def onEvent(self, i): myname = 'thread-%s' % i startThread(action=self.threadaction, args=(i, ), context=(myname,), onExit=self.threadexit, onFail=self.threadfail, onProgress=self.threadprogress) def threadaction(self, id, progress): for i in range(self.reps): time.sleep(1) if progress: progress(i) if id % 2 == 1: raise Exception def threadexit(self, myname): self.text.insert('end', '%s\texit\n' % myname) self.text.see('end') def threadfail(self, exc_info, myname): self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) self.text.see('end') def threadprogress(self, count, myname): self.text.insert('end', '%s\tprog\t%s\n' % (myname, count)) self.text.see('end') self.text.update()
class GuiOutput: font = ('courier', 12, 'normal') def __init__(self, parent=None): self.text = None if parent: self.popupnow(parent) def popupnow(self, parent=None): if self.text: return self.text = ScrolledText(parent or Toplevel()) self.text.config(font=self.font) self.text.pack() def write(self, text): self.popupnow() self.text.insert(END, str(text)) self.text.see(END) self.text.update() def writelines(self, lines): for line in lines: self.write(line)
class FrameBaseInProgress(FrameBase): def __init__(self, parent, controller, label_str): super().__init__(parent, controller) self._label = tk.Label(self, text=label_str, font=controller.title_font) self._label.pack(side="top", fill="x", pady=10) self.progress_var = tk.IntVar() self._progress_bar = ttk.Progressbar(self, orient=tk.HORIZONTAL, length=100, mode='determinate', variable=self.progress_var) self._progress_bar.pack(fill="x", padx=10, pady=10) self._info_log = ScrolledText(self) self._info_log.pack(fill="x", side="bottom") def update_label(self, text): self._label.configure(text=text) self._label.update() def update_log(self, info_text): if info_text: self._info_log.insert(tk.END, info_text) self._info_log.see(tk.END) self._info_log.update() def set_indeterminate(self): self._progress_bar.configure(mode='indeterminate') self._progress_bar.start() def update_progress(self, percent): if percent < 0: percent = 0 if percent > 100: percent = 100 self.progress_var.set(percent)
class Right_panel(ttk.Frame): """ UI element containing the interbal frame and input logic Args: parent: Tkinter parent object on_fetch_click: callback for fetch button press args: Tkinter options kwargs: more Tkinter options Attributes: fetch_btn: button to issue a fetch command to selected host keylog_text: area to display the keylog content """ def __init__(self, parent, on_fetch_click, *args, **kwargs): super().__init__(parent, *args, **kwargs) self.fetch_btn = ttk.Button(self, text="fetch") self.fetch_btn.bind("<ButtonRelease-1>", on_fetch_click) self.fetch_btn.pack(fill=tk.X) self.keylog_text = ScrolledText(self, state="disabled") self.keylog_text.pack(fill=tk.BOTH, expand=1) def set_text(self, text, append=False): """ Sets text in the keylog text area Args: text: text to put in text area append: whether to append the text to the end or clear then put the text. default is false """ self.keylog_text.configure(state='normal') if not append: self.keylog_text.delete(1.0, tk.END) self.keylog_text.insert(tk.END, text) self.keylog_text.configure(state='disabled') self.keylog_text.see(tk.END)
class MyGUI: def __init__(self, reps=3): self.reps = reps # uses default Tk root self.text = ScrolledText() # save widget as state self.text.pack() threadChecker(self.text) # start thread check loop self.text.bind( '<Button-1>', # 3.x need list for map, range ok lambda event: list(map(self.onEvent, range(6)))) def onEvent(self, i): # code that spawns thread myname = 'thread-%s' % i startThread(action=self.threadaction, args=(i, ), context=(myname, ), onExit=self.threadexit, onFail=self.threadfail, onProgress=self.threadprogress) # thread's main action def threadaction(self, id, progress): # what the thread does for i in range(self.reps): # access to object state here time.sleep(1) if progress: progress(i) # progress callback: queued if id % 2 == 1: raise Exception # odd numbered: fail # thread callbacks: dispatched off queue in main thread def threadexit(self, myname): self.text.insert('end', '%s\text\n' % myname) self.text.see('end') def threadfail(self, exc_info, myname): # have access to self state self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) def threadprogress(self, count, myname): self.text.insert('end', '%s\tprog\t%s\n' % (myname, count)) self.text.see('end') self.text.update() # works here: run in main thread
class DebugLogger(object): def __init__(self): self.GUI = tk.Toplevel() self.GUI.protocol('WM_DELETE_WINDOW', self.GUI.withdraw) self.GUI.title("Debug Console") self.textbox = ScrolledText(self.GUI) self.textbox.configure(state="disabled") self.textbox.pack(fill="both", expand=True) self.textbox.tag_config('stdout', foreground='blue') self.textbox.tag_config('stderr', foreground='red') self.GUI.focus() self.stdout = StdOut(self) self.stderr = StdErr(self) def write(self, buf, type): self.textbox.configure(state="normal") self.textbox.insert(tk.END, str(buf), type) self.textbox.configure(state="disabled") self.textbox.see("end") def flush(self): pass
class GuiOutput: font = ('courier', 9, 'normal') # 在类里,适用于整体,而self只适用于个体 def __init__(self, parent=None): self.text = None if parent: self.popupnow(parent) # 先弹出或者第一次写入parent窗口 def popupnow(self, parent=None): # 然后再到顶层窗口 if self.text: return self.text = ScrolledText(parent or Toplevel()) self.text.config(font=self.font) self.text.pack() def write(self, text): self.popupnow() self.text.insert(END, str(text)) self.text.see(END) self.text.update() # 每行结束后更新界面 def writelines(self, lines): for line in lines: # 有"\n"的行 self.write(line) # 或者使用map(self.write, lines)
class MyGui: def __init__(self, reps=3): self.reps = reps self.text = ScrolledText() self.text.pack() threadChecker(self.text) self.text.bind('<Button-1>', lambda event: list(map(self.onEvent, range(6)))) def onEvent(self, i): myname = 'thread-%s' % i startThread(action=self.threadaction, args=(i, 3), context=(myname, ), onExit=self.threadexit, onFail=self.threadfail, onProgress=self.threadprogress) # 线程主要操作 def threadaction(self, id, progress): # 线程的功能 for i in range(self.reps): time.sleep(1) if progress: progress(i) # 回调,加入队列 if id % 2 == 1: # 奇数表示失败 raise Exception # 线程exit/progress回调:离开主线程队列 def threadexit(self, myname): self.text.insert('end', '%s\text\n' % myname) self.text.see('end') def threadfail(self, exc_info, myname): self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) self.text.see('end') def threadprogress(self, count, myname): self.text.insert('end', '%s\tprogress\t%s\n' % (myname, count)) self.text.see('end') self.text.update() # 在这里生效,在主线程中运行
class MyGUI: def __init__(self, reps=3): self.reps = reps # uses default Tk root self.text = ScrolledText() # save widget as state self.text.pack() threadChecker(self.text) # start thread check loop self.text.bind('<Button-1>', # 3.x need list for map, range ok lambda event: list(map(self.onEvent, range(6))) ) def onEvent(self, i): # code that spawns thread myname = 'thread-%s' % i startThread( action = self.threadaction, args = (i, ), context = (myname,), onExit = self.threadexit, onFail = self.threadfail, onProgress = self.threadprogress) # thread's main action def threadaction(self, id, progress): # what the thread does for i in range(self.reps): # access to object state here time.sleep(1) if progress: progress(i) # progress callback: queued if id % 2 == 1: raise Exception # odd numbered: fail # thread callbacks: dispatched off queue in main thread def threadexit(self, myname): self.text.insert('end', '%s\texit\n' % myname) self.text.see('end') def threadfail(self, exc_info, myname): # have access to self state self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) self.text.see('end') def threadprogress(self, count, myname): self.text.insert('end', '%s\tprog\t%s\n' % (myname, count)) self.text.see('end') self.text.update() # works here: run in main thread
class MyGUI: def __init__(self, reps=3): self.reps = reps self.text = ScrolledText() self.text.pack() threadChecker(self.text) self.text.bind('<Button-1>', lambda event: list(map(self.onEvent, range(6)))) def onEvent(self, i): myname = 'thread-%s' % i startThread(action=self.threadaction, args=(i, ), context=(myname, ), onExit=self.threadexit, onFail=self.threadfail, onProgress=self.threadprogress) def threadaction(self, id_, progress): for i in range(self.reps): time.sleep(1) if progress: progress(i) if id_ % 2 == 1: raise Exception def threadexit(self, myname): self.text.insert('end', '%s\texit\n' % myname) self.text.see('end') def threadfail(self, exc_info, myname): self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0])) self.text.see('end') def threadprogress(self, count, myname): self.text.insert('end', '%s\tprog\t%s\n' % (myname, count)) self.text.see('end') self.text.update()
class SwipeFrame(Frame): def __init__(self, parent): super().__init__(parent) self.columnconfigure(0, weight=1) self.rowconfigure(4, weight=1) Separator(self, orient=HORIZONTAL).grid(row=0, columnspan=4, sticky=E + W, pady=5) self.swipe_field = EntryWithHintText( self, hint="Type PIN, then swipe card. If there's no PIN, just swipe.") self.swipe_field.grid(row=1, column=0, sticky=E + W) self.swipe_field.bind('<Return>', self.card_swiped) Separator(self, orient=HORIZONTAL).grid(row=2, columnspan=4, sticky=E + W, pady=5) Label(self, text='Swipe Output', anchor=CENTER).grid(row=3, columnspan=4, sticky=E + W) self.output_text = ScrolledText(self, bg='#F0F0F0', borderwidth=2, relief=GROOVE) self.output_text.config(state=DISABLED) self.output_text.grid(row=4, columnspan=4, sticky=N + E + W + S) def card_swiped(self, event=None): field_data = self.swipe_field.get() # card not swiped if "%B" not in field_data: return else: pin, data = field_data.split("%B") if data.count('?') != 2 or data.count('^') != 2: self.swipe_field.delete(len(pin), END) else: sec1, sec2, sec3 = data.split('^') if len(sec1) != 19: t1, t2, t3 = sec3.split('?') if len(t1) == 8: card_no = sec1[0:16] else: card_no = sec1[0] + sec3[14:16] + sec1[6:15] + sec3[16:20] else: card_no = sec1[0:20] output_line = '{},{}\n'.format( ''.join(card_no[i:i + 4] for i in range(0, len(card_no), 4)), pin) self.output_text.config(state=NORMAL) self.output_text.insert('end-1c', output_line) self.output_text.see(END) self.output_text.config(state=DISABLED) self.swipe_field.delete(0, END)
class Chat_UI(): def __init__(self, main_window): # region UI global USERNAME self.online_users_listbox = '' # 用于显示在线用户的列表框 self.online_users = [] # 在线用户列表 self.chatter = '群聊' # 聊天对象, 默认为群聊 self.main_window = main_window self.main_window.geometry('590x420+320+100') self.main_window.resizable(0, 0) # 消息区域 self.message_aera = ScrolledText(self.main_window) self.message_aera.place(x=5, y=5, width=450, height=360) # 消息区字体颜色 self.message_aera.tag_config('red', foreground='red') self.message_aera.tag_config('blue', foreground='blue') self.message_aera.tag_config('green', foreground='green') self.message_aera.insert(tkinter.END, '您已进入聊天室\n', 'blue') # 在线用户区 self.online_users_listbox = tkinter.Listbox(self.main_window) self.online_users_listbox.place(x=455, y=5, width=130, height=360) # 在用户列表绑定选择聊天对象事件 self.online_users_listbox.bind('<ButtonRelease-1>', self.select_chatter) # 消息编辑区 self.message_text = tkinter.StringVar() self.message_text.set('') self.message_entry = tkinter.Entry(self.main_window, width=120, textvariable=self.message_text) self.message_entry.place(x=5, y=375, width=435, height=30) # 发送按钮 self.send_button = tkinter.Button(self.main_window, text='发送', command=self.send) self.send_button.place(x=455, y=375, width=60, height=30) # 绑定回车发送信息 self.main_window.bind('<Return>', self.send) # 清空按钮 self.send_button = tkinter.Button(self.main_window, text='清空', command=self.clear) self.send_button.place(x=525, y=375, width=60, height=30) # endregion self.my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.my_socket.connect((SERVER_IP, SERVER_PORT)) # 用户名+=ip+port addr = self.my_socket.getsockname() # 获取客户端ip和端口号 addr = addr[0] + ':' + str(addr[1]) # SERVER_IP:port USERNAME = USERNAME + ' (' + addr + ')' self.main_window.title(USERNAME + ' 群聊') self.my_socket.send(USERNAME.encode()) r = threading.Thread(target=self.recv) r.start() # 开始线程接收信息 # 清空按钮事件 def clear(self, *args): self.message_text.set('') # 发送按钮事件 def send(self, *args): self.online_users.append('群聊') if self.chatter not in self.online_users: tkinter.messagebox.showerror('发送失败', message='请选择聊天对象') return False if self.chatter == USERNAME: tkinter.messagebox.showerror('发送失败', message='请不要选择自己') return False msg = USERNAME + ':;' + self.message_entry.get() + ':;' + self.chatter self.my_socket.send(msg.encode()) self.clear() # 发送后清空文本框 return True # 选择聊天对象事件 def select_chatter(self, *args): # 获取点击的索引然后得到内容(用户名) index = self.online_users_listbox.curselection()[0] if index == 0 or index == 1: self.main_window.title(USERNAME + ' 群聊') self.chatter = '群聊' else: self.chatter = self.online_users_listbox.get(index) self.main_window.title(USERNAME + ' --> ' + self.chatter) # 刷新在线列表 def refresh_list(self, receive_data): self.online_users_listbox.delete(0, tkinter.END) # 清空列表框 online_count = ('在线人数: ' + str(len(receive_data)) + ' 人') self.online_users_listbox.insert(tkinter.END, online_count) self.online_users_listbox.itemconfig(tkinter.END, fg='black', bg="lightgray") self.online_users_listbox.insert(tkinter.END, '群聊') self.online_users_listbox.itemconfig(tkinter.END, fg='black') for data in receive_data: self.online_users_listbox.insert(tkinter.END, data) self.online_users_listbox.itemconfig(tkinter.END, fg='black') # 接收服务端发送的信息 def recv(self): while True: receive_data = self.my_socket.recv(1024) receive_data = receive_data.decode() try: # 接收到在线用户列表 receive_data = json.loads(receive_data) self.online_users = receive_data self.refresh_list(receive_data) except: # 接收到消息 receive_data = receive_data.split(':;') data1 = receive_data[0] # 发送信息的用户名 data2 = receive_data[1].strip() # 消息 data3 = receive_data[2] # 聊天对象 if data3 == '群聊': data2 = data1 + ' to all : ' + data2 + '\n' if data1 == USERNAME: # 自己发送的 self.message_aera.insert(tkinter.END, data2, 'blue') else: # 接收的 self.message_aera.insert(tkinter.END, data2, 'green') elif data1 == USERNAME or data3 == USERNAME: # 私聊 data2 = data1 + ' to ' + data3 + ' : ' + data2 + '\n' self.message_aera.insert(tkinter.END, data2, 'red') self.message_aera.see(tkinter.END) def __del__(self): self.my_socket.close() # 关闭 TCP 连接
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)
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')
class ChatWindow(Toplevel): chats = {} @staticmethod def get(peer): try: return ChatWindow.chats[peer] except KeyError: ChatWindow.chats[peer] = ChatWindow(peer) return ChatWindow.chats[peer] def __init__(self, peer): Toplevel.__init__(self, mainwindow) self.peer = peer self.recvFile = None self.title(peer[0] + ':' + str(peer[1])) #self.root = Tk() #self.main = Frame(self.root) self.main = Frame(self) self.main.pack(expand=True, fill=BOTH) self.chat_Text = ScrolledText(self.main) self.chat_Text.pack(expand=True, fill=BOTH) self.chat_Text['height'] = 10 #print self.keys() #print self.chat_Text.keys() self.send_Frame = Frame(self.main) self.send_Frame.pack(fill=X) self.send_Text = Entry(self.send_Frame) self.send_Text.pack(side=LEFT, expand=True, fill=X) self.send_Text.bind('<Return>', self.send_Action) self.send_Button = Button(self.send_Frame, text='Send', command=self.send_Action) self.send_Button.pack(side=LEFT) self.holePunch_Button = Button(self.send_Frame, text='UDP punch', command=self.holePunch_Action) self.holePunch_Button.pack(side=LEFT) self.sendFile_Button = Button(self.send_Frame, text='File', command=self.sendFile_Action) self.sendFile_Button.pack(side=LEFT) self.status_Label = Label(self.main, text='Peer: ' + self.peer[0] + ':' + str(self.peer[1])) self.status_Label.pack() self.send_Text.focus() #self.protocol("WM_DELETE_WINDOW", self._destroy) def destroy(self): #print 'destroy' del ChatWindow.chats[self.peer] Toplevel.destroy(self) def send_Action(self, *args): text = self.send_Text.get() message = persist['myname'] + ': ' + text if (text.strip()): self.chat_Text.insert(END, timestamp() + ' ' + message) self.chat_Text.see(END) self.send_Text.delete(0, len(text)) sock.sendto(b'TEXT' + message.encode(), self.peer) #sock.lastActive = time.time() else: self.send_Text.delete(0,END) def holePunch_Action(self, *args): #request server to forward our hole punch request to peer print('Sending hole punch request') sock.sendto(b'PCH?' + socket.inet_aton(self.peer[0]) + self.peer[1].to_bytes(2, 'big'), server) def sendFile_Action(self, *args): filename = '/tmp/test' size = os.path.getsize(filename) net_size = socket.htonl(size) # 0x12345678 # 78 56 34 12 # 12 34 56 78 self.sendFile = BLANK() self.sendFile.handle = open(filename, 'br') data = size.to_bytes(4, 'big') + self.sendFile.handle.read(chunkSize) sock.sendto(b'FILE' + data, self.peer) section = 0 while True: data = self.sendFile.handle.read(chunkSize) if data == b'': break section += 1 sock.sendto(b'FILE' + section.to_bytes(4, 'big') + data, self.peer) def receive(self, message): msgType = message[:4] msg = message[4:] if msgType == b'TEXT': self.chat_Text.insert(END, timestamp() + ' ' + str(msg, encoding='utf-8') + '\n') self.chat_Text.see(END) self.bell() #ip = self.peer[0].split('.') #ip = bytes((int(ip[0]), int(ip[1]), int(ip[2]), int(ip[3]))) ip = self.peer[0] ip = socket.inet_aton(ip) port = self.peer[1] port = bytes((port // 0x100, port & 0xFF)) sock.sendto(b'CFRM' + ip + port, self.peer) #sock.lastActive = time.time() elif msgType == b'CFRM': #ip = '{}.{}.{}.{}'.format(msg[0], msg[1], msg[2], msg[3]) ip = socket.inet_ntoa(msg[0:4]) port = msg[4] * 0x100 + msg[5] self.chat_Text.insert(END, ' [R]\n') elif msgType == b'PCHA': print('Received hole punch from:', self.peer) self.chat_Text.insert(END, timestamp() + ' ' + '[UDP hole punch success]\n') self.chat_Text.see(END) elif msgType == b'FILE': if self.recvFile == None: self.recvFile = BLANK() self.recvFile.size = int.from_bytes(msg[:4], 'big') self.recvFile.part = 0 self.recvFile.handle = open('/tmp/test2', 'wb') self.recvFile.handle.write(msg[4:]) else: self.recvFile.part = int.from_bytes(msg[:4], 'big') self.recvFile.handle.seek(self.recvFile.part * chunkSize) self.recvFile.handle.write(msg[4:]) sock.sendto(b'FCNF' + self.recvFile.part.to_bytes(4, 'big'), self.peer) if self.recvFile.handle.tell() == self.recvFile.size: self.recvFile.handle.close() self.recvFile = None
class chat: # HOST = '172.28.32.140' HOST = '172.93.34.44' PORT = 9999 ADDR = (HOST, PORT) tmp = 0 def __init__(self): self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # ----------------------------------------------------------------------------- self.root = Tk() #主聊天人窗口 self.master = StringVar() self.MasterEntry = Entry(self.root, textvariable=self.master, width=8, font=('Verdana', 15), bg='turquoise', highlightcolor='red') self.master.set("bbb") # to self.labelto = Label(self.root, text=' to ', width=8, font=('Arial', 12)) # 客户聊天人窗口 self.client = StringVar() self.ClientEntry = Entry(self.root, textvariable=self.client, width=8, font=('Verdana', 15), bg='yellowgreen') self.client.set("aaa") # 聊天窗口 self.t_show = ScrolledText(self.root, width=40, height=30, font=('Verdana', 12), background='#ffffff', state=DISABLED) self.t_show.tag_config('m', foreground='turquoise') self.t_show.tag_config('c', foreground='yellowgreen') #self.t_show.insert('1.0', '') # 聊天输入窗口 self.chat = StringVar() self.ChatEntry = Entry(self.root, textvariable=self.chat, width=25, font=('Verdana', 15), foreground='gray') self.chat.set("Enter message") self.ChatEntry.bind('<Key-Return>', self.enter_send) # bind enter键按下事件 self.ChatEntry.bind('<FocusIn>', self.chat_cursor_enter) # bind 光标进入事件 self.ChatEntry.bind('<FocusOut>', self.chat_cursor_leave) # bind 光标离开事件 #发送和退出按钮 self.SendButton = Button(self.root, text="发送", width=16, command=self.send) self.ExitButton = Button(self.root, text="退出", width=8, command=self.exit, padx=5) #图片显示 self.photo = PhotoImage(file='./gif/xiaoqie.gif') self.labelimage = Label(image=self.photo) self.labelimage.image = self.photo self.labelimage.grid(row=1, column=3, columnspan=2, rowspan=1, sticky=W + E + N + S) self.MasterEntry.grid(row=0, column=0) self.labelto.grid(row=0, column=1) self.ClientEntry.grid(row=0, column=2) self.t_show.grid(row=1, column=0, columnspan=3, rowspan=1, sticky=W + E + N + S, padx=10, pady=10) self.ChatEntry.grid(row=2, column=0, columnspan=2, padx=10, pady=10) self.SendButton.grid(row=2, column=2) self.ExitButton.grid(row=2, column=3, columnspan=2) # self.s.sendto('hello'.encode('utf-8'), ('172.28.32.140', 9999)) self.s.sendto('hello'.encode('utf-8'), self.ADDR) print('thread %s is running...' % threading.current_thread().name) self.t = threading.Thread(target=self.recv_loop, name='LoopThread') self.t.setDaemon(True) # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题 self.t.start() self.t = threading.Thread(target=self.flash, name='ImageThread') self.t.setDaemon(True) # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题 self.t.start() # self.root.mainloop() def flash(self): # PhotoImage(file='F:/wuyongxiang/laoying/images/' + str(tmp) + '.gif') #files = os.listdir('F:/wuyongxiang/study/python/untitled1/gif/xiaoqie/') files = os.listdir('./gif/xiaoqie/') print(files) files.sort(key=lambda x: int(x[:-4])) # 使用sort 的key 的lambda 按大小进行排序 print(files) photos = [PhotoImage(file='./gif/xiaoqie/' + filet) for filet in files] # print('F:/wuyongxiang/laoying/images/'+file) print('photos is : %d' % len(photos)) #time.sleep(1) while True: self.tmp = self.tmp + 1 for photo in photos: print('%s ' % photo) self.labelimage.configure( image=photo) #这样就可以不在使用grid重新排版添加控件,如此节省资源 self.labelimage.image = photo #self.labelimage.grid(row=0, column=0, rowspan=2, columnspan=2) #不在需要重新布局,这样太占资源 #self.labelimage1.grid(row=1, column=3, columnspan=2, rowspan=1, sticky=W + E + N + S) a = random.uniform(0.1, 0.4) #随机产生浮点数 0.1-0.4之间 #print('aaaaaaaaaaaaaaaaaaaaa %f'%a) time.sleep(a) del photo if self.tmp > 2: del photos files = os.listdir('./gif/xiaoqie/') # print(files) files.sort( key=lambda x: int(x[:-4])) # 使用sort 的key 的lambda 按大小进行排序 # print(files) # photos=[0] photos = [ PhotoImage(file='./gif/xiaoqie/' + filet) for filet in files ] # print('F:/wuyongxiang/laoying/images/'+file) # print('photos is : %d' % len(photos)) print('--------------------------') self.tmp = 0 with Image.open('./gif/xiaoqie.gif') as im: if im.is_animated: frames = [f.copy() for f in ImageSequence.Iterator(im)] # frames.reverse() # 内置列表倒序方法 # frames.reverse() random.shuffle(frames) frames[0].save('./gif/xiaoqie.gif', save_all=True, append_images=frames[1:]) im = Image.open("./gif/xiaoqie.gif") im.save("./gif/xiaoqie/0.gif") while True: try: seq = im.tell() im.seek(seq + 1) im.save("./gif/xiaoqie/%s.gif" % (seq), quality=100) except EOFError: break def chat_cursor_enter(self, event): if self.chat.get() == 'Enter message' or self.chat.get() == '': self.chat.set("") self.ChatEntry['foreground'] = 'black' # 重新设置Entry字体颜色 def chat_cursor_leave(self, event): self.ChatEntry['foreground'] = 'gray' # 重新设置Entry字体颜色 if self.chat.get() == 'Enter message' or self.chat.get( ) == '': # 如果输入框里面有输入内容则不使用默认语句覆盖 self.chat.set("Enter message") # def send(self): # print('test!') def enter_send(self, event): print('按下Enter: ' + event.char) self.send() def send(self): # 发送数据: # s.sendto(data, ('172.93.34.44', 9999)) if self.master.get() == '': self.t_show.config(state=NORMAL) #让消息显示框可以正常输入 self.t_show.insert(END, '请输入您的姓名!\n', 'm') self.t_show.config(state=DISABLED) #让消息显示框禁止输入 return if self.client.get() == '': self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert(END, '请输入对方姓名!\n', 'm') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 return # self.DefaultMaster=self.master.get() # self.DefaultClient=self.master.get() tmpdata = b'<' + self.master.get().encode( 'utf-8') + b' to ' + self.client.get().encode( 'utf-8') + b'>data=' + self.chat.get().encode('utf-8') print('send data is: %s' % tmpdata) self.s.sendto(tmpdata, self.ADDR) # s.sendto(sendvar.get().encode('utf-8'), ('172.93.34.44', 9999)) # self.t_show.insert(END, ' ' + self.chat.get() + ':' + self.master.get() + '\n','m') self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert(END, self.chat.get() + '\n\n', 'm') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 self.t_show.see(END) # 让滚动条一直处于最下端 self.chat.set('') def exit(self): tpdata = b'<' + self.master.get().encode( 'utf-8') + b' to ' + self.client.get().encode( 'utf-8') + b'><!quit>' print('exit send :%s' % tpdata) self.s.sendto(tpdata, self.ADDR) # self.s.sendto(b'<'+self.master.get().encode('utf-8')+b' to '+self.client.get().encode('utf-8')+b'><!quit>data=',self.ADDR) # self.s.sendto( '<!quit>data='.encode('utf-8'),self.ADDR) # self.ExitButton['text'] = '成功' #time.sleep(1) # 一定要延时,否则没等消息过来终止线程,窗口退出会异常 self.root.destroy() def recv_loop(self): print('thread %s is running...' % threading.current_thread().name) self.s.settimeout(2) while True: # time.sleep(3) # 接收数据: # self.rec = self.s.recv(1024).decode('utf-8') try: self.rec = self.s.recv(1024) # break except socket.timeout: print('-------超时,重新接收--------') continue print('接收的数据是:%s' % self.rec.decode('utf-8')) # patternclient = # 匹配查找client 名字8 if re.search(re.compile(b"<!quit>"), self.rec) != None: break if re.search(re.compile(b"(?<=<).+?(?= to)"), self.rec) != None: clientname = re.search(re.compile(b"(?<=<).+?(?= to)"), self.rec).group(0).decode('utf-8') if re.search(re.compile(b"(?<=data=).+"), self.rec) != None: # 带有谁发送提示 # self.t_show.insert(END,clientname+':'+re.search(re.compile(b"(?<=data=).+"),self.rec).group(0).decode('utf-8')+'\n','a') self.t_show.config(state=NORMAL) # 让消息显示框可以正常输入 self.t_show.insert( END, re.search(re.compile(b"(?<=data=).+"), self.rec).group(0).decode('utf-8') + '\n\n', 'c') self.t_show.config(state=DISABLED) # 让消息显示框禁止输入 self.t_show.see(END) # 让滚动条一直处于最下端 if self.master.get() != clientname: # 防止自己跟自己聊天 self.client.set(clientname)
class ExtractFrame(Frame): def __init__(self, parent): super().__init__(parent) self.extract_thread = None left_frame = Frame(self) left_frame.columnconfigure(0, weight=1) right_pane = Frame(self) output_frame = Frame(right_pane, style='Progress.TFrame') output_frame.columnconfigure(0, weight=1) output_frame.rowconfigure(1, weight=1) self.output_label = Label(output_frame, text='Card Output', anchor=W) self.output_label.grid(row=0, sticky=W) self.output_text = ScrolledText(output_frame, bg='#F0F0F0', height=10, borderwidth=2, relief=GROOVE) self.output_text.config(state=DISABLED) self.output_text.grid(row=1, sticky=N + E + W + S) # right_pane.add(output_frame) progress_frame = Frame(right_pane, style='Progress.TFrame') progress_frame.columnconfigure(0, weight=1) progress_frame.rowconfigure(1, weight=1) self.progress_label = Label(progress_frame, text='Progress', anchor=W) self.progress_label.grid(row=0, sticky=W) self.progress_text = ScrolledText(progress_frame, bg='#F0F0F0', height=10, borderwidth=2, relief=GROOVE) self.progress_text.config(state=DISABLED) self.progress_text.grid(row=1, sticky=N + E + W + S) # right_pane.add(progress_frame) output_frame.pack(expand=1, fill="both") progress_frame.pack(expand=1, fill="both") # get settings self._settings = self.winfo_toplevel().get_settings() self._queue = queue.Queue() self._kill_queue = queue.Queue() self.checkbox_widgets = [] self.all_checked = BooleanVar() left_frame_checkboxes = Frame(left_frame, borderwidth=2, relief='groove') self.checkbox_widgets.append( Checkbutton(left_frame_checkboxes, text='Gift Card Sources', variable=self.all_checked, command=lambda v=self.all_checked: self.check_all(v))) self.checkbox_widgets[-1].grid(row=0, columnspan=3, sticky=N + W + E + S) Separator(left_frame_checkboxes, orient=HORIZONTAL).grid(row=1, columnspan=3, sticky=EW) active_sources = self._settings['Settings']['selected_source'].split( ',') self.checkboxes = [ BooleanVar(name=extractors_list[count].name()) for count in range(len(extractors_list)) ] for i, c in enumerate(self.checkboxes): c.set(extractors_list[i].name() in active_sources) choices = [e.name() for e in extractors_list] self.only_links = [] for i, e in enumerate(extractors_list): self.checkbox_widgets.append( Checkbutton(left_frame_checkboxes, text=e.name(), variable=self.checkboxes[i], command=lambda: self.save_sources())) self.checkbox_widgets[-1].grid(row=i + 2, sticky=N + W) self.only_links.append( Label(left_frame_checkboxes, text='Only', style='Link.TLabel', cursor='hand2')) self.only_links[-1].bind( '<Button-1>', lambda f, i=i: self.check_only(i, self.all_checked)) self.only_links[-1].grid(row=i + 2, column=2) Separator(left_frame_checkboxes, orient=HORIZONTAL).grid(row=len(extractors_list) + 2, columnspan=3, sticky=EW) self.take_screenshots = BooleanVar() self.take_screenshots.set(self._settings['Settings']['screenshots']) self.checkbox_widgets.append( Checkbutton(left_frame_checkboxes, text='Screenshots', variable=self.take_screenshots, command=lambda v=self.take_screenshots: self. toggle_screenshots(v))) self.checkbox_widgets[-1].grid(columnspan=3, sticky=NSEW) left_frame_checkboxes.grid(row=0) self.extract_button = Button(left_frame, text='Extract', style='Extract.TButton', command=self.extract) self.extract_button.grid(row=1, sticky=N + E + W + S, pady=1) self.cancel_button = Button(left_frame, text='Cancel', command=self.cancel) self.cancel_button.grid(row=2, sticky=N + E + W + S) self.cancel_button.configure(state=DISABLED) left_frame.pack(side=LEFT, anchor=N + W, padx=5, pady=5) right_pane.pack(side=LEFT, expand=1, fill="both") self.do_update() def toggle_screenshots(self, value): self._settings['Settings']['screenshots'] = str(value.get()) self.winfo_toplevel().save_settings() def save_sources(self): self._settings['Settings']['selected_source'] = ','.join([ extractors_list[i].name() for i, c in enumerate(self.checkboxes) if c.get() ]) self.winfo_toplevel().save_settings() def check_only(self, only, all_checked): for i, c in enumerate(self.checkboxes): c.set(i == only) all_checked.set(False) self.save_sources() def check_all(self, value): val = value.get() for c in self.checkboxes: c.set(val) self.save_sources() def do_update(self): try: while True: line = self._queue.get_nowait() if line.startswith('CARDOUTPUT'): line = line[10:] self.output_text.configure(state=NORMAL) self.output_text.delete(1.0, END) self.output_text.insert(INSERT, line) self.output_text.configure(state=DISABLED) elif line.startswith('EXTRACTIONFINISHED'): self.restore_gui() else: self.progress_text.config(state='normal') self.progress_text.insert('end-1c', line + '\n') self.progress_text.config(state='disabled') self.progress_text.see(END) except queue.Empty: pass self.after(100, self.do_update) def save_screenshot(self, browser, card_number): screenshots_dir = os.path.join(os.getcwd(), 'screenshots') if not os.path.exists(screenshots_dir): os.makedirs(screenshots_dir) browser.save_screenshot( os.path.join(screenshots_dir, card_number + '.png')) def update_progress(self, text): # check kill queue to see if we should stop try: line = self._kill_queue.get_nowait() if self.browser: self.browser.close() self._queue.put_nowait('Extraction canceled.') self.extraction_cleanup() except queue.Empty: pass self._queue.put_nowait(text) def cancel(self): self.update_progress('Cancelling...') if self.extract_thread: self._kill_queue.put_nowait('DIE') def restore_gui(self): for c in self.checkbox_widgets: c.configure(state=NORMAL) for l in self.only_links: l.configure(state=NORMAL) self.extract_button.configure(state=NORMAL) self.cancel_button.configure(state=DISABLED) def extract(self): # disable GUI for c in self.checkbox_widgets: c.configure(state=DISABLED) for l in self.only_links: l.configure(state=DISABLED) self.extract_button.configure(state=DISABLED) self.cancel_button.configure(state=NORMAL) self.extract_thread = threading.Thread(target=self.extract_real) self.extract_thread.start() def output_cards(self, cards): csv_output = 'CARDOUTPUT' for store in cards: # sort by time received cards[store] = sorted(cards[store], key=lambda k: k['datetime_received']) csv_output += store + "\r\n" for c in cards[store]: csv_output += "{},{},{}\r\n".format(c['card_amount'], c['card_code'], c['card_pin']) csv_output += "\r\n" self.update_progress(csv_output) def extract_real(self): config = self._settings extractor = None self.update_progress("Initializing...") cards = {} urls = [] e = [ extractors_list[i] for i, c in enumerate(self.checkboxes) if c.get() ] if len(e) == 0: self.update_progress('No sources selected!') self.extraction_cleanup() emails = [i for e_list in [x.email() for x in e] for i in e_list] days = int(config.get('Settings', 'days')) browser = None self.browser = None for section in (e for e in self._settings.sections() if e.startswith('Email')): # for section in ['Email1', 'Email2', 'Email3', 'Email4']: if int(config.get(section, 'imap_active')) == 1: imap_ssl = int(config.get(section, 'imap_ssl')) == 1 imap_host = config.get(section, 'imap_host') imap_port = int(config.get(section, 'imap_port')) imap_username = config.get(section, 'imap_username') imap_password = config.get(section, 'imap_password') phonenum = config.get(section, 'phonenum') self.update_progress( "Connecting to {}...".format(imap_username)) # Connect to the server if imap_ssl: mailbox = IMAP4_SSL(host=imap_host, port=imap_port) else: mailbox = IMAP4(host=imap_host, port=imap_port) # Log in and select the configured folder mailbox.login(imap_username, imap_password) mailbox.select("INBOX") since = (date.today() - timedelta(days - 1)).strftime("%d-%b-%Y") from_list = '(OR ' * (len(emails) - 1) + '(FROM "'+emails[0]+'") ' +\ ''.join(['(FROM "'+em+'")) ' for em in emails[1:]])[0:-1] # subject = ' HEADER Subject "'+extractor.subject()+'" ' if extractor.subject() is not "" else " " space = ' ' if len(emails) > 1 else '' search = '({}{}SINCE "{}")'.format(from_list, space, since) # status, messages = mailbox.search(None, '(OR (OR (FROM "*****@*****.**") (FROM "*****@*****.**")) (FROM "*****@*****.**"))') # search = '(FROM "*****@*****.**") SINCE "23-Nov-2018"' status, messages = mailbox.search(None, search) if status == "OK": # Convert the result list to an array of message IDs messages = [m.decode('ascii') for m in messages[0].split()] if len(messages) == 0: continue self.update_progress( "Fetching messages from {}...".format(imap_username)) data = [] try: status, data = mailbox.fetch(','.join(messages), '(RFC822)') # remove every other element of list, extract messages data = [ email.message_from_bytes(i[1]) for index, i in enumerate(data) if (index + 1) % 2 != 0 ] except IMAP4.error: # Can't fetch all messages at once, do them one at a time for msg_id in messages: self.update_progress( "{}: Fetching message id {}...".format( imap_username, msg_id)) # Fetch it from the server status, m = mailbox.fetch(msg_id, '(RFC822)') if status == "OK": data.append(email.message_from_bytes(m[0][1])) if status == "OK": for idx, msg in enumerate(data): # Get To: and From: addresses to_address = email.utils.parseaddr( msg.get("To", imap_username))[1] from_address = email.utils.parseaddr( msg.get("From"))[1] # Get extractor extractor = [ ext for ext in extractors_list if from_address in ext.email() ][0] # Get the HTML body payload msg_html = extractor.fetch_payload(msg) if msg_html is None: continue # Save the email timestamp datetime_received = datetime.fromtimestamp( email.utils.mktime_tz( email.utils.parsedate_tz(msg.get('date')))) # Parse the message msg_parsed = BeautifulSoup(msg_html, 'html.parser') # Find the "View My Code" link url = extractor.fetch_url(msg_parsed, browser, imap_username) if url is not None: if isinstance(url, list): for u in url: urls.append([ messages[idx], extractor, datetime_received, u, imap_username, to_address, phonenum ]) else: urls.append([ messages[idx], extractor, datetime_received, url, imap_username, to_address, phonenum ]) if len(urls) < 1: self.update_progress('No cards to extract!') self.extraction_cleanup() if browser is None: self.update_progress("Launching ChromeDriver...") chrome_options = webdriver.ChromeOptions() if config.get('Settings', 'hide_chrome_window'): chrome_options.add_argument("--window-position=-10000,0") try: profile = config.get('Settings', 'profile') chrome_options.add_argument( '--user-data-dir={}'.format(profile)) except NoOptionError: pass browser = webdriver.Chrome(config.get('Settings', 'chromedriver_path'), chrome_options=chrome_options) self.browser = browser # TODO make it all self.browser for msg_id, extractor, datetime_received, url, imap_username, to_address, phonenum in urls: self.update_progress( "{}: Getting gift card from message id: {}".format( imap_username, msg_id)) while True: # keep retrying to load the page if it's timing out. # TODO add cancel option while True: try: browser.get(url) except TimeoutException: self.update_progress( 'Page load timed out. Retrying...') continue # if page load times out, retry... if 'ERR_TIMED_OUT' in browser.page_source or 'com.bhn.general.service.error' in browser.page_source: self.update_progress( 'Page load timed out. Retrying...') time.sleep(1) continue break # challenege for various cards extractor.complete_challenge(browser, to_address, phonenum) card = extractor.fetch_codes(browser) if card is None: break if card['card_store'] not in cards: cards[card['card_store']] = [] if card['card_code'] != '': break if card is not None: card['datetime_received'] = str(datetime_received) card['url'] = url cards[card['card_store']].append(card) if config.get('Settings', 'screenshots'): self.save_screenshot(browser, card['card_code']) # if self.ids.prints.active: # browser.execute_script('window.print()') extractor.delay() # update output window for each new card self.output_cards(cards) browser.close() self.extraction_cleanup() def extraction_cleanup(self): self._queue.put_nowait('EXTRACTIONFINISHED') exit()
class MarkovDemo(Frame): "MarkovDemo(master=None, **kw) -> MarkovDemo instance" TEXT = dict(height=2, width=46, wrap=WORD) # Text Options GRID = dict(padx=5, pady=5) # Grid Options # Initialize a MarkovDemo instance with a GUI for interaction. def __init__(self, master=None, **kw): "Initialize the MarkovDemo instance's widgets and settings." super().__init__(master, **kw) self.build_widgets() self.place_widgets() self.setup_widgets() self.grid_rowconfigure(2, weight=1) self.grid_rowconfigure(3, weight=1) self.grid_columnconfigure(0, weight=1) self.key = self.primer = None def build_widgets(self): "Build the various widgets that will be used in the program." # Create processing frame widgets. self.processing_frame = LabelFrame(self, text='Processing Mode:') self.mode_var = StringVar(self, 'encode') self.decode_button = Radiobutton(self.processing_frame, text='Decode Cipher-Text', command=self.handle_radiobuttons, value='decode', variable=self.mode_var) self.encode_button = Radiobutton(self.processing_frame, text='Encode Plain-Text', command=self.handle_radiobuttons, value='encode', variable=self.mode_var) self.freeze_var = BooleanVar(self, False) self.freeze_button = Checkbutton(self.processing_frame, text='Freeze Key & Primer', command=self.handle_checkbutton, offvalue=False, onvalue=True, variable=self.freeze_var) # Create encoding frame widgets. self.encoding_frame = LabelFrame(self, text='Encoding Options:') self.chain_size_label = Label(self.encoding_frame, text='Chain Size:') self.chain_size_entry = Entry(self.encoding_frame) self.plain_text_label = Label(self.encoding_frame, text='Plain-Text:') self.plain_text_entry = Entry(self.encoding_frame) # Create input frame widgets. self.input_frame = LabelFrame(self, text='Input Area:') self.input_text = ScrolledText(self.input_frame, **self.TEXT) # Create output frame widgets. self.output_frame = LabelFrame(self, text='Output Area:') self.output_text = ScrolledText(self.output_frame, **self.TEXT) def place_widgets(self): "Place the widgets where they belong in the MarkovDemo frame." # Locate processing frame widgets. self.processing_frame.grid(sticky=EW, **self.GRID) self.decode_button.grid(row=0, column=0, **self.GRID) self.encode_button.grid(row=0, column=1, **self.GRID) self.freeze_button.grid(row=0, column=2, **self.GRID) # Locate encoding frame widgets. self.encoding_frame.grid(sticky=EW, **self.GRID) self.chain_size_label.grid(row=0, column=0, sticky=W, **self.GRID) self.chain_size_entry.grid(row=0, column=1, sticky=EW, **self.GRID) self.plain_text_label.grid(row=1, column=0, sticky=W, **self.GRID) self.plain_text_entry.grid(row=1, column=1, sticky=EW, **self.GRID) self.encoding_frame.grid_columnconfigure(1, weight=1) # Locate input frame widgets. self.input_frame.grid(sticky=NSEW, **self.GRID) self.input_text.grid(sticky=NSEW, **self.GRID) self.input_frame.grid_rowconfigure(0, weight=1) self.input_frame.grid_columnconfigure(0, weight=1) # Locate output frame widgets. self.output_frame.grid(sticky=NSEW, **self.GRID) self.output_text.grid(sticky=NSEW, **self.GRID) self.output_frame.grid_rowconfigure(0, weight=1) self.output_frame.grid_columnconfigure(0, weight=1) def setup_widgets(self): "Setup each widget's configuration for the events they handle." self.input_text.bind('<Key>', self.handle_key_events) self.input_text.bind('<Control-Key-a>', self.handle_control_a) self.input_text.bind('<Control-Key-/>', lambda event: 'break') self.output_text['state'] = DISABLED self.output_text.bind('<Control-Key-a>', self.handle_control_a) self.output_text.bind('<Control-Key-/>', lambda event: 'break') ######################################################################## # Take care of any special event needing dedicated processing. def handle_radiobuttons(self): "Change the interface based on the encoding / decoding setting." if self.encrypting: self.freeze_button.grid() if not self.freeze_var.get(): self.encoding_frame.grid() else: self.freeze_button.grid_remove() if not self.freeze_var.get(): self.encoding_frame.grid_remove() self.handle_key_events(None) def handle_checkbutton(self): "Change the interface based on the key / primer freeze setting." if self.freeze_var.get(): self.encoding_frame.grid_remove() else: self.encoding_frame.grid() def handle_key_events(self, event): "Schedule refreshing the output area after an input area event." if event is None or event.char and event.state | 0o11 == 0o11: self.after_idle(self.refresh) @staticmethod def handle_control_a(event): "Select all text in the widget associated with the given event." event.widget.tag_add(SEL, 1.0, END + '-1c') return 'break' ######################################################################## # Handle interface's updates when either encoding or decoding. def refresh(self): "Refresh the output based on the value of the input." text = self.input_text.get(1.0, END + '-1c') if not text: self.output = text elif self.encrypting: self.encode(text) else: self.decode(text) def output(self, value): "Set the text in the output area to the string value." self.output_text['state'] = NORMAL self.output_text.delete(1.0, END) self.output_text.insert(END, value) if self.encrypting and self.freeze_var.get(): self.output_text.see(END) self.output_text['state'] = DISABLED output = property(fset=output, doc='Output area property.') @property def chain_size(self): "Chain size for the Markov chains used when encrypting." try: value = ast.literal_eval(self.chain_size_entry.get()) assert isinstance(value, int) and 2 <= value <= 256 return value except: self.chain_size_entry.delete(0, END) self.chain_size_entry.insert(0, '2') return 2 @property def plain_text(self): "Plain text or ignored characters in encryption process." try: value = self.repr_to_obj(self.plain_text_entry.get(), '') assert isinstance(value, str) return value except: self.plain_text_entry.delete(0, END) return '' ######################################################################## # Encrypt a string for display in the interface's output area. def encode(self, string): "Encode the string and show the cipher-text in the output." try: cipher = self.build_cipher(string) except ValueError: self.output = '' except: self.output = traceback.format_exc() else: self.output = self.build_header() + '\n\n' + cipher def build_cipher(self, string): "Build cipher-text based on plain-text and return answer." if self.key and self.freeze_var.get(): cipher, primer = me.encrypt_str(string, self.key, self.primer) else: args = string, self.chain_size, self.plain_text cipher, self.key, self.primer = me.auto_encrypt_str(*args) return cipher def build_header(self): "Build header from key and primer values in current use." header = '\n'.join(map(self.bytes_to_repr, self.key.data)) header += '\n' + self.bytes_to_repr(self.primer.data) return header ######################################################################## # Decrypt a string for display in the interface's output area. def decode(self, string): "Decode encrypted message and display plain-text in output." try: cipher = self.extract_keys(string) text = self.extract_text(cipher) except ValueError: self.output = '' except: self.output = traceback.format_exc() else: self.output = text def extract_keys(self, string): "Extract keys to decryption and return the cipher-text area." header, cipher = string.split('\n\n', 1) *key, primer = map(self.repr_to_obj, header.split('\n')) self.key, self.primer = me.Key(tuple(key)), me.Primer(primer) return cipher def extract_text(self, string): "Extract text message from string using built key and primer." text, primer = me.decrypt_str(string, self.key, self.primer) return text ######################################################################## # Provide some special methods to simplify the program's code. @property def encrypting(self): "Encrypting boolean stating current operations mode." return {'encode': True, 'decode': False}[self.mode_var.get()] @staticmethod def bytes_to_repr(obj): "Convert bytes object into suitable representation." if not isinstance(obj, bytes): raise TypeError('Object must be a bytes instance!') return repr(obj)[2:-1] @staticmethod def repr_to_obj(string, prefix='b'): "Convert representation into an equivalent object." for template in '{}"{}"', "{}'{}'": try: return ast.literal_eval(template.format(prefix, string)) except: pass raise ValueError('Cannot convert {!r} to object!'.format(string)) @classmethod def main(cls): "Create context for demo and run a test instance." NoDefaultRoot() root = Tk() root.minsize(420, 330) root.title('Markov Demo 2') test = cls(root) test.grid(sticky=NSEW) root.grid_rowconfigure(0, weight=1) root.grid_columnconfigure(0, weight=1) root.mainloop()
class SshPanel(Frame): def __init__(self, parent): Frame.__init__(self, parent) self.scrolltext = ScrolledText(self, width = 120, font = ("", 14, "normal"), height = 30) self.scrolltext.config(state = "disable") f = Frame(self) self.entry = Entry(f, width = 75, font = ("", 15, "normal")) # self.entry.grab_set() self.entry.focus_set() self.entry.grid(row = 0, column = 0) self.entry.bind("<Return>", lambda event, frame = self: frame._runCommand()) self.button1 = Button(f, text = "sumbmit", font = ("", 15, "normal"), command = lambda frame = self: frame._runCommand()) self.button1.grid(row = 0, column = 1, padx = 4, pady = 2) self.button2 = Button(f, text = "clear", font = ("", 15, "normal"), command = lambda frame = self: frame._deleteText()) self.button2.grid(row = 0, column = 2, padx = 4, pady = 2) f.grid(row = 1, column = 0) self.scrolltext.grid(row = 0, column = 0) with shelve.open("userconfigdb") as db: keys = tuple(db.keys()) if not keys: configButtonCmd() with shelve.open("userconfigdb") as db: self.sshIP = db[tuple(db.keys())[0]].hostaddress self._configButtonCmd() def _deleteText(self): self.scrolltext.config(state = "normal") self.scrolltext.delete("1.0", END) self.scrolltext.config(state = "disable") def _fetch(self, root, vars): attrs = [] for var in vars: t = var.get() if not t: return attrs.append(t) self.username = attrs[0] self.passwd = attrs[1] root.destroy() def _configButtonCmd(self): popwin = PopupWindow("User Config") popwin.grab_set() popwin.focus() form = Frame(popwin) left = Frame(form) right = Frame(form) bottom = Frame(popwin) form.pack(fill = X) left.pack(side = LEFT) right.pack(side = RIGHT, expand = YES, fill = X) # bottom.pack(side = LEFT) fields = ("username", "password") variables = [] for field in fields: lab = Label(left, width = 10, text = field) ent = Entry(right) lab.pack(side = TOP) ent.pack(side = TOP, fill = X) var = StringVar() ent.config(textvariable = var) variables.append(var) Button(popwin, text = "Ok", font = ("", 15, "normal"), command = (lambda vars = variables, root = popwin: self._fetch(root, vars))).pack() def _runCommand(self): command = self.entry.get() self.entry.delete(0, END) self.scrolltext.config(state = "normal") if command != "": ssh = paramiko.SSHClient() try: ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # print(self.username, self.passwd) ssh.connect(self.sshIP, 22, self.username, self.passwd, timeout = 10) stdin,stdout,stderr = ssh.exec_command(command) out = stdout.readlines() err = stderr.readlines() for r in out: self.scrolltext.insert(END, " " + r) for r in err: self.scrolltext.insert(END, " " + r) except: pass finally: ssh.close() self.scrolltext.insert(END, "---------------------------------\n") self.scrolltext.config(state = "disable") self.scrolltext.see("end")
class App(tk.Tk): def __init__(self): tk.Tk.__init__(self) self.title("Keyboard Control of Robot Arm") self.arm = Arm() ## self.arm.command_timeout = 50 # if arm still timeout's then uncomment this line and increase value f = tk.Frame(self) f.pack(side="top", expand=True, fill="x") f1 = tk.Frame(f, bd=1, relief="sunken") f1.pack(side="left") tk.Label(f1, text="Function:") .grid(column=1, row=1, sticky="w") tk.Label(f1, text="Key:") .grid(column=2, row=1, sticky="w") tk.Label(f1, text="Base Left:") .grid(column=1, row=2, sticky="w") tk.Label(f1, text="Left") .grid(column=2, row=2, sticky="w") tk.Label(f1, text="Base Right:") .grid(column=1, row=3, sticky="w") tk.Label(f1, text="Right") .grid(column=2, row=3, sticky="w") tk.Label(f1, text="Shoulder Up:") .grid(column=1, row=4, sticky="w") tk.Label(f1, text="Up") .grid(column=2, row=4, sticky="w") tk.Label(f1, text="Shoulder Down:") .grid(column=1, row=5, sticky="w") tk.Label(f1, text="Down") .grid(column=2, row=5, sticky="w") f2 = tk.Frame(f, bd=1, relief="sunken") f2.pack(side="left") tk.Label(f2, text="Function:") .grid(column=3, row=1, sticky="w") tk.Label(f2, text="Key:") .grid(column=4, row=1, sticky="w") tk.Label(f2, text="Elbow Up:") .grid(column=3, row=2, sticky="w") tk.Label(f2, text="Home") .grid(column=4, row=2, sticky="w") tk.Label(f2, text="Elbow Down:") .grid(column=3, row=3, sticky="w") tk.Label(f2, text="End") .grid(column=4, row=3, sticky="w") tk.Label(f2, text="Wrist Up:") .grid(column=3, row=4, sticky="w") tk.Label(f2, text="Insert") .grid(column=4, row=4, sticky="w") tk.Label(f2, text="Wrist Down:") .grid(column=3, row=5, sticky="w") tk.Label(f2, text="Delete") .grid(column=4, row=5, sticky="w") f3 = tk.Frame(f, bd=1, relief="sunken") f3.pack(side="left", fill="y") tk.Label(f3, text="Function:") .grid(column=5, row=1, sticky="w") tk.Label(f3, text="Key:") .grid(column=6, row=1, sticky="w") tk.Label(f3, text="Grip Open:") .grid(column=5, row=2, sticky="w") tk.Label(f3, text="Page-Up") .grid(column=6, row=2, sticky="w") tk.Label(f3, text="Grip Close:") .grid(column=5, row=3, sticky="w") tk.Label(f3, text="Page-Down") .grid(column=6, row=3, sticky="w") tk.Label(f3, text="Toggle Light:") .grid(column=5, row=4, sticky="w") tk.Label(f3, text="L") .grid(column=6, row=4, sticky="w") self.c_window = ScrolledText(self, width=20, height=20) self.c_window.pack(side="top", expand=True, fill="both") self.count = 1 self.lit = False self.bind("<FocusOut>", self.stop_all) self.bind("<Escape>", self.stop_all) self.bind("<l>", self.toggle_light) self.bind("<KeyPress-Prior>", self.grip_open) # page up key self.bind("<KeyRelease-Prior>", self.grip_stop) # page up key self.bind("<KeyPress-Next>", self.grip_close) # page down key self.bind("<KeyRelease-Next>", self.grip_stop) # page down key self.bind("<KeyPress-Left>", self.base_left) self.bind("<KeyRelease-Left>", self.base_stop) self.bind("<KeyPress-Right>", self.base_right) self.bind("<KeyRelease-Right>", self.base_stop) self.bind("<KeyPress-Up>", self.shoulder_up) self.bind("<KeyRelease-Up>", self.shoulder_stop) self.bind("<KeyPress-Down>", self.shoulder_down) self.bind("<KeyRelease-Down>", self.shoulder_stop) self.bind("<KeyPress-Home>", self.elbow_up) self.bind("<KeyRelease-Home>", self.elbow_stop) self.bind("<KeyPress-End>", self.elbow_down) self.bind("<KeyRelease-End>", self.elbow_stop) self.bind("<KeyPress-Insert>", self.wrist_up) self.bind("<KeyRelease-Insert>", self.wrist_stop) self.bind("<KeyPress-Delete>", self.wrist_down) self.bind("<KeyRelease-Delete>", self.wrist_stop) def message(self, message): if (self.count == 1): pass else: self.c_window.insert("end", "\n") self.c_window.insert("end", str(self.count) + "\t" + message) self.c_window.see("end") self.count += 1 def stop_all(self, event=None): self.message("Stop All") self.arm.stop_moving() def base_left(self, event=None): self.message("Base Left") self.arm.base_left() def base_right(self, event=None): self.message("Base Right") self.arm.base_right() def base_stop(self, event=None): self.message("Base Stop") time.sleep(0.1) self.arm.stop_moving() def shoulder_up(self, event=None): self.message("Shoulder Up") self.arm.shoulder_up() def shoulder_down(self, event=None): self.message("Shoulder Down") self.arm.shoulder_down() def shoulder_stop(self, event=None): self.message("Shoulder Stop") time.sleep(0.1) self.arm.stop_moving() def elbow_up(self, event=None): self.message("Elbow Up") self.arm.elbow_up() def elbow_down(self, event=None): self.message("Elbow Down") self.arm.elbow_down() def elbow_stop(self, event=None): self.message("Elbow Stop") time.sleep(0.1) self.arm.stop_moving() def wrist_up(self, event=None): self.message("Wrist Up") self.arm.wrist_up() def wrist_down(self, event=None): self.message("Wrist Down") self.arm.wrist_down() def wrist_stop(self, event=None): self.message("Wrist Stop") time.sleep(0.1) self.arm.stop_moving() def grip_open(self, event=None): self.message("Grip Open") self.arm.grip_open() def grip_close(self, event=None): self.message("Grip Close") self.arm.grip_close() def grip_stop(self, event=None): self.message("Grip Stop") time.sleep(0.1) self.arm.stop_moving() def toggle_light(self, event=None): self.message("Toggle Light") if self.lit: self.arm.light_off() self.lit = False else: self.arm.light_on() self.lit = True
class CipherGUI(Frame): """ Renders a GUI that allows enciphering/deciphering of text using Bruce Schneier's solitaire algorithm. """ def __init__(self, parent): """ Initializes the GUI elements. """ Frame.__init__(self, parent) self.parent = parent self.parent.title("Solitaire Cipher") self.helpFile = open("help.dat", "r") self.helpText = self.helpFile.read() self.aboutFile = open("about.dat", "r") self.aboutText = self.aboutFile.read() self.toCipher = Text(self.parent, undo = 1) self.toCipher.grid(row = 1, column = 1, padx = 10, pady = 10) self.toCipher.insert(END, "Type text to encipher...") self.toDecipher = Text(self.parent, undo = 1) self.toDecipher.grid(row = 2, column = 1, padx = 10, pady = 10) self.toDecipher.insert(END, "Type text to decipher...") lockImage = PhotoImage(file = "lock.gif") unlockImage = PhotoImage(file = "unlock.gif") self.encipherButton = Button(self.parent, text = "Encipher", command = self._encode, padx = 10, pady = 10, image = lockImage, compound = TOP) self.decipherButton = Button(self.parent, text = "Decipher", command = self._decode, padx = 10, pady = 10, image = unlockImage, compound = TOP) #Due to weirdness with Tk's handling of image references, need to keep a throwaway reference #to maintain iamge icons self.encipherButton.image = lockImage self.encipherButton.grid(row = 1, column = 2, padx = 10, pady = 10) self.decipherButton.image = unlockImage self.decipherButton.grid(row = 2, column = 2, padx = 10, pady = 10) splashImage = PhotoImage(file = "splash.gif") self.splashLabel = Label(self.parent, text = "Solitaire Cipher v1.0", image = splashImage, compound = TOP, font = "Courier") self.splashLabel.image = splashImage self.splashLabel.grid(row = 2, column = 0, padx = 10) self.log = ScrolledText(self.parent, width = 30, height = 22) #Can't use console log method yet. self.log.insert(END, ">> Ready. View Help for entry rules.") self.log.state = DISABLED self.log.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = S) self.log.config(state = DISABLED) self.passphrase = Entry(self.parent, show = "*", width = 30) self.passphrase.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = NE) self.passphrase.xview_moveto(0) self.passphraseLabel = Label(self.parent, text = "Passcode:", padx = 8).grid(row = 1, column = 0, sticky = NW, pady = 10) self.menubar = Menu(self.parent) self.menubar.add_command(label = "About", command = self._display_about) self.menubar.add_command(label = "Help", command = self._display_help) self.menubar.add_command(label = "Quit", command = self.quit) self.parent.config(menu = self.menubar) self.parent.iconbitmap("cards-64.ico") def _console_log(self, message): """ Logs events like decode/encode to the console. """ self.log.config(state = NORMAL) self.log.insert(END, "\n>> " + message) self.log.config(state = DISABLED) self.log.see(END) def _encode(self): """ Encodes the contents of toCipher using Cipher class and places in toDecipher. """ passkey = self.passphrase.get() #If text is retrived to END, newline is added. Must go 1 character less. message = self.toCipher.get(1.0, END+"-1c") if self._validate(message, passkey): passkey = passkey.upper() message = message.replace(" ", "").upper() encode = Cipher(message, passkey) encodedMessage = encode.encipher() self._console_log("Encoding successful. \nSee lower box for result.") self.toDecipher.delete(1.0, END) self.toDecipher.insert(END, encodedMessage) elif passkey == "": self._console_log("Error: no passcode entered.") elif message == "": self._console_log("Error: no message entered.") else: self._console_log("Encoding unsuccessful. \nInput contains one or more \nillegal characters. See Help \nfor rules.") def _decode(self): """ Decodes the contents of toDecipher using Cipher class and places in toCipher. """ passkey = self.passphrase.get() #If text is retrived to END, newline is added. Must go 1 character less. message = self.toDecipher.get(1.0, END+"-1c") if self._validate(message, passkey): passkey = passkey.upper() message = message.replace(" ", "").upper() decode = Cipher(message, passkey) decodedMessage = decode.decipher() self._console_log("Decoding successful. \nSee upper box for result.") self.toCipher.delete(1.0, END) self.toCipher.insert(END, decodedMessage) elif passkey == "": self._console_log("Error: no passcode entered.") elif message == "": self._console_log("Error: no message entered.") else: self._console_log("Decoding unsuccessful. \nInput contains one or more \nillegal characters. See Help \nfor rules.") def _validate(self, message, passkey): """ Checks text input from toCipher, toDecipher, and passphrase fields for illegal characters during cipher/decipher processes. """ passkeyOK = passkey.isalpha() messageOK = message.replace(" ", "").isalpha() return passkeyOK and messageOK def _display_help(self): """ Displays help dialog on menu press. """ help = Toplevel() help.grab_set() help.title("Help") help.resizable(0,0) help.iconbitmap("cards-64.ico") helpMessage = Message(help, text = self.helpText, padx = 10, pady = 10) helpMessage.pack() def _display_about(self): """ Displays about dialog on menu press. """ about = Toplevel() about.grab_set() about.title("About") about.resizable(0,0) about.iconbitmap("cards-64.ico") aboutMessage = Message(about, text = self.aboutText, padx = 10, pady = 10) aboutMessage.pack()
class ChatGUI(Frame): def __init__(self, parent, conn, title): #Frame.__init__(self, parent, background="grey") self.parent = parent self.conn = conn self.title = title self.centerWindow() self.initUI() def initUI(self): self.lineCounter = 0 # create a custom font self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic") self.customFontMessage = font.Font(family="Calibri") self.parent.title(self.title) frame = Frame(self.parent) frame.pack(fill=BOTH, expand=1, side=LEFT) self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) self.box.insert(END, 'Welcome to Python Chat!') self.box.config(state=DISABLED) self.box.pack(expand="yes", fill=BOTH, side=TOP) self.textarea = Text(frame, width=30, height=5) #self.textarea.insert(END, "") self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu self.textarea.pack(expand="yes", fill=BOTH, side=TOP) okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) okButton.pack(expand="no", fill=BOTH, side=TOP) self.usersFrame = Frame(self.parent) self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT) self.userListbox = Listbox(self.usersFrame, width=3) self.userListbox.bind("<Double-Button-1>", self.privateChat) self.userListbox.pack(fill=BOTH, expand=1) self.updateUsersFrame() def centerWindow(self): w = 600 h = 475 sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) def gettext(self, e): #e sta per event, questo e' un listener text = self.textarea.get("1.0", END + " - 2c") # 1.0: row:columa - END-2c rimuove l'ultimo carattere, una newline \r\n self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io self.sendToServer(text) def printConversation(self, message): self.box.config(state=NORMAL) self.box.insert(END,"\n" + message) self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) m = re.search("\[.*\].*:", message, re.MULTILINE) if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") self.box.config(state=DISABLED) #self.box.yview_scroll(10000,"units") self.box.see(END) def sendToServer(self, messageToSend): self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict')) def sendFile(self): #aprire una dialog di quelle predefinite (Sfoglia...) #capire come fare la send di un file sul socket... pass def updateUsersFrame(self): global connectedClients self.userListbox.delete(0, END) self.userListbox.insert(END, "Connected users") for item in connectedClients: self.userListbox.insert(END, item) #self.userListbox.update() #self.usersFrame.update() def privateChat(self, e): global conversationBoxList userselected = self.userListbox.selection_get() if not userselected == "Connected users": print("EVVAI CHAT PRIVATA con "+userselected) newWindow = Toplevel(self.parent) newWindow.title("Python Chat with "+userselected) newWindow.minsize(400, 475) newWindow.focus() def disconnectPM(): del conversationBoxList[userselected] newWindow.destroy() newWindow.protocol('WM_DELETE_WINDOW', disconnectPM) #label = Label(newWindow, text="PROVA PROVA") #label.pack(side="top", fill="both", padx=10, pady=10) frame = Frame(newWindow) frame.pack(fill=BOTH, expand=1, side=LEFT) box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) box.config(state=DISABLED) box.pack(expand="yes", fill=BOTH, side=TOP) textarea = Text(frame, width=30, height=5) textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, userselected)) textarea.pack(expand="yes", fill=BOTH, side=TOP) #aggiungo alla mappa globale il box di conversazione conversationBoxList[userselected] = box def receivePrivateChat(self, connectingUser): global conversationBoxList print("CHAT PRIVATA in arrivo con "+connectingUser) newWindow = Toplevel(self.parent) newWindow.title("Python Chat requested by "+connectingUser) newWindow.minsize(400, 475) newWindow.focus() def disconnectPM(): del conversationBoxList[connectingUser] newWindow.destroy() newWindow.protocol('WM_DELETE_WINDOW', disconnectPM) #label = Label(newWindow, text="PROVA PROVA") #label.pack(side="top", fill="both", padx=10, pady=10) frame = Frame(newWindow) frame.pack(fill=BOTH, expand=1, side=LEFT) box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) box.config(state=DISABLED) box.pack(expand="yes", fill=BOTH, side=TOP) textarea = Text(frame, width=30, height=5) textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, connectingUser)) textarea.pack(expand="yes", fill=BOTH, side=TOP) #aggiungo alla mappa globale il box di conversazione conversationBoxList[connectingUser] = box def getprivatetext(self, e, textarea, nickname): text = textarea.get("1.0", END + " - 2c") textarea.delete("0.0", END) self.sendToServer("##" + nickname + "##" + text) def setprivatetext(self, nickname, message, isLocalMessage): #isLocalMessage identifica un messaggio che mando io e che devo ri-ricevere nella mia finestra if isLocalMessage: for i in conversationBoxList.keys(): box = conversationBoxList[i] box.config(state=NORMAL) box.insert(END,"\n" + message) box.config(state=DISABLED) box.see(END) else: conversationbox = conversationBoxList[nickname] conversationbox.config(state=NORMAL) conversationbox.insert(END,"\n" + message) #self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) #m = re.search("\[.*\].*:", message, re.MULTILINE) ''' if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") ''' conversationbox.config(state=DISABLED) #self.box.yview_scroll(10000,"units") conversationbox.see(END)
class ChatGUI(Frame): def __init__(self, parent, conn): #Frame.__init__(self, parent, background="grey") self.parent = parent self.conn = conn self.centerWindow() self.initUI() def initUI(self): self.lineCounter = 0 # create a custom font self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic") self.customFontMessage = font.Font(family="Calibri") self.parent.title("Python Chat") frame = Frame(self.parent) frame.pack(fill=BOTH, expand=1, side=LEFT) self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage) self.box.insert(END, 'Welcome to Python Chat!') self.box.config(state=DISABLED) self.box.pack(expand="yes", fill=BOTH, side=TOP) self.textarea = Text(frame, width=30, height=5) #self.textarea.insert(END, "") self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu self.textarea.pack(expand="yes", fill=BOTH, side=TOP) okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) okButton.pack(expand="no", fill=BOTH, side=TOP) self.usersFrame = Frame(self.parent) self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT) self.userListbox = Listbox(self.usersFrame, width=3) self.userListbox.pack(fill=BOTH, expand=1) self.updateUsersFrame() def centerWindow(self): w = 600 h = 475 sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) def gettext(self, e): #e sta per event, questo e' un listener text = self.textarea.get("1.0", END) # 1.0: row:columa - END-2c rimuove l'ultimo carattere, una newline \r\n if "\n" in text: text = text.replace("\n", "") self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io self.sendToServer(text) def printConversation(self, message): self.box.config(state=NORMAL) self.box.insert(END,"\n" + message) self.lineCounter = self.lineCounter + 2 #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END)) m = re.search("\[.*\].*:", message, re.MULTILINE) if m is not None: #print("MATCH") #print(m.group(0)) #print(str(m.start(0)) + "_" + str(m.end(0))) #print("COUNTER") #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0))) self.box.tag_config("header", font=self.customFontHeader, foreground = "blue") self.box.config(state=DISABLED) #self.box.yview_scroll(10000,"units") self.box.see(END) def sendToServer(self, messageToSend): self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict')) def sendFile(self): #aprire una dialog di quelle predefinite (Sfoglia...) #capire come fare la send di un file sul socket... pass def updateUsersFrame(self): global connectedClients self.userListbox.delete(0, END) self.userListbox.insert(END, "Connected users") for item in connectedClients: self.userListbox.insert(END, item)
class SpinDelight(Frame): def __init__(self): Frame.__init__(self) self.master.geometry("1020x600+150+50") self.master.title("Spin Delight 1.0 - Copyright (c) Robin Thomas") self.master.resizable(0,0) self.grid() self.brwe = Button(self, text = "Browse", command = self.open_file, width = 10, relief = "groove") self.rtxt = Label(self, text="Input Text:") self.txt1 = ScrolledText(self, width = 50, height = 25) self.txt1.bind("<Control-Key-a>", self.select_all_txt1) self.txt1.bind("<Control-Key-A>", self.select_all_txt1) self.spin = Button(self, text = "Spin", command = self.spin_file, width = 10, relief = "groove") self.stxt = Label(self, text="Spun Text:") self.txt2 = ScrolledText(self, width = 50, height = 25) self.txt2.bind("<Control-Key-a>", self.select_all_txt2) self.txt2.bind("<Control-Key-A>", self.select_all_txt2) self.brwe.grid(row = 2, column = 2, pady = 15) self.rtxt.grid(row = 2, column = 0, padx = 25) self.txt1.grid(row = 3, column = 0, columnspan = 10, padx = 25) self.spin.grid(row = 3, column = 12) self.stxt.grid(row = 2, column = 13, padx = 25, pady = 5) self.txt2.grid(row = 3, column = 13, columnspan = 10, padx = 25) def select_all_txt1(self,event): self.txt1.tag_add(SEL, "1.0", END) self.txt1.mark_set(INSERT, "1.0") self.txt1.see(INSERT) return 'break' def select_all_txt2(self,event): self.txt2.tag_add(SEL, "1.0", END) self.txt2.mark_set(INSERT, "1.0") self.txt2.see(INSERT) return 'break' def open_file(self): fname = askopenfilename(filetypes=(("Text files", "*.txt"), ("All files", "*.*") )) if fname: try: self.txt1.delete(0.0, END) f = open(fname,'r') self.txt1.insert(INSERT,f.read()) except: showerror("Open Source File", "Failed to read file\n'%s'" % fname) def spin_file(self): txt = self.txt1.get("1.0", END) self.txt2.delete(0.0, END) if len(txt): try: words = sub(r'([.,?])+', r' \1 ', sub(r'[^a-zA-Z0-9 .,?]+', ' ', txt)).split() w1 = words[0] z = [(words[j - 1], words[j]) for j in range(1, len(words))] values = self.generate_dict(z, w1) string = self.generate_sent(values) if len(string): self.txt2.insert(INSERT, string) else: showerror("Error", "Insufficient data to spin !!") except: showerror("Error", "Nothing to spin !!") def generate_dict(self, x, w1): values = {'.': [w1]} for (wa, wb) in x: if wa in values: values[wa].append(wb) else: values[wa] = [wb] return values def generate_sent(self, values): w1 = '.' w2 = choice(values[w1]) string = w2 values[w1].remove(w2) while values: w1 = w2 if len(values[w1]): w2 = choice(values[w1]) else: del values[w1] w1 = '.' break if w2 in ('.', ',', '?'): string += w2 else: string += " " + w2 values[w1].remove(w2) return string
class myPanel(tkinter.Tk): def __init__(self): tkinter.Tk.__init__(self, 'lsx') self.withdraw() # 先withdraw隐藏再deiconify显示可使setCenter不会导致页面闪烁 self.title('电话簿v1.05 (联系作者:QQ11313213)') # TODO 是否有用 self.keys_var = tkinter.StringVar() self.tex1 = ScrolledText(self) ent1 = tkinter.Entry(self, textvariable=self.keys_var, width=125) ent1.pack(padx=2, pady=2, fill=tkinter.constants.BOTH, side=tkinter.constants.TOP) self.tex1.pack(padx=2, pady=2, fill=tkinter.constants.BOTH, expand=True) self.menu = tkinter.Menu(self, tearoff=0) self.menu.add_command(label='复制', command=self.copyItem) self.menu.add_separator() self.menu.add_command(label='来源') self.menu.add_separator() self.menu.add_command(label='刷新', command=readContacts2) self.menu.add_command(label='前后文', command=self.location) self.menu.add_separator() self.menu.add_command(label='导入文件', command=ImportFiles) self.menu.add_command(label='新增和更改', command=UpdateFile) self.menu0 = tkinter.Menu(self, tearoff=0) self.menu0.add_command(label='刷新', command=readContacts2) self.menu0.add_separator() self.menu0.add_command(label='导入文件', command=ImportFiles) self.menu0.add_command(label='新增和更改', command=UpdateFile) self.menu0.add_separator() submenu = [tkinter.Menu(self, tearoff=0)] self.menu0.add_cascade(label='Designed by Lsx. ', menu=submenu[0]) for key, value in [['Name', 'Li Shixian'], ['Mail', '*****@*****.**'], ['Website', 'github.com/znsoooo/contacts'], ['Wechat', 'Xian_2'], ['Donate', 'xxxx']]: submenu.append(tkinter.Menu(self, tearoff=0)) submenu.append(tkinter.Menu(self, tearoff=0)) submenu[-1].add_command(label=value) submenu[0].add_cascade(label=key, menu=submenu[-1]) self.img_wechat = tkinter.PhotoImage( data=Image.img1) # 没有self会导致显示图片为空白 self.img_donate = tkinter.PhotoImage(data=Image.img2) submenu[8].entryconfig(0, image=self.img_wechat) submenu[10].entryconfig(0, image=self.img_donate) submenu[0].add_separator() submenu[0].add_command(label='All Rights Reserved.', command=bonus) setCenter(self) self.deiconify() ent1.focus() ent1.bind('<KeyRelease>', self.onKeyRelease) self.tex1.bind('<ButtonRelease-3>', self.onRightClick) def select(self, row): self.tex1.mark_set('insert', '%d.0' % row) self.tex1.tag_remove('sel', '0.0', 'end') self.tex1.tag_add('sel', '%d.0' % row, '%d.0' % (row + 1)) def location(self, row=0): if not row: row = self.current_index + 1 self.onKeyRelease(keys='') self.select(row) self.tex1.see('%d.0' % row) def copyItem(self): text = self.tex1.selection_get() self.clipboard_clear() self.clipboard_append(text[:-1]) # 去掉文末换行符 def onRightClick(self, evt=0): self.tex1.focus() # 当焦点在ent1中时 self.current = int(self.tex1.index('current').split('.')[0]) if len(self.index): self.current_index = self.index[self.current - 1] line_last = 0 for line, file in file_list: if line > self.current_index: break else: line_last = line self.menu.entryconfig(2, label='来源: %s (line:%s)' % (file, self.current_index - line_last + 1)) self.menu.entryconfig( 2, command=lambda: os.popen('explorer /select, %s\\%s\\%s' % (os.getcwd(), DATA_FOLDER, file))) self.select(self.current) self.menu.post(evt.x_root, evt.y_root) else: self.menu0.post(evt.x_root, evt.y_root) return self.current def onKeyRelease(self, evt=0, keys=None): if keys is None: keys = self.keys_var.get() keys = keys.lower().split(' ') ss_new = [] self.index = [] for n, s in enumerate(ss): ok = True for key in keys: if key not in s[1]: ok = False if ok: ss_new.append(s[0]) self.index.append(n) # TODO 提出搜索部分到独立的函数 self.tex1.config(state='normal') self.tex1.delete('1.0', 'end') self.tex1.insert('1.0', '\n'.join(ss_new)) self.tex1.config(state='disabled') # 禁止编辑 self.title('电话簿v1.05 (联系作者:QQ11313213) - %s结果' % len(ss_new)) # title更改耗时短可以做到'同时'更改的效果 return ss_new
# スレッドスタート th1.start() #画面の処理 root = tk.Tk() root.title(conf.get('serversetting', 'title')) root.geometry(conf.get('serversetting', 'size')) root.protocol('WM_DELETE_WINDOW', on_closing) #root.protocol("WM_SAVE_YOURSELF", on_closing) #Label lb = tk.Label(text=conf.get('serversetting', 'labeltitle')) lb.pack() #TextBox(スクロール) tx = ScrolledText(root, width=100, height=35) tx.insert('1.0', "") tx.see('end') tx.pack() #チェックボタン 自動読み込みの要否 btval = tk.BooleanVar() btval.set(True) bt_aut = tk.Checkbutton(root, text=conf.get('serversetting', 'btauto'), variable=btval) bt_aut.pack(side=tk.LEFT) #ボタン ログ削除 bt_del = tk.Button(text=conf.get('serversetting', 'btdel'), command=btEvent1, width=10) bt_del.pack(side=tk.LEFT) #ボタン ログ読込 bt_read = tk.Button(text=conf.get('serversetting', 'btread'),
class ChatGUI(Frame): def __init__(self, parent, conn): #Frame.__init__(self, parent, background="grey") self.parent = parent self.conn = conn self.centerWindow() self.initUI() def initUI(self): #mettere qui tutta l'inizializzazione dei frame anche #direi 2 frame, uno left e uno right self.parent.title("Python Chat") frame = Frame(self.parent) frame.pack(fill=BOTH, expand=1, side=LEFT) self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=1, height=20) self.box.insert(END, 'Welcome to Python Chat!') self.box.config(state=DISABLED) self.box.pack(expand="yes", fill=BOTH, side=TOP) self.textarea = Text(frame, width=1, height=5) #self.textarea.insert(END, "") self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu self.textarea.pack(expand="yes", fill=BOTH, side=TOP) okButton = Button(frame, text="Attach file", activebackground="green", command=self.sendFile) okButton.pack(expand="no", fill=BOTH, side=TOP) #per gestire invio con la newline --> http://userpages.umbc.edu/~dhood2/courses/cmsc433/spring2010/?section=Notes&topic=Python¬es=93 #usersFrame = Frame(self.parent) #usersFrame.pack(fill=BOTH, expand=1, side=RIGHT) def centerWindow(self): w = 600 h = 450 sw = self.parent.winfo_screenwidth() sh = self.parent.winfo_screenheight() x = (sw - w)/2 y = (sh - h)/2 self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y)) def gettext(self, e): #e sta per event, questo e' un listener text = self.textarea.get("1.0", END + " - 2c") # 1.0: row:columa - END-2c rimuove l'ultimo carattere, una newline \r\n self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io self.sendToServer(text) def printConversation(self, message): self.box.config(state=NORMAL) self.box.insert(END,"\n" + message) #aggiungo colorazione parte di testo --> troppo complesso per ora ''''m = re.search("", message) lastIndex = len(m.group(0)) self.box.tag_add("header", m.start(), m.stop()) self.box.tag_config("header", foreground="green") ''' self.box.config(state=DISABLED) #self.box.yview_scroll(10000,"units") self.box.see(END) def sendToServer(self, messageToSend): self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict')) def sendFile(self): #aprire una dialog di quelle predefinite (Sfoglia...) #capire come fare la send di un file sul socket... pass
class Application(Frame): def __init__(self, master=None): self.warning = '【封号防止】\n' + \ '请尽量在自己的日常刷魂时间使用\n' + \ '请不要长时间连续使用,任何使你看起来明显违背人类正常作息规律的行为,很容易会被鬼使黑盯上\n' + \ '当你离开了常在城市,请不要使用,这会被认为是找了代练\n' + \ '点到为止,贪婪是万恶之源\n' self.label = r'阴阳师-网易游戏' self.hwnd = None self.shell = None if not self.info_get(): self.scaling = 1 self.clear_time = 35 self.fight = None self.timing_value = None # 控件初始化 Frame.__init__(self, master) self.pack() self.frame1 = Frame(self) self.frame1.pack() self.frame2 = Frame(self) self.frame2.pack() self.label_scaling = Label(self.frame1) self.var_scaling = StringVar(self.frame1) self.entry_scaling = Entry(self.frame1) self.button_scaling_explain = Button(self.frame1) self.label_mode = Label(self.frame1) self.var_mode = StringVar(self.frame1) self.listbox_mode = ttk.Combobox(self.frame1) self.button_mode_explain = Button(self.frame1) self.label_member = Label(self.frame1) self.var_member = IntVar() self.radio1 = Radiobutton(self.frame1) self.radio2 = Radiobutton(self.frame1) self.label_clear_time = Label(self.frame1) self.var_clear_time = StringVar(self.frame1) self.entry_clear_time = Entry(self.frame1) self.button_clear_time_explain = Button(self.frame1) self.label_offer = Label(self.frame1) self.var_offer_mode = StringVar(self.frame1) self.listbox_offer_mode = ttk.Combobox(self.frame1) self.label_timing_mode = Label(self.frame1) self.var_timing_mode = StringVar(self.frame1) self.listbox_timing_mode = ttk.Combobox(self.frame1) self.var_timing_value = StringVar(self.frame1) self.entry_timing_value = Entry(self.frame1) self.entry_test = Entry(self.frame1) self.test_btn = Button(self.frame1) self.start_ctn = Button(self.frame2) self.stop_ctn = Button(self.frame2) self.info_box = ScrolledText(self.frame2) self.queue = Queue(maxsize=1) self._running = 1 self.create_main() @staticmethod def check_hwnd(label): # 获取游戏窗口句柄 hwnd = win32gui.FindWindow(None, label) if hwnd: return hwnd else: print('游戏没有运行') return False @staticmethod def init_window_place(root, x, y): screenwidth = root.winfo_screenwidth() screenheight = root.winfo_screenheight() root.resizable(False, False) root.update_idletasks() root.deiconify() width = root.winfo_width() height = root.winfo_height() size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / x, (screenheight - height) / y) root.geometry(size) def jump_window(self): # 跳转到游戏窗口 win32gui.SetForegroundWindow(self.hwnd) win32gui.PostMessage(self.hwnd, win32con.WM_SYSCOMMAND, win32con.SC_RESTORE, 0) def get_scaling(self): var = self.entry_scaling.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='缩放倍率只能为数字') return False if var > 2: messagebox.showinfo(title='提示', message='缩放倍率过高') return False return var def get_clear_time(self): var = self.var_clear_time.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='平均通关时间只能为数字') return False if var <= 5: messagebox.showinfo(title='提示', message='平均通关时间不能小于5') return False return var def get_timimg(self): if self.listbox_timing_mode.get() == '无': return True var = self.var_timing_value.get() try: var = float(var) except ValueError: messagebox.showinfo(title='提示', message='预定结束只能填入数字') return False if var < 1: messagebox.showinfo(title='提示', message='数字过小,无法执行') return False return var @staticmethod def time_format(second): try: second = int(second) except ValueError: return second if second > 60: m, s = divmod(second, 60) h, m = divmod(m, 60) return ':'.join( (str(h).zfill(2), str(m).zfill(2), str(s).zfill(2))) else: return second def info_get(self): try: with shelve.open('mysetting.db') as data: setting_data = data['setting'] self.scaling = setting_data['scaling'] self.clear_time = setting_data['clear_time'] except KeyError: return False return True def info_save(self): with shelve.open('mysetting.db') as data: setting_data = dict() setting_data['scaling'] = self.var_scaling.get() setting_data['clear_time'] = self.var_clear_time.get() data['setting'] = setting_data def turn_radio_on(self, *args): type(args) var = self.listbox_mode.get() if var == '司机': self.radio1.configure(state='active') self.radio2.configure(state='active') else: self.radio1.configure(state='disabled') self.radio2.configure(state='disabled') def turn_entry_on(self, *args): type(args) var = self.listbox_timing_mode.get() if var == '定时[分钟]' or var == '场数': self.entry_timing_value.configure(state='normal') else: self.entry_timing_value.configure(state='disabled') def fight_start(self): self.scaling = self.get_scaling() if not self.scaling: return False self.clear_time = self.get_clear_time() if not self.clear_time: return False self.timing_value = self.get_timimg() if not self.timing_value: return False self.info_save() # 获取游戏窗口句柄 self.hwnd = self.check_hwnd(self.label) if not self.hwnd: messagebox.showinfo(title='提示', message='游戏没有运行') return False self.shell = win32com.client.Dispatch("WScript.Shell") # self.shell.SendKeys('%') self.jump_window() time.sleep(0.5) self.fight = GameController(self.hwnd, self.scaling) thread1 = threading.Thread(target=self.fight_thread, name='fight_thread') thread2 = threading.Thread(target=self.offer_thread, name='offer_thread') # 将线程状态、队列内容置为1 self._running = 1 if self.queue.empty(): self.queue.put(1) else: self.queue.get() self.queue.put(1) self.start_ctn.configure(state='disabled') self.stop_ctn.configure(state='active') thread1.start() thread2.start() def fight_thread(self): self.jump_window() if not self.queue.empty(): self.queue.get() self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(self.warning) + '\n', 'RED') self.info_box.tag_config('RED', foreground='red') var = '[%s]挂机开始' % datetime.datetime.now().strftime("%H:%M:%S") self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) rounds = 0 total_time = 0 beginning_timg = time.clock() while True: if self._running == 1: fight_start_time = time.clock() self.fight.form_team_phase(self.listbox_mode.get(), self.var_member.get(), self.queue) self.fight.wait_fight_finish_phase(self.clear_time, self.queue) self.jump_window() self.fight.settle_phase(self.queue) if self._running == 1: fight_end_time = time.clock() fight_time = fight_end_time - fight_start_time # time.sleep(0.5) rounds = rounds + 1 total_time = total_time + fight_time elapsed_time = fight_end_time - beginning_timg var = '第 %s 场 耗时:%s 共计:%s' % \ (rounds, self.time_format(fight_time), self.time_format(elapsed_time)) self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) # 检查是否到达预定结束场数或时间 if (self.listbox_timing_mode.get() == '场数' and rounds >= self.timing_value) or \ (self.listbox_timing_mode.get() == '定时[分钟]' and elapsed_time / 60 >= self.timing_value): win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0, 0) self.fight_stop() var = '已到达预定目标,游戏窗口已关闭。下线15分钟后buff自动关闭' self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) time.sleep(random.uniform(1, 2)) elif self._running == 0: return def fight_stop(self): # 将线程状态、队列内容置为0 self._running = 0 self.queue.put(0) self.start_ctn.configure(state='active') self.stop_ctn.configure(state='disabled') var = '[%s]挂机结束。记得关御魂buff' % datetime.datetime.now().strftime( "%H:%M:%S") self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END) def offer_thread(self): while True: if self._running == 1: self.fight.check_offer(self.listbox_offer_mode.get(), self.queue) elif self._running == 0: return @staticmethod def resource_path(relative_path): """ Get absolute path to resource, works for dev and for PyInstaller """ base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__))) return os.path.join(base_path, relative_path) def what_is_scaling_window(self): what_is_scaling = Toplevel(self) what_is_scaling.title('缩放倍率 - 不能自动获取,技术就是这么菜,不服憋着_(:3」∠)_') frame1 = Frame(what_is_scaling) frame1.pack() frame2 = Frame(what_is_scaling) frame2.pack() title = Label(frame1) title['text'] = '\n【 缩放倍率 】' title.pack() desc1 = Message(frame1) desc1['width'] = 600 desc1['text'] = '\n缩放倍率是指Windows系统在不改变分辨率的情况下,将窗口和图标放大以达到更加舒适的显示效果的功能\n' + \ '\n在某些分辨率下,Windows会自动设置一个超过100%的倍率。请确定自己系统当前的缩放倍率设置,并填入缩放倍率一栏中\n' + \ '\n不正确的缩放倍率设置,会导致坐标计算不准\n' + \ '\n若设置的缩放倍率是100%,则填入1,若是125%,则填1.25,依次类推\n' desc1.pack() label_win10 = Label(frame2) label_win10['text'] = 'Windows 10' label_win10.grid(row=0, column=0) label_win7 = Label(frame2) label_win7['text'] = 'Windows 7' label_win7.grid(row=0, column=1) ipath = self.resource_path('image/win10.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img_win10 = Label(frame2, image=render) img_win10.image = render img_win10.grid(row=1, column=0) ipath = self.resource_path('image/win7.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img_win7 = Label(frame2, image=render) img_win7.image = render img_win7.grid(row=1, column=1) self.init_window_place(what_is_scaling, 1.3, 3) def when_click_start_window(self): when_click_start = Toplevel(self) when_click_start.title('模式说明') var = self.listbox_mode.get() if var == '单刷': title = Label(when_click_start) title['text'] = '\n【 单刷模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n请把游戏调整至如图所示界面,再点START\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/single.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size))) render = ImageTk.PhotoImage(load) img = Label(when_click_start, image=render) img.image = render img.pack() elif var == '乘客': title = Label(when_click_start) title['text'] = '\n【 乘客模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n建议接受了司机的默认邀请,再点START\n' + \ '因为我不会在战斗里帮你点开始...不服憋着\n_(:3」∠)_\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/passenger_accept.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size))) render = ImageTk.PhotoImage(load) img = Label(when_click_start, image=render) img.image = render img.pack() elif var == '司机': title = Label(when_click_start) title['text'] = '\n【 司机模式 】' title.pack() desc = Message(when_click_start) desc['text'] = '\n建议对乘客发出默认邀请,回到组队界面再点START\n' + \ '因为自动发出邀请这个功能没写...不服憋着\n_(:3」∠)_\n' desc['width'] = 300 desc.pack() ipath = self.resource_path('image/driver_invite.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img1 = Label(when_click_start, image=render) img1.image = render img1.pack() ipath = self.resource_path('image/driver_form.png') load = PLI_Image.open(ipath) load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size))) render = ImageTk.PhotoImage(load) img2 = Label(when_click_start, image=render) img2.image = render img2.pack() self.init_window_place(when_click_start, 1.3, 3) def what_is_clear_time(self): what_is_clear = Toplevel(self) what_is_clear.title('平均通关时间说明') title = Label(what_is_clear) title['text'] = '\n【 平均通关时间 】' title.pack() desc = Message(what_is_clear) desc['text'] = '\n平均通关时间是指在游戏中,从按下开始战斗到进入结算奖励界面所经过的时间(秒)\n' + \ '\n程序会在经过指定的时间后,再开始检测游戏画面是否进入了结算界面\n' + \ '\n如果设置一个较短的时间也可以,不过设置一个合理的时间,能节省你CPU资源\n(其实也没占多少_(:3」∠)_\n' desc['width'] = 300 desc.pack() self.init_window_place(what_is_clear, 1.3, 3) def create_main(self): self.label_scaling['text'] = '缩放倍率' self.var_scaling.set(self.scaling) self.entry_scaling['textvariable'] = self.var_scaling self.label_scaling.grid(row=0, column=0, sticky='E') self.entry_scaling.grid(row=0, column=1, sticky='W', columnspan=2) self.button_scaling_explain['text'] = '?' self.button_scaling_explain['command'] = self.what_is_scaling_window self.button_scaling_explain['relief'] = 'flat' self.button_scaling_explain.grid(row=0, column=2, sticky='E') self.label_mode['text'] = '模式' self.var_mode.set('单刷') self.listbox_mode['textvariable'] = self.var_mode self.listbox_mode['width'] = 10 self.listbox_mode['values'] = ["单刷", "乘客", "司机"] self.listbox_mode.bind("<<ComboboxSelected>>", self.turn_radio_on) self.label_mode.grid(row=1, column=0, sticky='E') self.listbox_mode.grid(row=1, column=1, sticky='W') self.button_mode_explain['text'] = '?' self.button_mode_explain['command'] = self.when_click_start_window self.button_mode_explain['relief'] = 'flat' self.button_mode_explain.grid(row=1, column=2, sticky='W') self.var_member.set(2) self.label_member['text'] = '车队人数' self.label_member.grid(row=2, column=0, sticky='E') self.radio1['text'] = '2人' self.radio1['variable'] = self.var_member self.radio1['value'] = 2 # self.radio1['command'] = self.test_val3 self.radio1.grid(row=2, column=1, sticky='W') self.radio1.configure(state='disabled') self.radio2['text'] = '3人' self.radio2['variable'] = self.var_member self.radio2['value'] = 3 # self.radio2['command'] = self.test_val3 self.radio2.grid(row=2, column=2, sticky='W') self.radio2.configure(state='disabled') self.label_clear_time['text'] = '平均通关时间' self.var_clear_time.set(self.clear_time) self.entry_clear_time['textvariable'] = self.var_clear_time self.label_clear_time.grid(row=3, column=0, sticky='E') self.entry_clear_time.grid(row=3, column=1, sticky='W', columnspan=2) self.button_clear_time_explain['text'] = '?' self.button_clear_time_explain['command'] = self.what_is_clear_time self.button_clear_time_explain['relief'] = 'flat' self.button_clear_time_explain.grid(row=3, column=2, sticky='E') self.label_offer['text'] = '好友发来悬赏' self.var_offer_mode.set('接受') self.listbox_offer_mode['textvariable'] = self.var_offer_mode self.listbox_offer_mode['width'] = 10 self.listbox_offer_mode['values'] = ["接受", "拒绝"] self.listbox_offer_mode.bind("<<ComboboxSelected>>", self.turn_radio_on) self.label_offer.grid(row=4, column=0, sticky='E') self.listbox_offer_mode.grid(row=4, column=1, sticky='W') self.label_timing_mode['text'] = '预定结束' self.var_timing_mode.set('无') self.listbox_timing_mode['textvariable'] = self.var_timing_mode self.listbox_timing_mode['width'] = 10 self.listbox_timing_mode['values'] = ["无", "定时[分钟]", "场数"] self.listbox_timing_mode.bind("<<ComboboxSelected>>", self.turn_entry_on) self.label_timing_mode.grid(row=5, column=0, sticky='E') self.listbox_timing_mode.grid(row=5, column=1, sticky='W') self.var_timing_value.set('') self.entry_timing_value['textvariable'] = self.var_timing_value self.entry_timing_value['width'] = 5 self.entry_timing_value.configure(state='disabled') self.entry_timing_value.grid(row=5, column=2, sticky='W') self.start_ctn['text'] = 'START' self.start_ctn['width'] = 10 self.start_ctn['height'] = 2 self.start_ctn['command'] = self.fight_start self.start_ctn['relief'] = 'groove' self.start_ctn.grid(row=0, column=0, sticky='E') self.stop_ctn['text'] = 'STOP' self.stop_ctn['width'] = 10 self.stop_ctn['height'] = 2 self.stop_ctn['command'] = self.fight_stop self.stop_ctn['relief'] = 'groove' self.stop_ctn.grid(row=0, column=1, sticky='W') self.stop_ctn.configure(state='disabled') self.info_box['width'] = 40 self.info_box['height'] = 20 self.info_box.grid(row=1, column=0, columnspan=2) self.info_box.see(END) var = '请授予此程序管理员权限运行,否则在游戏窗口内鼠标无法被控制' self.info_box.mark_set('insert', END) self.info_box.insert('insert', str(var) + '\n') self.info_box.see(END)
class GUI(Tk): # 统计EXCEL写入的数量 all_info: int = 0 # 统计比较结果数量 compare_info: int = 0 # 当前数据 counter: int = 0 # sheet名称 # ChoiceSheetName = '' # open_write_to_excel_button = '' # compare_button = '' # path_excel = '' def __init__(self, parent=None): super().__init__() self.r_value = IntVar(value=0) self.s_value = IntVar() self.r_value.set(1) self.checkVar3 = StringVar(value='0') self.checkVar3.set('0') self.checkVar4 = StringVar(value='0') self.checkVar4.set('0') self.set_init_window() # 设置窗口 def set_init_window(self): self.title("TSM数据处理工具_v1.2") # 窗口名 # self.geometry('320x160+10+10') #290 160为窗口大小,+10 +10 定义窗口弹出时的默认展示位置 self.geometry('790x681+10+10') self.resizable(False, False) ## 规定窗口不可缩放 # self["bg"] = "#f0f8ff" #窗口背景色,其他背景色见:blog.csdn.net/chl0000/article/details/7657887 # self.attributes("-alpha",0.9) #虚化,值越小虚化程度越高 # 标签 # line 1 self.lab = Label(self, text="Lua文件") self.lab.grid(row=0, column=0) self.ent = Entry(self, width=90) self.ent.grid(row=0, column=1, columnspan=10) self.button1 = Button(self, text='Open', command=self.get_file_path) self.button1.grid(row=0, column=11) self.button2 = Button(self, text='submit', state=DISABLED, command=self.submit) self.button2.grid(row=0, column=12) self.ent.insert(0, '在魔兽的WTF/帐号名/SavedVariables目录里, 选择TradeSkillMaster文件') # line 2 self.lab = Label(self, text="类型") self.lab.grid(row=1, column=0) self.str_trans_choice_1_button = Radiobutton(self, text='整体分析', variable=self.r_value, value=1, command=self.choice_value) self.str_trans_choice_1_button.grid(row=1, column=1) self.str_trans_choice_2_button = Radiobutton(self, text='会长关注', variable=self.r_value, value=0, command=self.choice_value) self.str_trans_choice_2_button.grid(row=1, column=2) # line 3 self.lab = Label(self, text="功能") self.lab.grid(row=2, column=0) self.str_trans_choice_3_button = Checkbutton(self, text='写入EXCEL', command=self.myEvent1, variable=self.checkVar3) self.str_trans_choice_3_button.grid(row=2, column=1) self.str_trans_choice_4_button = Checkbutton(self, text='进行标识', command=self.myEvent2, variable=self.checkVar4) self.str_trans_choice_4_button.grid(row=2, column=2) # line 4 self.main_start_button = Button(self, text="处理数据", bg="lightblue", width=10, state=DISABLED, command=self.start_main) # 调用内部方法 加()为直接调用 self.main_start_button.grid(row=4, column=1) self.luatimemsg = StringVar() self.luatimemsg.set('读取lua文件修改时间:') self.luatimelab = Label(self, textvariable=self.luatimemsg) self.luatimelab.grid(row=4, column=2, columnspan=5, padx=5, pady=5, sticky='w') self.readconftimemsg = StringVar() self.readconftimemsg.set('读取Config.ini时间:') self.readconftimelab = Label(self, textvariable=self.readconftimemsg) self.readconftimelab.grid(row=4, column=7, columnspan=5, padx=5, pady=5, sticky='w') # line 5 self.log_label = Label(self, text="日志") self.log_label.grid(row=6, column=0) # self.log_test_label = Label(self, text="结果") # self.log_test_label.grid(row=5, column=12) # line 6 # 文本框 self.log_data_Text = ScrolledText(self, width=80, height=35) # 日志框 self.log_data_Text.grid(row=14, column=0, columnspan=14, sticky=S + W + E + N) # self.log_test_Text = Text(self, width=70, height=35) # 结果 # self.log_test_Text.grid(row=14, column=12, columnspan=10) # line 7 self.msg = StringVar() self.msg.set('运行状态: 等待中...') self.msb_l = Label(self, textvariable=self.msg) self.msb_l.grid(row=16, column=0, columnspan=3, padx=5, pady=5, sticky='w') # 功能函数 def start_main(self): global open_write_to_excel_button global compare_button self.write_log_to_Text('* * * * * 程序开始执行 * * * * *') self.main_start_button['state'] = 'disable' files = self.file_path self.msg.set('运行状态: 开始执行...') print('self.r_value.get()',self.r_value.get()) #默认的值 为数字 1 if self.r_value.get() == 1: ChoiceSheetName = '1' self.write_log_to_Text('整体分析被选中') print(self.checkVar3.get(), self.checkVar4.get()) print(type(self.checkVar3.get()), type(self.checkVar4.get())) if self.checkVar4.get() == '0' and self.checkVar3.get() == '0': open_write_to_excel_button = '0' compare_button = '0' print('open_write_to_excel_button', open_write_to_excel_button) print('compare_button', compare_button) self.write_log_to_Text('功能模块未选内容,请先选择') return elif self.r_value.get() == 0: ChoiceSheetName = '0' self.write_log_to_Text('会长关注被选中') print(self.checkVar3.get(), self.checkVar4.get()) print(type(self.checkVar3.get()), type(self.checkVar4.get())) if self.checkVar4.get() == '0': compare_button = '0' print('open_write_to_excel_button', open_write_to_excel_button) print('compare_button', compare_button) self.write_log_to_Text('进行标识未选择') thread_main = threading.Thread(target=main, args=( ChoiceSheetName, open_write_to_excel_button, compare_button, files, path_excel)) thread_main.start() # 此处线程不推荐使用 join方法,使用后,GUI界面会卡死 print(ChoiceSheetName, open_write_to_excel_button, compare_button, files, path_excel) # main(ChoiceSheetName,open_write_to_excel_button,compare_button,files,path_excel) # 获取当前时间 def get_current_time(self): current_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) return current_time # 日志动态打印 def write_log_to_Text(self, logmsg): global LOG_LINE_NUM current_time = self.get_current_time() logmsg_in = str(current_time) + " " + str(logmsg) + "\n" # 换行 self.log_data_Text.insert(END, logmsg_in) self.log_data_Text.see(END) self.log_data_Text.update() def choice_value(self): global ChoiceSheetName print(self.r_value.get()) if self.r_value.get() == 1: ChoiceSheetName = '1' self.write_log_to_Text('整体分析被选中,会长关注被取消') elif self.r_value.get() == 0: ChoiceSheetName = '0' self.write_log_to_Text('会长关注被选中,整体分析被取消') else: return # def choice_2_value(self): # global ChoiceSheetName # print(self.r_value.get()) # ChoiceSheetName = str(self.r_value.get()) # self.write_log_to_Text('会长关注被选中') def get_file_path(self): # 获取文件路径 self.ent.delete(0, END) # 先清空文件名框内的内容 self.file_name = askopenfilename(filetypes=[('All Files', 'TradeSkillMaster.lua')]) # 弹出文件复选框,选择文件,可以指定文件类型以过滤 if self.file_name: self.ent.insert(END, self.file_name) # 显示文件名,用insert方法把文件名添加进去 if (self.button2['state'] == DISABLED): self.button2['state'] = NORMAL else: self.button2['state'] = NORMAL else: return def submit(self): # 点击提交的时候获取button内回调函数的变量值,这里是文件路径 # src = self.init_data_Text.get(1.0, END).strip().replace("\n", "").encode() self.file_path = self.ent.get().strip().replace("\n", "").encode() self.button2['state'] = DISABLED ChoiceSheetName = None if self.file_path: print(self.file_path) # 用组件Entry的get获取输入框内的字符串,其在组件被销毁前就被取到 self.write_log_to_Text('TSM.lua文件已选择,路径为:%s' % str(self.file_path, encoding='utf-8')) # 拿 到 选择文件的时间信息 self.luatimemsg.set('读取lua文件修改时间:' + str(get_FileModiTime(self.file_path))) # self.luatimemsg='读取lua文件修改时间:' + str(get_FileModiTime(self.file_path)) print(str(get_FileModiTime(self.file_path))) if (self.main_start_button['state'] == DISABLED): self.main_start_button['state'] = NORMAL else: self.main_start_button['state'] = NORMAL else: return # self.destory() # 中断循环,即主程序跳出无限循环mainloop(),但是这里是销毁的Frame组件,因为self指的是Frame的派生 # root.destroy() #同样是跳出mainloop(),但是这里销毁的是主窗口Tk(),默认情况下它是所有tkinter 组件的父容器 def myEvent1(self): global count1 global open_write_to_excel_button if count1 % 2 == 0: count1 += 1 self.write_log_to_Text("写入EXCEL被选中") open_write_to_excel_button = '1' else: count1 += 1 self.write_log_to_Text("写入EXCEL被取消") open_write_to_excel_button = '0' def myEvent2(self): global count2 global compare_button if count2 % 2 == 0: count2 += 1 compare_button = '1' self.write_log_to_Text("进行标识被选中") else: count2 += 1 compare_button = '0' self.write_log_to_Text("进行标识被取消")
class GUI(GUITools.MainWindow): ITEMS_PER_WAKE = 10 WAKE_INTERVAL = 100 def __init__(self, app_name): GUITools.MainWindow.__init__(self, app_name) self.displayStart() def displayStart(self): self.container = Frame(self) self.container.pack(expand=YES, fill=BOTH) msg = 'Downloader by Sam Howes\nPress Start to begin downloading!' Label(self.container, text=msg).pack(side=TOP, expand=YES, fill=BOTH) Button(self.container, text='Start!', command=self.onStart).pack(side=TOP, expand=YES, anchor=S) def onStart(self): self.stdout = GUITools.TSafeRedirect() # Create a buffer to replace stdout self.systemStreams = (sys.stdin, sys.stdout, sys.stderr) # Save the system streams to replace them later sys.stdout = self.stdout # Redirect writes to stdout and stderr sys.stderr = self.stdout newFrame = Frame(self) # Create a display for the stdout self.textDisplay = ScrolledText(newFrame) self.textDisplay.config(state=DISABLED) # make it read only self.container.pack_forget() # remove the old window contents del self.container # explicitly delete to destroy the elements self.mainContainer = newFrame # Replace the windows content self.progressContainer = Frame(self) self.progressContainer.pack(side=BOTTOM, fill=X) self.mainContainer.pack(expand=YES, fill=BOTH) # Pack now to display the frame self.textDisplay.pack(expand=YES, fill=BOTH) self.callbackQ = Queue() # Kick off the main worker thread to start downloading self.mainWorker = DownloadMaster(self, self.callbackQ, name='DownloadMaster') #self.mainWorker = DryRun(self, self.callbackQ, name='DryRun') self.mainWorker.start() self.after(self.WAKE_INTERVAL, self.onWake) # Set the timer to refresh the GUI def newProgressBox(self, title, totalBytes, progressFunc): self.progressBox = GUITools.ProgressBox(self.progressContainer, title, totalBytes, progressFunc) self.progressBox.pack(side=BOTTOM, fill=X) def deleteProgressBox(self): self.progressBox.cancelUpdate() self.progressBox.pack_forget() del self.progressBox def onWake(self): if not self.stdout.isEmpty(): self.textDisplay.config(state=NORMAL) self.textDisplay.insert(END, self.stdout.clear()) self.textDisplay.see(END) self.textDisplay.config(state=DISABLED) self.textDisplay.update() for ii in range(self.ITEMS_PER_WAKE): try: callback, args = self.callbackQ.get(block=False) except queue.Empty: break else: callback(*args) self.after(self.WAKE_INTERVAL, self.onWake)