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', 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 contViewRaw(self, msgnums, pyedit=True): for msgnum in msgnums: fulltext = self.getMessages(msgnum) if not pyedit: from tkinter.scrolledtext import ScrolledText window = windows.QuietPopupWindow(appname, 'raw message viewer') browser = ScrolledText(window) browser.insert('0.0', fulltext) browser.update() browser.setAllText(fulltext) browser.clearModified()
def contViewRaw(self, msgnums, pyedit=True): for msgnum in msgnums: fulltext = self.getMessage(msgnum) if not pyedit: from tkinter.scrolledtext import ScrolledText window = windows.QuietPopupWindow(appname, 'raw message viewer') browser = ScrolledText(window) browser.insert('0.0', fulltext) browser.pack(expand=YES, fill=BOTH) else: wintitle = ' - raw message text' browser = textEditor.TextEditorMainPopup(self, winTitle=wintitle) browser.update() browser.setAllText(fulltext) browser.clearModified()
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 contViewRaw(self, msgnums, pyedit=True): # необходим полный TextEditor? for msgnum in msgnums: # может быть вложенное определение fulltext = self.getMessage(msgnum) # полный текст - декодированный Юникод if not pyedit: # вывести в виждете scrolledtext from tkinter.scrolledtext import ScrolledText window = windows.QuietPopupWindow(appname, 'raw message viewer') browser = ScrolledText(window) browser.insert('0.0', fulltext) browser.pack(expand=YES, fill=BOTH) else: # в 3.0/4Е: более полноценный текстовый редактор PyEdit wintitle = ' - raw message text' browser = textEditor.TextEditorMainPopup(self, winTitle=wintitle) browser.update() browser.setAllText(fulltext) browser.clearModified()
def contViewRaw(self, msgnums, pyedit=True): # do we need full TextEditor? for msgnum in msgnums: # could be a nested def fulltext = self.getMessage(msgnum) # fulltext is Unicode decoded if not pyedit: # display in a scrolledtext from tkinter.scrolledtext import ScrolledText window = windows.QuietPopupWindow(appname, 'raw message viewer') browser = ScrolledText(window) browser.insert('0.0', fulltext) browser.pack(expand=YES, fill=BOTH) else: # 3.0/4E: more useful PyEdit text editor wintitle = ' - raw message text' browser = textEditor.TextEditorMainPopup(self, winTitle=wintitle) browser.update() browser.setAllText(fulltext) browser.clearModified()
def intr_cmd(self): toplevel = Toplevel(self.master) toplevel.title('About PCAP Tree Viewer') scrolledtext = ScrolledText( toplevel, font=('Courier New', 12), width=50, height=20 ) scrolledtext.pack() try: with open('assets/about', 'r') as file_: for line in file_: scrolledtext.insert(END, line) scrolledtext.update() scrolledtext.config(state=DISABLED) toplevel.resizable(width=False, height=False) except FileNotFoundError: showerror("Something's missing.", 'Unable to fine ABOUT.')
def help_cmd(self): toplevel = Toplevel(self.master) toplevel.title('PCAP Tree Viewer Help') scrolledtext = ScrolledText( toplevel, font=('Courier New', 12), width=57, height=20 ) scrolledtext.pack() try: with open('assets/manual', 'r') as file_: for line in file_: scrolledtext.insert(END, line) scrolledtext.update() except FileNotFoundError: showerror("Something's missing!", 'Unable to find MANUAL.') return scrolledtext.config(state=DISABLED) toplevel.resizable(width=False, height=False)
def contVieRaw(self, msgnums, pyedit=True): for msgnum in msgnums: fulltext = self.getMessage(msgnum) if not pyedit: # display in scrolledtext from tkinter.scrolledtext import ScrolledText window = windows.QuietPopupWindow(appname, 'raw message viewer') browser = ScrolledText(window) browser.insert('0.0', fulltext) browser.pack(expand=YES, fill=BOTH) else: # display in PyNote #wintitle = ' - raw message text' browser = PyNote.TextEditorMainPopup(self) browser.update() browser.setAllText(fulltext) browser.clearModified()
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 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 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 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', 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 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)
class Window(Listbox): # Initializes the variables and settings for the project. Finally # executes the create_menu for the menu bar, and the create_notepad # for the text window def __init__(self, master, **kw): # Sets master, or root super().__init__(master, **kw) self.master = master # Set some variables self.current_file_path = '' self.current_file_text = '' self.is_saved = True # Set up the context menu and the text box self.context_popup_menu = Menu(self.master, tearoff=0) self.text_window = ScrolledText(self.master, undo=True) self.text_window.focus() self.user_data = self.text_window.get('1.0', END + '-1c') # Name the window, icon, and start the create functions self.master.title(NAME) # self.master.iconbitmap('./tk/images/icon.ico') self.initiate_shortcuts() self.create_menu() self.create_notepad() self.create_context_menu() # Creates the context menu def create_context_menu(self): # Adds a command for button, separator for separator self.context_popup_menu.add_command(label="Undo", command=lambda: self.undo()) self.context_popup_menu.add_command(label="Redo", command=lambda: self.redo()) self.context_popup_menu.add_separator() self.context_popup_menu.add_command( label="Cut", command=lambda: self.text_window.event_generate("<<Cut>>")) self.context_popup_menu.add_command( label="Copy", command=lambda: self.text_window.event_generate("<<Copy>>")) self.context_popup_menu.add_command( label="Paste", command=lambda: self.text_window.event_generate("<<Paste>>")) self.context_popup_menu.add_separator() self.context_popup_menu.add_command(label="Delete", command=lambda: self.clear()) self.context_popup_menu.add_separator() self.context_popup_menu.add_command(label="Select All", command=lambda: self.select_all()) # Creates the top bar menu def create_menu(self): # Creating menu bar and adding it to master menu_bar = Menu(self.master) text = self.text_window # Telling root that menu_bar is the Window's menu self.master.config(menu=menu_bar) # Creating the File menu dropdown file_menu = Menu(menu_bar, tearoff=False) file_menu.add_command(label="New Document...", command=self.new_file, accelerator="Ctrl+N") file_menu.add_command(label="Open Document...", command=self.open_file, accelerator="Ctrl+O") file_menu.add_command(label="Save...", command=self.save_file, accelerator="Ctrl+S") file_menu.add_command(label="Save as...", command=self.save_as_file, accelerator="Ctrl+Shift+S") file_menu.add_separator() file_menu.add_command(label="Quit", command=self.exit, accelerator="Ctrl+Q") # Adding it to the menu_bar menu_bar.add_cascade(label="File", menu=file_menu, underline=0) # Creating the Edit menu dropdown edit_menu = Menu(menu_bar, tearoff=False) edit_menu.add_command(label="Undo", command=self.undo, accelerator="Ctrl+Z") edit_menu.add_command(label="Redo", command=self.redo, accelerator="Ctrl+Y") edit_menu.add_separator() edit_menu.add_command(label="Cut", command=lambda: text.event_generate("<<Cut>>"), accelerator="Ctrl+X") edit_menu.add_command(label="Copy", command=lambda: text.event_generate("<<Copy>>"), accelerator="Ctrl+C") edit_menu.add_command(label="Paste", command=lambda: text.event_generate("<<Paste>>"), accelerator="Ctrl+V") edit_menu.add_separator() edit_menu.add_command(label="Select All", command=lambda: self.select_all(), accelerator="Ctrl+A") edit_menu.add_command(label="Delete", command=self.clear, accelerator="Del") # edit_menu.add_separator() # edit_menu.add_command(label="Settings...", command=settings, accelerator="Ctrl+S") # Adding it to the menu_bar menu_bar.add_cascade(label="Edit", menu=edit_menu) # Creating the Help menu help_menu = Menu(menu_bar, tearoff=False) help_menu.add_command(label="About...", command=about) # Adding it to the menu_bar menu_bar.add_cascade(label="Help", menu=help_menu) # Bind the shortcuts to their specified functions def initiate_shortcuts(self): self.master.bind("<KeyRelease>", lambda event: self.on_text_change()) self.master.bind("<Control-n>", lambda event: self.new_file()) self.master.bind("<Control-o>", lambda event: self.open_file()) self.master.bind("<Control-s>", lambda event: self.save_file()) self.master.bind("<Control-Shift-s>", lambda event: self.save_as_file()) self.master.bind("<Control-q>", lambda event: self.exit()) self.master.bind("<Control-z>", lambda event: self.undo()) self.master.bind("<Control-y>", lambda event: self.redo()) self.text_window.bind("<Control-a>", lambda event: self.select_all()) # self.master.bind("<Control-s>", lambda event: settings()) self.master.bind("<Button-3>", lambda event: self.right_click_popup(event)) # Display context menu popup def right_click_popup(self, event): try: # Used +45 and + 12 to corner it self.context_popup_menu.tk_popup(event.x_root + 45, event.y_root + 12, 0) finally: self.context_popup_menu.grab_release() # Scaling the text_window to fit the screen def create_notepad(self): self.text_window.pack(fill="both", expand=True) # Returns the value of the text field def get_text_data(self): return self.text_window.get('1.0', END + '-1c') # Clears the text off the screen, resets the variables def clear_text(self): self.text_window.delete('1.0', END) self.current_file_path = '' self.current_file_text = '' # Called when typing, sets the is_saved variable def on_text_change(self): # If the text in the textbox is equal to the saved text in the variable # This is used when opening a file, changing something, then undoing that change if self.get_text_data() == self.current_file_text: self.is_saved = True else: # If the saved file exists or is valid if os.path.isfile(self.current_file_path): # Open the file, save it's data to this_file with open(self.current_file_path, "r") as f: this_file = f.read() # If this_file is equal to the same text in the textbox # Used if no changes were made, and if they were, set to False self.is_saved = True if this_file == self.get_text_data( ) else False else: # If the data is not equal to variable, and no file, then changes # must have been made self.is_saved = False # MENU CONTROL FUNCTIONS # Clear current selection, erase the current file if saved def new_file(self): # If it's saved, clear it and set the file to saved if self.is_saved is True: self.clear_text() self.is_saved = True else: # Popup the saved popup popup_value = is_saved_popup() if popup_value == "yes": # Save the file, clear it and set the is_saved to True if self.save_file() is True: self.clear_text() self.is_saved = True elif popup_value == "no": # Don't save the file, but clear it and set the is_saved to True self.clear_text() self.is_saved = True else: # Something went wrong print("Error: new_file error") # Open a file if the current file is saved, then insert new file data def open_file(self): # If file is saved, open the open_file window if self.is_saved is True: self.open_file_popup() else: # Save the file, if it's saved, open the open_file window popup_value = is_saved_popup() if popup_value == "yes": if self.save_file() is True: self.is_saved = True self.open_file_popup() # Open the open_file window elif popup_value == "no": self.open_file_popup() else: # An error occurred print("Error: open_file error") # The function that displays the open_file popup def open_file_popup(self): # Gets old data from current file old_file = self.current_file_path # Opens the file location, stores it in file_name file_name = filedialog.askopenfilename( title="Open", filetypes=(("Text files", "*.txt"), ("All files", "*.*"))) # If a file was actually selected, open it if file_name is not '': with open(file_name) as f: data = f.read() # Clear current text self.clear_text() # Set the path variable of the new file self.current_file_path = file_name if os.path.isfile( file_name) else old_file # Add the file data to the text_box self.text_window.insert(INSERT, data) # Add the file data to the variable self.current_file_text = data # is_saved is True self.is_saved = True # Save file, if file exists, overwrite it, otherwise, call save_as_file function def save_file(self): # If the file path exists if os.path.isfile(self.current_file_path): # Stores the current text data into the variable self.current_file_text = self.get_text_data() # Saves the data to the existing file (overwriting) with open(self.current_file_path, "w") as f: return True if f.writelines( self.get_text_data()) is True else False else: # File doesn't exist, call save_as_file if self.save_as_file() is True: return True # Saves file with asksaveasfile to open a save as window. def save_as_file(self): # Gets old file path old_file = self.current_file_path # Opens save_as window file_name = filedialog.asksaveasfilename( title="Save As", defaultextension=".txt", filetypes=(("Text files", "*.txt"), ("All files", "*.*"))) # Set current file path self.current_file_path = old_file if file_name is None else file_name # If the file_path already exists if os.path.isfile(self.current_file_path): # Copy the current text to the variable self.current_file_text = self.get_text_data() # Writes to the named file with open(self.current_file_path, "w") as f: f.writelines(self.get_text_data()) return True else: # A file wasn't selected if file_name is '': print("Error: File is none") return False # Create a new file to store the data self.current_file_text = self.get_text_data() with open(file_name, 'w'): pass self.is_saved = True return True # Exit override command def exit(self): # If the file is saved, exit if self.is_saved is True: self.master.quit() else: # If the file is not saved, call the saved_popup popup_value = is_saved_popup() if popup_value == "yes": # Save and then quit if self.save_file() is True: self.is_saved = True self.quit() elif popup_value == "no": # Don't save, just quit self.master.quit() else: # An error occurred print("Error: open_file error") # Undo last action def undo(self): self.text_window.edit_undo() # Redo last action def redo(self): self.text_window.edit_redo() # Clear (delete) the selected text def clear(self): self.text_window.delete(SEL_FIRST, SEL_LAST) self.text_window.update() # Select the selected text (without new line) def select_all(self): self.text_window.tag_add(SEL, "1.0", END + '-1c') self.text_window.mark_set(INSERT, "1.0") self.text_window.see(INSERT) return 'break'
class ChatForm(tk.Frame): font_color = "#000000" font_size = 10 user_list = [] tag_i = 0 def remove_listener_and_close(self): remove_message_listener(self.message_listener) client.util.socket_listener.remove_listener(self.socket_listener) self.master.destroy() if self.target['id'] in client.memory.window_instance[self.target['type']]: del client.memory.window_instance[self.target['type']][self.target['id']] def message_listener(self, data): self.digest_message(data) def socket_listener(self, data): if data['type'] == MessageType.query_room_users_result: if data['parameters'][1] != self.target['id']: return # [id, nickname, online, username] self.user_list = data['parameters'][0] self.refresh_user_listbox() if data['type'] == MessageType.room_user_on_off_line: # [room_id, user_id, online] if data['parameters'][0] != self.target['id']: return for i in range(0, len(self.user_list)): if self.user_list[i][0] == data['parameters'][1]: self.user_list[i][2] = data['parameters'][2] self.refresh_user_listbox() def refresh_user_listbox(self): # [id, nickname, online, username] self.user_listbox.delete(0, END) self.user_list.sort(key=lambda x: x[2]) for user in self.user_list: self.user_listbox.insert(0, user[1] + ("(在线)" if user[2] else "(离线)")) self.user_listbox.itemconfig(0, {'fg': ("green" if user[2] else "#999")}) def digest_message(self, data): time = datetime.datetime.fromtimestamp( int(data['time']) / 1000 ).strftime('%Y-%m-%d %H:%M:%S') self.append_to_chat_box(data['sender_name'] + " " + time + '\n', ('me' if client.memory.current_user['id'] == data[ 'sender_id'] else 'them')) # type 0 - 文字消息 1 - 图片消息 if data['message']['type'] == 0: self.tag_i += 1 self.chat_box.tag_config('new' + str(self.tag_i), lmargin1=16, lmargin2=16, foreground=data['message']['fontcolor'], font=(None, data['message']['fontsize'])) self.append_to_chat_box(data['message']['data'] + '\n', 'new' + str(self.tag_i)) if data['message']['type'] == 1: client.memory.tk_img_ref.append(ImageTk.PhotoImage(data=data['message']['data'])) self.chat_box.image_create(END, image=client.memory.tk_img_ref[-1], padx=16, pady=5) self.append_to_chat_box('\n', '') def user_listbox_double_click(self, _): if len(self.user_listbox.curselection()) == 0: return None index = self.user_listbox.curselection()[0] selected_user_id = self.user_list[len(self.user_list) - 1 - index][0] selected_user_nickname = self.user_list[len(self.user_list) - 1 - index][1] selected_user_username = self.user_list[len(self.user_list) - 1 - index][3] if selected_user_id == client.memory.current_user['id']: return client.memory.contact_window[0].try_open_user_id(selected_user_id, selected_user_nickname, selected_user_username) # pprint(selected_user_id) return def __init__(self, target, master=None): super().__init__(master) self.master = master self.target = target self.user_listbox = tk.Listbox(self, bg='#EEE') client.util.socket_listener.add_listener(self.socket_listener) client.memory.unread_message_count[self.target['type']][self.target['id']] = 0 client.memory.contact_window[0].refresh_contacts() master.resizable(width=True, height=True) master.geometry('660x500') master.minsize(520, 370) self.sc = client.memory.sc if self.target['type'] == 0: self.master.title(self.target['nickname']) if self.target['type'] == 1: self.master.title("群:" + str(self.target['id']) + " " + self.target['room_name']) self.sc.send(MessageType.query_room_users, self.target['id']) self.right_frame = tk.Frame(self, bg='white') self.user_listbox.bind('<Double-Button-1>', self.user_listbox_double_click) if self.target['type'] == 1: self.user_listbox.pack(side=LEFT, expand=False, fill=BOTH) self.right_frame.pack(side=LEFT, expand=True, fill=BOTH) self.input_frame = tk.Frame(self.right_frame, bg='white') self.input_textbox = ScrolledText(self.right_frame, height=10) self.input_textbox.bind("<Control-Return>", self.send_message) self.input_textbox.bind_all('<Key>', self.apply_font_change) self.send_btn = tk.Button(self.input_frame, text='发送消息(Ctrl+Enter)', command=self.send_message) self.send_btn.pack(side=RIGHT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体颜色', command=self.choose_color) self.font_btn.pack(side=LEFT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体大小', command=self.choose_font_size) self.font_btn.pack(side=LEFT, expand=False) self.image_btn = tk.Button(self.input_frame, text='发送图片', command=self.send_image) self.image_btn.pack(side=LEFT, expand=False) self.chat_box = ScrolledText(self.right_frame, bg='white') self.input_frame.pack(side=BOTTOM, fill=X, expand=False) self.input_textbox.pack(side=BOTTOM, fill=X, expand=False, padx=(0, 0), pady=(0, 0)) self.chat_box.pack(side=BOTTOM, fill=BOTH, expand=True) self.chat_box.bind("<Key>", lambda e: "break") self.chat_box.tag_config("default", lmargin1=10, lmargin2=10, rmargin=10) self.chat_box.tag_config("me", foreground="green", spacing1='5') self.chat_box.tag_config("them", foreground="blue", spacing1='5') self.chat_box.tag_config("message", foreground="black", spacing1='0') self.chat_box.tag_config("system", foreground="grey", spacing1='0', justify='center', font=(None, 8)) self.pack(expand=True, fill=BOTH) add_message_listener(self.target['type'], self.target['id'], self.message_listener) master.protocol("WM_DELETE_WINDOW", self.remove_listener_and_close) # 历史消息显示 if target['id'] in client.memory.chat_history[self.target['type']]: for msg in client.memory.chat_history[self.target['type']][target['id']]: self.digest_message(msg) self.append_to_chat_box('- 以上是历史消息 -\n', 'system') def append_to_chat_box(self, message, tags): self.chat_box.insert(tk.END, message, [tags, 'default']) self.chat_box.update() self.chat_box.see(tk.END) def send_message(self, _=None): message = self.input_textbox.get("1.0", END) if not message or message.replace(" ", "").replace("\r", "").replace("\n", "") == '': return self.sc.send(MessageType.send_message, {'target_type': self.target['type'], 'target_id': self.target['id'], 'message': { 'type': 0, 'data': message.strip().strip('\n'), 'fontsize': self.font_size, 'fontcolor': self.font_color } }) self.input_textbox.delete("1.0", END) return 'break' def choose_color(self): _, self.font_color = colorchooser.askcolor(initialcolor=self.font_color) self.apply_font_change(None) def choose_font_size(self): result = simpledialog.askinteger("设置", "请输入字体大小", initialvalue=self.font_size) if result is None: return self.font_size = result self.apply_font_change(None) def apply_font_change(self, _): try: self.input_textbox.tag_config('new', foreground=self.font_color, font=(None, self.font_size)) self.input_textbox.tag_add('new', '1.0', END) except: pass def send_image(self): filename = filedialog.askopenfilename(filetypes=[("Image Files", ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.JPG", "*.JPEG", "*.PNG", "*.GIF"]), ("All Files", ["*.*"])]) if filename is None or filename == '': return with open(filename, "rb") as imageFile: f = imageFile.read() b = bytearray(f) self.sc.send(MessageType.send_message, {'target_type': self.target['type'], 'target_id': self.target['id'], 'message': {'type': 1, 'data': b}})
class Application(Tk): """ 主要的窗口程序,直接继承 tkinter 底层的 Tk 类构建。 """ def __init__(self, master=None): """ 窗口生成时的必要准备。 """ super(Application, self).__init__(master) self.title("Name Fight Ver %s by %s"%(__version__, __author__)) # 设置窗口的大小。 t = self.winfo_screenwidth() // 800 self.geometry("%dx%d"%(400 * t, 250 * t)) # 设置窗口尺寸是否可调。 self.resizable(width=False, height=False) # 自定义一个字体对象。 self.font = Font(self, family="Monospace", size=4 * t, weight=BOLD) # .grid() 布局方式对行或列占据比例的设置,weight 的总值为分母,单个 weight 的值为分子, minsize 为最小宽度。 self.rowconfigure(0, weight=1, minsize=50 * t) self.rowconfigure(1, weight=2) self.columnconfigure(0, weight=1, minsize=100 * t) self.columnconfigure(1, weight=1) self.columnconfigure(2, weight=1) self.columnconfigure(3, weight=1) self.columnconfigure(4, weight=1, minsize=100 * t) # 建立自己定义的对象并解析参数。 self.create_input() self.create_text() self.parse_args(args) def parse_args(self, args): """ 解析 argparse 生成的参数对象。 """ if args.name1 != None: # 可以直接对 Entry() 对象使用 insert() 方法插入数据。 self.name_input1.insert(END, args.name1) self.name_input1.update() if args.name2 != None: self.name_input2.insert(END, args.name2) self.name_input2.update() if (args.name1 != None) and (args.name2 != None): # 如果两个参数都满足就直接调用 callback() 方法去处理,不需要点击按钮。 self.callback() def create_input(self): """ 建立输入玩家名字的输入框和确认按钮。 """ # 分别把两个输入框和自己的提示语整合进一个 Frame() 对象方便布局。 self.input_frame1 = Frame(self) # 提示语,隶属于第一个 Frame,展示在这个 Frame 的第一行。 Label(self.input_frame1,\ text="请输入第一个玩家的名字:",\ font=self.font).grid(row=0) # 建立隶属于第一个 Frame 的文本框对象,用于后续获取文本。 self.name_input1 = Entry(self.input_frame1,\ font=self.font,\ fg="DarkSlateBlue") # 在 Frame 的第二行展示。 self.name_input1.grid(row=1) # 在第一行第一列展示第一个 Frame。 self.input_frame1.grid(row=0, column=0, columnspan=2, padx=30, pady=10) # 绑定回车作为执行键(有问题)。 # self.name_input1.bind(sequence="<Enter>", func=self.callback) # 建立确定按钮,点击后执行 callback() 方法开启对战。 self.save_button = Button(self, text="Fight!",\ state="normal",\ command=self.callback,\ font=self.font,\ fg="red",\ activeforeground="white",\ activebackground="red") self.save_button.grid(row=0, column=2, padx=10, pady=10) # 建立第二个 Frame。 self.input_frame2 = Frame(self) Label(self.input_frame2,\ text="请输入第二个玩家的名字:",\ font=self.font).grid(row=0) self.name_input2 = Entry(self.input_frame2,\ font=self.font,\ fg="DarkSlateBlue") self.name_input2.grid(row=1) self.input_frame2.grid(row=0, column=3, columnspan=2, padx=30, pady=10) # self.name_input2.bind(sequence="<Enter>", func=self.callback) def create_data(self): """ 建立用于展示玩家数据的区域,用Label实时刷新。 """ # 如果已经存在 Frame,就清除它们,防止覆盖不全留下痕迹。 try: self.plr1_frame.destroy() except: pass try: self.plr2_frame.destroy() except: pass # 建立玩家1的 Frame。 self.plr1_frame = Frame(self) # 建立用户1的 Label 集合用来展示数据,便于实时刷新。 self.plr1_labels = { "HP": Label(self.plr1_frame,\ text=str(self.plr1.numbers["HP"]),\ font=self.font,\ fg="CornflowerBlue"), "ATK": Label(self.plr1_frame,\ text=str(self.plr1.numbers["ATK"]),\ font=self.font,\ fg="CornflowerBlue"), "DEF": Label(self.plr1_frame,\ text=str(self.plr1.numbers["DEF"]),\ font=self.font,\ fg="CornflowerBlue"), "SPD": Label(self.plr1_frame,\ text=str(self.plr1.numbers["SPD"]),\ font=self.font,\ fg="CornflowerBlue"), "ACC": Label(self.plr1_frame,\ text=str(self.plr1.numbers["ACC"]),\ font=self.font,\ fg="CornflowerBlue"), "LUK": Label(self.plr1_frame,\ text=str(self.plr1.numbers["LUK"]),\ font=self.font,\ fg="CornflowerBlue") } # 显示固定不变的 Label. Label(self.plr1_frame,\ text=self.plr1_name + " 的数据",\ font=self.font).grid(row=0,\ column=0,\ columnspan=2,\ padx=30,\ pady=20) Label(self.plr1_frame,\ text="体力",\ font=self.font).grid(row=1, column=0, padx=30, pady=20) self.plr1_labels["HP"].grid(row=2, column=0, padx=30, pady=20) Label(self.plr1_frame,\ text="攻击",\ font=self.font).grid(row=3, column=0, padx=30, pady=20) self.plr1_labels["ATK"].grid(row=4, column=0, padx=30, pady=20) Label(self.plr1_frame,\ text="防御",\ font=self.font).grid(row=5, column=0, padx=30, pady=20) self.plr1_labels["DEF"].grid(row=6, column=0, padx=30, pady=20) Label(self.plr1_frame,\ text="速度",\ font=self.font).grid(row=1, column=1, padx=30, pady=20) self.plr1_labels["SPD"].grid(row=2, column=1, padx=30, pady=20) Label(self.plr1_frame,\ text="命中",\ font=self.font).grid(row=3, column=1, padx=30, pady=20) self.plr1_labels["ACC"].grid(row=4, column=1, padx=30, pady=20) Label(self.plr1_frame,\ text="运气",\ font=self.font).grid(row=5, column=1, padx=30, pady=20) self.plr1_labels["LUK"].grid(row=6, column=1, padx=30, pady=20) # self.plr1_frame.rowconfigure(0, weight=1) self.plr1_frame.columnconfigure(0, weight=1) self.plr1_frame.columnconfigure(1, weight=1) self.plr1_frame.grid(row=1, column=0) # 建立玩家2的 Frame。 self.plr2_frame = Frame(self) # 建立玩家2的 Label 集合用来展示数据,便于实时刷新。 self.plr2_labels = { "HP": Label(self.plr2_frame,\ text=str(self.plr2.numbers["HP"]),\ font=self.font,\ fg="CornflowerBlue"), "ATK": Label(self.plr2_frame,\ text=str(self.plr2.numbers["ATK"]),\ font=self.font,\ fg="CornflowerBlue"), "DEF": Label(self.plr2_frame,\ text=str(self.plr2.numbers["DEF"]),\ font=self.font,\ fg="CornflowerBlue"), "SPD": Label(self.plr2_frame,\ text=str(self.plr2.numbers["SPD"]),\ font=self.font,\ fg="CornflowerBlue"), "ACC": Label(self.plr2_frame,\ text=str(self.plr2.numbers["ACC"]),\ font=self.font,\ fg="CornflowerBlue"), "LUK": Label(self.plr2_frame,\ text=str(self.plr2.numbers["LUK"]),\ font=self.font,\ fg="CornflowerBlue") } # 显示固定不变的 Label. Label(self.plr2_frame,\ text=self.plr2_name + " 的数据",\ font=self.font).grid(row=0,\ column=0,\ columnspan=2,\ padx=30,\ pady=20) Label(self.plr2_frame,\ text="体力",\ font=self.font).grid(row=1, column=0, padx=30, pady=20) self.plr2_labels["HP"].grid(row=2, column=0, padx=30, pady=20) Label(self.plr2_frame,\ text="攻击",\ font=self.font).grid(row=3, column=0, padx=30, pady=20) self.plr2_labels["ATK"].grid(row=4, column=0, padx=30, pady=20) Label(self.plr2_frame,\ text="防御",\ font=self.font).grid(row=5, column=0, padx=30, pady=20) self.plr2_labels["DEF"].grid(row=6, column=0, padx=30, pady=20) Label(self.plr2_frame,\ text="速度",\ font=self.font).grid(row=1, column=1, padx=30, pady=20) self.plr2_labels["SPD"].grid(row=2, column=1, padx=30, pady=20) Label(self.plr2_frame,\ text="命中",\ font=self.font).grid(row=3, column=1, padx=30, pady=20) self.plr2_labels["ACC"].grid(row=4, column=1, padx=30, pady=20) Label(self.plr2_frame,\ text="运气",\ font=self.font).grid(row=5, column=1, padx=30, pady=20) self.plr2_labels["LUK"].grid(row=6, column=1, padx=30, pady=20) # self.plr2_frame.rowconfigure(0, weight=1) self.plr2_frame.columnconfigure(0, weight=1) self.plr2_frame.columnconfigure(1, weight=1) self.plr2_frame.grid(row=1,column=4) def data_update(self, labels, fighter): """ 实时更新玩家数据的方法。 """ for x in labels.keys(): if fighter.numbers[x] <= 0: labels[x].configure(text=str(fighter.numbers[x]), fg="red") else: labels[x].configure(text=str(fighter.numbers[x]),\ fg="CornflowerBlue") def create_text(self): """ 建立文本显示区显示对战过程。 """ self.text_display = ScrolledText(self,\ font=self.font,\ fg="DarkSlateGray") # self.text_display.bind("<KeyPress>", lambda e : "break") self.text_display.grid(row=1, column=1, columnspan=3, padx=10, pady=10) def text_print(self, str): """ 将 str 输出到文本框结尾并换行。 """ # tkinter 的 END 对象,指定了输入的索引为文本框末尾。 self.text_display.insert(END, str + '\n') # 实时更新显示内容。 self.text_display.update() # 自动滚动到文本末尾。 self.text_display.see(END) def callback(self, event=None): """ 点击确认之后的回调方法。 """ # 获取用户名。 self.plr1_name = self.name_input1.get() self.plr2_name = self.name_input2.get() # 检查用户名数量。 if (self.plr1_name == '') or (self.plr2_name == ''): showinfo("提示", "你似乎没有把两个名字都填全哦!") return False # 开始战斗时将按钮设置为不可用。 self.save_button["state"] = "disable" self.text_print(self.plr1_name + ' ' + "VS" + ' ' + self.plr2_name) try: # 进行主要的对战流程,设置输出器。 self.main(self.text_print) # except: # pass finally: # 对战结束后将按钮设置为可用。 self.save_button["state"] = "normal" return 0 def main(self, printer=print, delay=0.5): """ 运行主体,循环进行回合直至有输家产生。 """ # 彩蛋。 # if ("日耳曼战神" in plr1_name) or ("日耳曼战神" in plr2_name): # printer("做梦吧你,日耳曼战神永远是最强的,想打赢战神?不可能!") # return 1 # 生成 Fighter 对象。 # self.plr1 = Fighter(self.plr1_name, self.plr2_name, printer) # self.plr2 = Fighter(self.plr2_name, self.plr1_name, printer) if "班长" in self.plr1_name: self.plr1 = Monitor(self.plr1_name, self.plr2_name, printer) else: self.plr1 = Fighter(self.plr1_name, self.plr2_name, printer) if "班长" in self.plr2_name: self.plr2 = Monitor(self.plr2_name, self.plr1_name, printer) else: self.plr2 = Fighter(self.plr2_name, self.plr1_name, printer) # if "Misaka" in # 获取敌对对象。 self.plr1.get_enemy(self.plr2) self.plr2.get_enemy(self.plr1) # HP 补偿。 while abs(self.plr1.numbers["HP"] - self.plr2.numbers["HP"]) > 233: if self.plr1.numbers["HP"] < self.plr2.numbers["HP"]: self.plr1.numbers["HP"] += int( abs( self.plr1.numbers["HP"] - self.plr2.numbers["HP"] ) * random.random() ) elif self.plr2.numbers["HP"] < self.plr1.numbers["HP"]: self.plr2.numbers["HP"] += int( abs( self.plr1.numbers["HP"] - self.plr2.numbers["HP"] ) * random.random() ) # 双方的数值检查,最大值 9999。 self.plr1.check() self.plr2.check() # 计算双方 HP 总和的 1 / 2 作为计算上限保证不会一击致命。 hp_limit = int( abs( self.plr1.numbers["HP"] + self.plr2.numbers["HP"] ) / 2 * 0.5 ) # 回合计数器。 i = 0 # 建立玩家数据展示区域。 self.create_data() printer("===========================") # 进行战斗循环。 while ((self.plr1.numbers["HP"] > 0) and (self.plr2.numbers["HP"] > 0)): i += 1 # 根据速度决定谁先攻击。 if self.plr1.numbers["SPD"] >= self.plr2.numbers["SPD"]: self.plr1.check() self.plr2.check() printer("回合 #%d:"%(i)) printer("===========================") time.sleep(delay) # 先手发起攻击。 self.plr1.fight(hp_limit) # 更新双方实时数据。 self.data_update(self.plr1_labels, self.plr1) self.data_update(self.plr2_labels, self.plr2) # 判断是否致命。 if not ((self.plr1.numbers["HP"] > 0)\ and\ (self.plr2.numbers["HP"] > 0)): time.sleep(delay) printer("===========================") time.sleep(delay) break time.sleep(delay) printer("---------------------------") time.sleep(delay) # 后手发起攻击。 self.plr2.fight(hp_limit) self.data_update(self.plr1_labels, self.plr1) self.data_update(self.plr2_labels, self.plr2) elif self.plr1.numbers["SPD"] < self.plr2.numbers["SPD"]: self.plr2.check() self.plr1.check() printer("回合 #%d:"%(i)) printer("===========================") time.sleep(delay) self.plr2.fight(hp_limit) self.data_update(self.plr1_labels, self.plr1) self.data_update(self.plr2_labels, self.plr2) if not ((self.plr1.numbers["HP"] > 0)\ and\ (self.plr2.numbers["HP"] > 0)): time.sleep(delay) printer("===========================") time.sleep(delay) break time.sleep(delay) printer("---------------------------") time.sleep(delay) self.plr1.fight(hp_limit) self.data_update(self.plr2_labels, self.plr2) self.data_update(self.plr1_labels, self.plr1) time.sleep(delay) printer("===========================") time.sleep(delay) # 判断结果。 if self.plr1.numbers["HP"] <= 0 and self.plr2.numbers["HP"] <= 0: # 输出双方最终数据 if self.plr1.numbers["SPD"] >= self.plr2.numbers["SPD"]: self.plr1.check() self.plr2.check() self.data_update(self.plr1_labels, self.plr1) self.data_update(self.plr2_labels, self.plr2) elif self.plr1.numbers["SPD"] < self.plr2.numbers["SPD"]: self.plr2.check() self.plr1.check() self.data_update(self.plr2_labels, self.plr2) self.data_update(self.plr1_labels, self.plr1) time.sleep(delay) # 弹框显示平局。 showinfo("Game Over!",\ "经历 %d 个回合,%s 和 %s 棋逢对手,两败俱伤。"%(i, self.plr1_name, self.plr2_name)) elif self.plr1.numbers["HP"] <= 0 and self.plr2.numbers["HP"] > 0: if self.plr1.numbers["SPD"] >= self.plr2.numbers["SPD"]: self.plr1.check() self.plr2.check() self.data_update(self.plr2_labels, self.plr2) self.data_update(self.plr1_labels, self.plr1) elif self.plr1.numbers["SPD"] < self.plr2.numbers["SPD"]: self.plr2.check() self.plr1.check() self.data_update(self.plr2_labels, self.plr2) self.data_update(self.plr1_labels, self.plr1) time.sleep(delay) # 一号玩家失败。 showinfo("Game Over!",\ "经历 %d 个回合,%s 输了,获胜者是 %s。"%(i, self.plr1_name, self.plr2_name)) elif self.plr1.numbers["HP"] > 0 and self.plr2.numbers["HP"] <= 0: if self.plr1.numbers["SPD"] >= self.plr2.numbers["SPD"]: self.plr1.check() self.plr2.check() self.data_update(self.plr1_labels, self.plr1) self.data_update(self.plr2_labels, self.plr2) elif self.plr1.numbers["SPD"] < self.plr2.numbers["SPD"]: self.plr2.check() self.plr1.check() self.data_update(self.plr2_labels, self.plr2) self.data_update(self.plr1_labels, self.plr1) time.sleep(delay) # 二号玩家失败。 showinfo("Game Over!",\ "经历 %d 个回合,%s 输了,获胜者是 %s。"%(i, self.plr2_name, self.plr1_name)) return 0
class Client(object): logger = StreamLogger = logging.getLogger("FileLogger") def __init__(self): self.is_connected = False self.udp_server_started = False self.raw_server_started = False self.tcp_listen_started = False self.host = conf_read("config/config.conf", "target", "host") self.port = conf_read("config/config.conf", "target", "port") self.buffer = conf_read("config/config.conf", "target", "buffer") self.local_host = conf_read("config/config.conf", "local", "host") self.local_port = conf_read("config/config.conf", "local", "port") self.tcp_sock = None self.udp_sock = None self.raw_sock = None self.window = Tk() self.window.title("Client") self.window.geometry("700x510") Label(self.window, text='Host: ').place(x=25, y=30) Label(self.window, text='Port: ').place(x=25, y=70) Label(self.window, text='Buffer: ').place(x=25, y=110) self.var_host = StringVar() self.var_host.set(conf_read("config/config.conf", "target", "host")) entry_host = Entry(self.window, textvariable=self.var_host) entry_host.place(x=140, y=30) self.btn_connect = Button(self.window, text='Connect', width=12, activeforeground='blue', relief=RAISED, command=self.connect) self.btn_connect.place(x=350, y=30) self.btn_disconnect = Button(self.window, text='Disconnect', width=12, activeforeground='blue', relief=RAISED, command=self.disconnect) self.btn_disconnect.place(x=470, y=30) self.btn_disconnect.config(state="disabled") self.var_port = StringVar() self.var_port.set(conf_read("config/config.conf", "target", "port")) entry_port = Entry(self.window, textvariable=self.var_port) entry_port.place(x=140, y=70) self.var_buffer = StringVar() self.var_buffer.set(conf_read("config/config.conf", "target", "buffer")) entry_buffer = Entry(self.window, textvariable=self.var_buffer) entry_buffer.place(x=140, y=110) self.var_trans_mode = StringVar() Label(self.window, text='Transmission mode').place(x=400, y=65) r1 = Radiobutton(self.window, text='TCP', variable=self.var_trans_mode, activeforeground='blue', value='tcp', command=self.radio_button_changed_tcp) r1.place(x=400, y=85) r1.select() Radiobutton(self.window, text='UDP', variable=self.var_trans_mode, activeforeground='blue', value='udp', command=self.radio_button_changed).place(x=400, y=105) Label(self.window, text='Received msg: ').place(x=25, y=150) self.txt_rev_msg = ScrolledText(self.window, height=10, bd=2, wrap=CHAR, relief='groove', bg="WhiteSmoke") self.txt_rev_msg.place(x=25, y=170) Label(self.window, text='Your msg: ').place(x=25, y=350) self.txt_msg = ScrolledText(self.window, height=6.5, width=57, bd=2, wrap=WORD, relief='groove', bg="WhiteSmoke") self.txt_msg.place(x=25, y=380) self.btn_send = Button(self.window, text='Send', width=15, activeforeground='blue', command=self.send_msg) self.btn_send.place(x=500, y=470) self.window.protocol('WM_DELETE_WINDOW', self.close_window) self.window.mainloop() def connect(self): sock = None self.btn_connect.config({"state": "disabled"}) trans_mode = self.var_trans_mode.get() addr = (self.var_host.get(), int(self.var_port.get())) try: if trans_mode == "tcp": if self.tcp_sock is None or "closed" in str(self.tcp_sock): self.tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock = self.tcp_sock elif trans_mode == "udp": if self.udp_sock is None or "closed" in str(self.udp_sock): self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock = self.udp_sock sock.connect(addr) self.is_connected = True except socket.error as e: self._insert_text(e.strerror) print(e) pass finally: time.sleep(0.5) if trans_mode == "tcp": self._receive_data(trans_mode) if trans_mode == "udp": self._insert_text("UDP connected".encode("utf-8"), trans_mode) self.btn_disconnect.config(state="normal") def radio_button_changed(self): self.btn_connect.config(state="disabled") self.btn_disconnect.config(state="disabled") def radio_button_changed_tcp(self): if self.tcp_sock: if "closed" not in str(self.tcp_sock): self.btn_connect.config(state="normal") self.btn_disconnect.config(state="disabled") else: self.btn_connect.config(state="disabled") self.btn_disconnect.config(state="normal") else: self.btn_connect.config(state="normal") self.btn_disconnect.config(state="disabled") def disconnect(self): self._send_data(self.var_trans_mode.get(), "Connection closed") self._insert_text("Connection closed".encode("utf-8"), self.var_trans_mode.get()) self.btn_disconnect.config(state="disabled") if self.tcp_sock and "closed" not in str(self.tcp_sock): self.tcp_sock.shutdown(2) self.tcp_sock.close() if self.udp_sock and "closed" not in str(self.udp_sock): self.udp_sock.shutdown(2) self.udp_sock.close() self.is_connected = False time.sleep(0.5) self.btn_connect.config(state="normal") def send_msg(self): trans_mode = self.var_trans_mode.get() self.btn_send.config({"state": "disabled"}) data = self.txt_msg.get("0.0", "end") if data: if self.is_connected: self._send_data(trans_mode, data) if not self.tcp_listen_started: self.start_thread(self._start_tcp_listen, (self.tcp_sock, )) self.tcp_listen_started = True else: if trans_mode == "udp": udp_interval = conf_read("config/config.conf", "udp", "interval") try: self.udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) self.udp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) except socket.error as e: self._insert_text(e.strerror) self._send_data(trans_mode, data) if not self.udp_server_started: self.start_thread(self._start_udp_server) self.udp_server_started = True time.sleep(float(udp_interval)) elif trans_mode == "raw_socket": self.send_raw_msg(self.host, data.encode("utf-8")) if not self.raw_server_started: self.start_thread(self._start_raw_server, (self.local_host, )) self.udp_server_started = True else: self._insert_text( "Please connect to a server at first".encode("utf-8"), trans_mode) self.btn_send.config({"state": "normal"}) def send_raw_msg(self, dest_addr, data, packet_id=None): try: my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) except socket.error as e: self._insert_text(e.strerror) print(e.strerror) raise packet_id = packet_id if packet_id else random.randint(0, 0xffff) packet = create_packet(packet_id, data) print("packet:", packet) while packet: sent = my_socket.sendto(packet, (dest_addr, 1)) packet = packet[sent:] rec_packet, addr = my_socket.recvfrom(1024) print(rec_packet) self._insert_text(rec_packet, "raw_socket") self.txt_msg.delete('0.0', 'end') my_socket.close() def start_thread(self, func, params=()): t = threading.Thread(target=func, args=params) t.setDaemon(True) t.start() def _start_raw_server(self, host_ip): if os.name == "nt": protocol = socket.IPPROTO_IP else: protocol = socket.IPPROTO_ICMP try: my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, 1) except socket.error as e: print(e.strerror) raise my_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) my_socket.bind((host_ip, 0)) while True: rec_packet, addr = my_socket.recvfrom(1024) print(rec_packet) #msg = rec_packet[-192:].decode("utf-8").strip("@") self._insert_text("Raw socket msg: {}\n".format(str(rec_packet))) time.sleep(0.1) if not rec_packet: break def _start_udp_server(self): try: my_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) my_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) my_sock.bind((self.local_host, int(self.local_port))) while True: rev_data, address = my_sock.recvfrom(int(self.buffer)) print(rev_data) self.txt_rev_msg.insert(END, "Msg from server: {}".format(rev_data)) self.txt_rev_msg.insert(END, "\n") self.txt_rev_msg.update() if not rev_data: break my_sock.close() except socket.error as e: self._insert_text(e.strerror) print(e) finally: pass def _start_tcp_listen(self, tcp_sock): try: while True: rev_data = tcp_sock.recv(int(self.buffer)) print(rev_data) self.txt_rev_msg.insert(END, "Msg from server: {}".format(rev_data)) self.txt_rev_msg.insert(END, "\n") self.txt_rev_msg.update() if not rev_data: break tcp_sock.close() except socket.error as e: self._insert_text(e.strerror) print(e) finally: pass def _multiple_send(self, data, mysock, addr=None): tcp_interval = conf_read("config/config.conf", "tcp", "interval") udp_interval = conf_read("config/config.conf", "tcp", "interval") sd_buffer = int(self.var_buffer.get()) data_len = len(data) start = 0 while start <= data_len: end_len = sd_buffer if (start + sd_buffer) <= data_len else data_len if not addr: mysock.send(data[start:end_len].encode("utf-8")) time.sleep(float(tcp_interval)) else: mysock.sendto(data[start:end_len].encode("utf-8"), addr) time.sleep(float(udp_interval)) start = start + sd_buffer def _send_data(self, trans_mode, data): addr = (self.var_host.get(), int(self.var_port.get())) tcp_interval = conf_read("config/config.conf", "tcp", "interval") sd_buffer = int(self.var_buffer.get()) data_len = len(data) try: if trans_mode == "tcp": self._multiple_send(data, self.tcp_sock) #self.tcp_sock.send(data.encode("utf-8")) elif trans_mode == "udp": if self.is_connected: self.udp_sock.send(data.encode("utf-8")) else: # self.udp_sock.sendto( # data.encode("utf-8"), # addr) self._multiple_send(data, self.udp_sock, addr) elif trans_mode == "raw_socket": packet_id = random.randint(0, 0xffff) packet = create_packet(packet_id, data.encode("utf-8")) while packet: # The icmp protocol does not use a port, but the function # below expects it, so we just give it a dummy port. sent = self.raw_sock.sendto(packet, (self.var_host.get(), 0)) packet = packet[sent:] else: self.tcp_sock.send(data.encode("utf-8")) #self._receive_data(trans_mode) except socket.error as e: self._insert_text(e.strerror) print(e) finally: time.sleep(float(tcp_interval)) self.txt_msg.delete('0.0', 'end') def _receive_data(self, trans_mode): if trans_mode == "tcp": pass #rev_data = self.tcp_sock.recv(int(self.buffer)) elif trans_mode == "udp": print("udp") rev_data, address = self.udp_sock.recvfrom(int(self.buffer)) elif trans_mode == "raw_socket": rev_data, addr = self.raw_sock.recvfrom(int(self.buffer)) print(rev_data, addr) else: rev_data = self.tcp_sock.recv(int(self.buffer)) #self._insert_text(rev_data, trans_mode) def _insert_text(self, data, trans_mode="na"): if trans_mode == "na": self.txt_rev_msg.insert(END, data) elif trans_mode != "raw_socket": self.txt_rev_msg.insert(END, data.decode("utf-8")) else: self.txt_rev_msg.insert(END, "Raw socket Msg: {}".format(str(data))) self.txt_rev_msg.insert(END, "\n") self.txt_rev_msg.update() def close_window(self): ans = askyesno(title='Confirm', message='Close the window?') if ans: self.window.destroy() if self.tcp_sock and "closed" not in str(self.tcp_sock): self.tcp_sock.shutdown(2) self.tcp_sock.close() if self.udp_sock and "closed" not in str(self.udp_sock): self.udp_sock.close() else: return
class Application(tk.Tk): global packagename def __init__(self): '''初始化''' super().__init__() # 有点相当于tk.Tk() self.__running = True # self.devices_list = devices # 获取设备状态 # self.devices_status = getDevicesStatus() self.devices_list = getdevices_list() self.create_panel_frame() self.__create_cpu_widget() self.__create_menu_widget() # self.__create_monkey_widget() def create_panel_frame(self): '''布局''' package_3 = packagelist_3() # package_s = packagelist_system() self.entryvar = tk.StringVar() #变量 framebar = tk.Frame(self, height=80) framebar.pack(side=TOP) contentframe = Frame(self) contentframe.pack(side=TOP, fill=BOTH, expand=1) pwindow = PanedWindow(contentframe, orient=VERTICAL, showhandle=False, sashrelief=SUNKEN) # 默认是左右分布的 pwindow.pack(fill=BOTH, expand=1) self.frame_top = Frame(pwindow, height=250, width=800) self.frame_top.propagate(0) #0表示父窗口依以子控件大小调整 self.frame_top.pack(fill=BOTH, expand=1) self.frame_bottom = Frame(pwindow) self.frame_bottom.pack(fill=BOTH, expand=1) self.glabel_l = tk.Label(framebar, text='说明:') self.glabel_l.grid(row=0, column=1, sticky=E) tk.Label(framebar, text='全局包名:').grid(row=1, column=1) self.global_package = tk.Entry(framebar, width=30, textvariable=self.entryvar) self.global_package.grid(row=1, column=2, sticky=W) tk.Label(framebar, text='设备:').grid(row=1, column=3) self.devcies_combobox = ttk.Combobox(framebar, values=self.devices_list) self.devcies_combobox.current(0) self.devcies_combobox.grid(row=1, column=4, sticky=W) self.package3_box = ttk.Combobox(framebar, values=package_3) self.package3_box.current(0) self.package3_box.grid(row=1, column=5, sticky=W) self.package3_box.bind('<<ComboboxSelected>>', self.go) self.data_text = ScrolledText(self.frame_bottom) self.data_text.pack(fill=BOTH, expand=1) # self.data_text = Scrollbar(textPad) # 右侧的移动下滑栏 # textPad.config(yscrollcommand=scroll.set) # 在Y轴显示 yscrollcommand # scroll.config(command=textPad.yview) # 这是为了让编辑内容和下拉栏同时移动 # scroll.pack(side=RIGHT, fill=Y) # 显示 pwindow.add(self.frame_top) pwindow.add(self.frame_bottom) def go(self, *args): messagebox.showinfo("提示", self.package3_box.get()) def __create_cpu_widget(self): '''创建cpu控件''' self.lable_f = LabelFrame(self.frame_top, text="性能测试", padx=10, pady=10) self.lable_f.pack(fill=BOTH, expand=1) # Label(self.lable_f,text='包名:').grid(row=0,column=1) # self.global_package = Entry(self.lable_f,width=50) # self.global_package.grid(row=0,column=2) Label(self.lable_f, text='间隔时间(s):').grid(row=1, column=1, padx=10, pady=10) intervaTime_ev = [3, 5, 10, 15] # 这里还原可以增加可以选择的次数 self.intervatime_t = ttk.Combobox(self.lable_f, values=intervaTime_ev) self.intervatime_t.current(0) self.intervatime_t.grid(row=1, column=2, sticky=W) Label(self.lable_f, text='持续时间(分):').grid(row=3, column=1, padx=10) chixuntime_ev = [5, 10, 20, 30, 60] # 持续执行时间以分钟为单位 self.chixuntime_t = ttk.Combobox(self.lable_f, values=chixuntime_ev) self.chixuntime_t.current(0) self.chixuntime_t.grid(row=3, column=2, sticky=W) self.cpu_btn_start = Button(self.lable_f, text='开始测试', command=self.thread_cpu_app_test) self.cpu_btn_start.grid(row=4, column=1, sticky=E, pady=10) self.cpu_btn_stop = Button(self.lable_f, text='强制结束', command=self.thread_stop, state='disabled') self.cpu_btn_stop.grid(row=4, column=2, sticky=E) def __create_monkey_widget(self): '''创建monkey控件''' self.monkey_lafr = LabelFrame(self.frame_top, text="Monkey测试") self.monkey_lafr.pack(fill=BOTH, expand=1) Label(self.monkey_lafr, text='伪随机数:').grid(row=0, column=1) self.event_t = Text(self.monkey_lafr, height=1, width=30) self.event_t.insert('0.0', 0) self.event_t.grid(row=0, column=2) Label(self.monkey_lafr, text='随机种子个').grid(row=0, column=3) self.zhongzi_t = Text(self.monkey_lafr, height=1, width=30) self.zhongzi_t.grid(row=0, column=4) Label(self.monkey_lafr, text='导航事件百分比:').grid(row=1, column=1) self.danghang_t = Text(self.monkey_lafr, height=1, width=30) self.danghang_t.insert('0.0', 0) self.danghang_t.grid(row=1, column=2) Label(self.monkey_lafr, text='触摸事件百分比:').grid(row=1, column=3) self.touch_t = Text(self.monkey_lafr, height=1, width=30) self.touch_t.grid(row=1, column=4) self.touch_t.insert('0.0', 0) Label(self.monkey_lafr, text='滑动事件百分比:').grid(row=2, column=1) self.huadong_t = Text(self.monkey_lafr, height=1, width=30) self.huadong_t.grid(row=2, column=2) self.huadong_t.insert('0.0', 0) Label(self.monkey_lafr, text='轨迹球事件百分比:').grid(row=2, column=3) self.trackball_t = Text(self.monkey_lafr, height=1, width=30) self.trackball_t.grid(row=2, column=4) self.trackball_t.insert('0.0', 0) Label(self.monkey_lafr, text='系统按键百分比:').grid(row=3, column=1) self.xitong_t = Text(self.monkey_lafr, height=1, width=30) self.xitong_t.grid(row=3, column=2) self.xitong_t.insert('0.0', 0) Label(self.monkey_lafr, text='activity之间的切换百分比:').grid(row=3, column=3) self.acti_t = Text(self.monkey_lafr, height=1, width=30) self.acti_t.grid(row=3, column=4) self.acti_t.insert('0.0', 0) Label(self.monkey_lafr, text='时间间隔:').grid(row=4, column=1) suji_event = [100, 500, 1000, 1500, 2000, 3000] self.time_t = ttk.Combobox(self.monkey_lafr, values=suji_event) self.time_t.current(0) self.time_t.grid(row=4, column=2, sticky=W) Label(self.monkey_lafr, text='日志存放路径:').grid(row=4, column=3) self.log_t = Text(self.monkey_lafr, height=1, width=30) self.log_t.grid(row=4, column=4) self.log_t.insert('0.0', 'F:\\monekey.txt') Label(self.monkey_lafr, text='包名:').grid(row=5, column=1) self.package_t1 = Text(self.monkey_lafr, height=1, width=30) self.package_t1.grid(row=5, column=2, sticky=W) btn_monkey = Button(self.monkey_lafr, text='开始测试', command=self.monkey_app) btn_monkey.grid(row=5, column=3, sticky=E, pady=10) def __create_devices_widget(self): '''设备信息控件''' devices_dict = getdevices_info() self.info_lafr = LabelFrame(self.frame_top, text="设备信息", padx=10, pady=10) Label(self.info_lafr, text='名称:').grid(row=0, column=1) Label(self.info_lafr, text=devices_dict['device'], width=30).grid(row=0, column=2) Label(self.info_lafr, text='型号:').grid(row=0, column=3) Label(self.info_lafr, text=devices_dict['model'], width=30).grid(row=0, column=4) Label(self.info_lafr, text='系统版本:').grid(row=1, column=1) Label(self.info_lafr, text=devices_dict['version'], width=30).grid(row=1, column=2) Label(self.info_lafr, text='SDK版本:').grid(row=1, column=3) Label(self.info_lafr, text=devices_dict['sdk_version'], width=30).grid(row=1, column=4) Label(self.info_lafr, text='分辨率:').grid(row=2, column=1) Label(self.info_lafr, text=devices_dict['display_size'], width=30).grid(row=2, column=2) Label(self.info_lafr, text='品牌:').grid(row=2, column=3) Label(self.info_lafr, text=devices_dict['manufacturer'], width=30).grid(row=2, column=4) self.info_lafr.pack(fill=BOTH, expand=1) def __create_appstart_widget(self): '''应用启动时间测试控件''' self.appstart_lf = LabelFrame(self.frame_top, text='应用启动时间', padx=10, pady=10) self.appstart_lf.pack(fill=BOTH, expand=1) Label(self.appstart_lf, text='测试次数:').grid(row=0, column=1, pady=10, sticky=E) num = [10, 20, 30, 50, 100] self.cishu_ac = ttk.Combobox(self.appstart_lf, values=num, state='readonly', width=50) self.cishu_ac.current(0) self.cishu_ac.grid(row=0, column=2) Label(self.appstart_lf, text='包名/Activty:').grid(row=1, column=1) self.activity_t = Entry(self.appstart_lf, width=50) self.activity_t.grid(row=1, column=2, sticky=W) # Label(self.appstart_lf, text='包名').grid(row=2,column=1) # self.global_package = Entry(self.appstart_lf,width=50) # self.global_package.grid(row=2,column=2,sticky=W) start_btn = Button(self.appstart_lf, text='开始测试', command=self.thread_app_start_time) start_btn.grid(row=3, column=2, pady=10) def __create_appsize_widget(self): '''创建 应用ROM 大小控件''' self.appsize_lf = LabelFrame(self.frame_top, text='应用ROM', padx=10, pady=10) self.appsize_lf.pack(fill=BOTH, expand=1) # Label(self.appsize_lf,text='包名').grid(row=0,column=1,pady=10) # self.appsize_pck= Entry(self.appsize_lf,width=50) # self.appsize_pck.grid(row=0,column=2) # self.var = IntVar() # # self.system_app = tk.Radiobutton(self.appsize_lf, text='内置应用',value=1,variable=self.var) # self.system_app.grid(row=1,column=1) # # # self.thirdparty_app = tk.Radiobutton(self.appsize_lf, text='手动安装应用', value=0,variable=self.var) # self.thirdparty_app.grid(row=1,column=2) start_btn = tk.Button(self.appsize_lf, text='开始测试', command=self.thread_approm) start_btn.grid(row=2, column=2) def __create_appruning_widget(self): '''创建应用运行时RAM''' self.apprun_lf = LabelFrame(self.frame_top, text='应用运行时RAM', padx=10, pady=10) self.apprun_lf.pack(fill=BOTH, expand=1) Label(self.apprun_lf, text='监控间隔时间(分):').grid(row=0, column=1, pady=10, sticky=E) num = [2, 4, 6, 8, 10, 15] self.monitoring_time = ttk.Combobox(self.apprun_lf, values=num, state='readonly', width=10) self.monitoring_time.current(0) self.monitoring_time.grid(row=0, column=2, sticky=W) Label(self.apprun_lf, text='监控命令:').grid(row=1, column=1, pady=10, sticky=E) self.runcommand = Text(self.apprun_lf, height=3, width=80) self.runcommand.insert(END, 'adb shell dumpsys meminfo') self.runcommand.grid(row=1, column=2, sticky=W) Label(self.apprun_lf, text='monkey命令:').grid(row=2, column=1) self.monkeycommand = Text(self.apprun_lf, height=4, width=80) self.monkeycommand.insert( END, 'adb shell monkey -p 包名 -s 10 --pct-touch 30 --throttle 300 -v 10000 --monitor-native-crashes' ) self.monkeycommand.grid(row=2, column=2, pady=10) btn_start = Button(self.apprun_lf, text='开始测试', command=self.thread_apprun_ram) btn_start.grid(row=3, column=2) def __create_appbackrun_wiget(self): '''应用后台运行时RAM占用大小''' self.appback_lf = LabelFrame(self.frame_top, text='应用后台运行时RAM', padx=10, pady=10) self.appback_lf.pack(fill=BOTH, expand=1) Label(self.appback_lf, text='监控间隔时间(分):').grid(row=0, column=1, pady=10, sticky=E) num = [2, 10, 15, 20, 25] self.monitoring_time2 = ttk.Combobox(self.appback_lf, values=num, state='readonly', width=10) self.monitoring_time2.current(0) self.monitoring_time2.grid(row=0, column=2, sticky=W) # text='adb shell dumpsys activity activities | findstr[grep] mFocusedActivity' Label( self.appback_lf, text= 'adb shell dumpsys activity activities | findstr[grep] mFocusedActivity' ).grid(row=1, column=1, columnspan=2) Label( self.appback_lf, text= 'adb shell dumpsys activity activities | findstr[grep] ResumedActivity(8.0及以上适用)', bg='yellow').grid(row=2, column=1, columnspan=2) Label(self.appback_lf, text='包名/Activity:').grid(row=3, column=1) self.package_av = Text(self.appback_lf, height=1, width=80) self.package_av.grid(row=3, column=2) Label(self.appback_lf, text='monkey命令:').grid(row=4, column=1) self.runcommand2 = Text(self.appback_lf, height=3, width=80) self.runcommand2.insert( END, 'adb shell monkey -p 包名 -s 10 --pct-touch 30 --throttle 300 -v 10000 --monitor-native-crashes' ) self.runcommand2.grid(row=4, column=2, pady=10) self.btn_start_ram = Button(self.appback_lf, text='开始测试', command=self.thread_appblackrun_ram) self.btn_start_ram.grid(row=5, column=2) # self.btn_init = Button(self.appback_lf, text='初始化环境', command=self.init_uiautomaotr2) def __create_menu_widget(self): '''菜单控件''' # 创建一个menu menubar = Menu(self) # 创建一系列的子menu lookmenu = Menu(menubar, tearoff=0) lookmenu.add_command(label='设备信息', command=self.__show_devices_widget) lookmenu.add_command(label='删除', command=self.__delete_pan) performance_menu = Menu(menubar, tearoff=0) performance_menu.add_command(label='CPU/内存/流量', command=self.__shwo_cpu_widget) performance_menu.add_command(label='Monkey测试', command=self.__show_monkey_widget) performance_menu.add_command(label='应用启动时间', command=self.__show_appstart_widget) qualify_menu = Menu(menubar, tearoff=0) qualify_menu.add_command(label='应用ROM', command=self.__show_appsize_widget) qualify_menu.add_separator() qualify_menu.add_command(label='应用后台运行时RAM', command=self.__show_appbackrun_widget) qualify_menu.add_command(label='应用运行时RAM', command=self.__show_appruning_widget) menubar.add_cascade(label='查看', menu=lookmenu) menubar.add_cascade(label='性能测试', menu=performance_menu) menubar.add_cascade(label='Qualify', menu=qualify_menu) self.config(menu=menubar) def __show_appbackrun_widget(self): '''展示应用后台运行时RAM''' self.__delete_pan() self.glabel_l['text'] = '程序启动后需要用户手动操作进入用户首页' self.glabel_l['fg'] = 'red' self.__create_appbackrun_wiget() def __show_appruning_widget(self): '''展示应用运行时RAM''' self.__delete_pan() self.__create_appruning_widget() def __show_appstart_widget(self): '''展示应用启动测试信息''' self.__delete_pan() self.glabel_l['text'] = '该功能只适用于Root权限机型' self.glabel_l['fg'] = 'red' self.__create_appstart_widget() def __show_devices_widget(self): '''展示设备信息''' self.__delete_pan() self.__create_devices_widget() def __show_monkey_widget(self): '''展示monkey控件''' self.__delete_pan() self.__create_monkey_widget() def __shwo_cpu_widget(self): '''展示cpu控件''' self.__delete_pan() self.__create_cpu_widget() def __show_appsize_widget(self): '''展示获取APK大小控件''' self.__delete_pan() self.glabel_l['text'] = '测试前请先检查应用是否已启动过,否则获取信息不全' self.glabel_l['fg'] = 'red' self.__create_appsize_widget() def __delete_pan(self): '''删除顶部控件''' self.data_text.delete(1.0, END) for child in self.frame_top.winfo_children(): child.pack_forget() def thread_appblackrun_ram(self): for i in range(1): t = threading.Thread(target=self.app_backrun_ram, args=()) t.start() def thread_apprun_ram(self): for i in range(1): t = threading.Thread(target=self.app_runing_ram, args=()) t.start() def thread_approm(self): for i in range(1): t = threading.Thread(target=self.app_rom_test, args=()) t.start() def thread_app_start_time(self): for i in range(1): t = threading.Thread(target=self.app_start_time, args=()) t.start() def thread_cpu_app_test(self): for i in range(1): t = threading.Thread(target=self.cpu_app_test, args=()) t.start() def app_backrun_ram(self): '''应用后台运行时RAM占用大小''' packagename = self.entryvar.get().strip() runcommand2 = self.runcommand2.get('0.0', END).strip() # 监控命令 activity = self.package_av.get('0.0', END).strip() sleep_time = int(self.monitoring_time2.get()) # 监控间隔时间 if len(packagename) <= 5 or len(runcommand2) <= 5 or len( activity) <= 5 or len(activity) <= 5: messagebox.showwarning('警告', '请检查参数') else: ram1, ram2 = get_appbackrunram(packagename, activity, sleep_time) text = '场景1: %sK / 1024 = %sM \n场景2: %sK / 1024 = %sM\n' % ( ram1, round(ram1 / 1024, 2), ram2, round(ram2 / 1024, 2)) self.data_text.insert(END, text) self.data_text.see(END) #执行场景3-->并且获取运行时RAM os.popen(runcommand2) count_list = [] # 次数 max_list = [] i = 0 while get_pid(): current_time = datetime.datetime.now().strftime('%H:%M:%S') ram_list = get_apprunram('adb shell dumpsys meminfo', packagename) ram_sum = sum(ram_list) max_list.append(ram_sum) i += 1 count_list.append(i) text = '%s 第%s次 %sK \n' % (current_time, i, ram_sum) self.data_text.insert(END, text) self.data_text.see(END) time.sleep(2 * 60) _max = round(max(max_list) / 1024, 2) print(max(max_list) / 1024) text1 = '最大值:%sK / 1024 = %sM\n' % (max(max_list), _max) self.data_text.insert(END, text1) self.data_text.see(END) #执行场景3-->获取后台运行RAM ram3 = get_appbackrunram2(packagename, sleep_time) text3 = '场景3: %sK / 1024 = %sM' % (ram3, round(ram3 / 1024, 2)) self.data_text.insert(END, text3) self.data_text.see(END) messagebox.showinfo('提醒', '测试完成') def app_runing_ram(self): '''获取应用运行时RAM占用大小''' packagename = self.global_package.get().strip() runcommand = self.runcommand.get('0.0', END).strip() #监控命令 monkeycommand = self.monkeycommand.get('0.0', END).strip() #monkey命令 sleep_time = int(self.monitoring_time.get()) #监控间隔时间 if len(packagename) <= 5 or len(runcommand) <= 5 or len( monkeycommand) <= 5: messagebox.showwarning('警告', '请检查参数') else: count_list = [] #次数 max_list = [] #运行monkey命令 os.popen(monkeycommand) time.sleep(2) i = 0 while get_pid(): current_time = datetime.datetime.now().strftime('%H:%M:%S') ram_list = get_apprunram(runcommand, packagename) ram_sum = sum(ram_list) max_list.append(ram_sum) i += 1 count_list.append(i) text = '%s 第%s次 %sK \n' % (current_time, i, ram_sum) self.data_text.insert(END, text) self.data_text.see(END) time.sleep(sleep_time * 60) _max = round(max(max_list) / 1024, 2) print(max(max_list) / 1024) text1 = '最大值:%sK / 1024 = %sM' % (max(max_list), _max) self.data_text.insert(END, text1) self.data_text.update() messagebox.showinfo('提醒', '测试完成') def app_rom_test(self): '''获取应用ROM占用大小''' devices_status = getDevicesStatus() if devices_status == 'device': packagename = self.global_package.get() if len(packagename) <= 5: LOG.info('包名必须真实有效') messagebox.showwarning('警告', '请检查您的包名') else: rslist, apksize = get_appsize(packagename) print(rslist) for i in rslist: self.data_text.insert(END, i) self.data_text.insert(END, '\n') def cpu_app_test(self): status_devices = getDevicesStatus() self.__running = True if status_devices == 'device': # cpupackagename = self.cpu_packagename_t.get() cpupackagename = self.global_package.get() print(cpupackagename) sleep_time = int(self.intervatime_t.get()) # 间隔时间 chixun_time = int(self.chixuntime_t.get()) # 持续执行时间 if len(cpupackagename) <= 5: LOG.info('包名必须真实有效') messagebox.showwarning('警告', '请检查您的包名') else: cishu_list = [] cpu_list = [] rescv_list = [] send_list = [] total_list = [] pass_list = [] i = 0 current_time = datetime.datetime.now() time_end = current_time + datetime.timedelta( minutes=chixun_time) # 最后结束时间 while self.__running and contrast(current_time, time_end): hour = datetime.datetime.now().strftime('%H:%M:%S') memory = getMemory(cpupackagename) rescv, send, flow_sum = getFlow(cpupackagename) cpu = getCpu(cpupackagename) self.cpu_btn_start['state'] = 'disabled' self.cpu_btn_stop['state'] = 'normal' cpu_list.append(float(cpu.split('%')[0])) pass_list.append(int(memory[:-1])) total_list.append(int(flow_sum)) rescv_list.append(int(rescv)) send_list.append(int(send)) text = '%s cpu:%s Pass:%s 总流量:%sk, 上传流量:%sk, 下载流量:%sk' % ( hour, cpu, memory, flow_sum, rescv, send) self.data_text.insert(END, text) self.data_text.insert(END, "\n") self.data_text.update() cishu_list.append(hour) time.sleep(sleep_time) current_time = datetime.datetime.now() saveCpuResult(cishu=cishu_list, start_cpu=cpu_list, recv_list=rescv_list, send_list=send_list, total_list=total_list, Pass_list=pass_list) self.cpu_btn_start['state'] = 'normal' LOG.info('测试完成') messagebox.showinfo('提醒', '测试完毕,测试报告已经生成!') else: LOG.info('测试的设备必须正常连接,请注意') messagebox.showwarning('警告', '设备连接异常 请重新连接设备!') def app_start_time(self): start_tim = [] cishu = [] status_devices = getDevicesStatus() if status_devices == 'device': try: packname = self.global_package.get().strip() print(packname) acti = self.activity_t.get().strip() cish = self.cishu_ac.get() except: LOG.info('获取不到测试数据,请检查!') messagebox.showinfo('提醒', '获取不到测试数据,请检查!') if len(acti) <= 1 or len(packname) <= 1: messagebox.showinfo('提醒', '包命或者包名activity不能为空') LOG.info('包命或者包名activity不能为空') else: if len(cish) <= 1: messagebox.showinfo('提醒', '次数不能为空') LOG.info('次数不能为空') else: i = 0 # e1['state'] = 'normal' # e1.delete(1.0, tkinter.END) sum = 0 for i in range(int(cish)): start_time = starttime_app(packagename=packname, packagenameactivicy=acti) start_tim.append(int(start_time[1])) cishu.append(i) if start_time is None: messagebox.showwarning('警告', '请检查您输入的包或者包的启动activity') break text = '第%s次启动时间:%s' % (i + 1, start_time[1]) LOG.info('第%s次启动时间:%s' % (i + 1, start_time[1])) sum += int(start_time[1]) # e1['state'] = 'normal' self.data_text.insert(END, text) self.data_text.insert(END, '\n') self.data_text.update() # btn_start['state'] = 'disabled' self.data_text.insert(END, ('平均用时:%s ms' % (sum / int(cish)))) LOG.info(('平均用时:%s' % (sum / int(cish)))) saveStartAppResult(cishu=cishu, start=start_tim) messagebox.showinfo('提示', '测试报告已经生成,请到当前目录查看') LOG.info('测试报告已经生成,请到当前目录查看') # e1['state'] = 'disabled' # btn_start['state'] = 'normal' messagebox.showinfo('通知', '测试已经完成') LOG.info('测试已经完成') else: messagebox.showerror('警告', '设备连接异常') LOG.info('设备连接异常') def thread_stop(self): self.__running = False LOG.info('self.__running %s' % self.__running) def monkey_app(self): devices_status = getDevicesStatus() if devices_status == 'device': try: packname = self.package_t1.get('0.0', END).split()[0] zhongzi = self.zhongzi_t.get('0.0', END).split()[0] time = self.time_t.get().split()[0] touch = self.touch_t.get('0.0', END).split()[0] huadong = self.huadong_t.get('0.0', END).split()[0] guiji = self.trackball_t.get('0.0', END).split()[0] xitong = self.xitong_t.get('0.0', END).split()[0] acti = self.acti_t.get('0.0', END).split()[0] event = self.event_t.get('0.0', END).split()[0] log = self.log_t.get('0.0', END).split()[0] danghang = self.danghang_t.get('0.0', END).split()[0] if len(packname) <= 5: LOG.info('请正确填写包名') messagebox.showwarning('提醒', '请正确填写包名') if int(touch) + int(huadong) + int(guiji) + int( danghang) + int(xitong) + int(acti) > 100: messagebox.showerror('提醒', '您输入的所有的事件的比例和不能超过100%') LOG.info('您输入的所有的事件的比例和不能超过100') run_monkey(packagename=packname, s_num=zhongzi, throttle=time, pct_touch=touch, pct_motion=huadong, pct_trackball=guiji, pct_nav=danghang, pct_syskeys=xitong, pct_appswitch=acti, num=event, logfilepath=log) except: messagebox.showwarning('警告', '必须填写monkey相关数据') LOG.info('monkey 测试出错,原因:%s' % Exception) else: LOG.info('设备连接异常 请重新连接设备!') messagebox.showwarning('警告', '设备连接异常 请重新连接设备!')
class Server(object): logger = StreamLogger = logging.getLogger("FileLogger") def __init__(self): self.tcp_client_sock = None self.host = conf_read("config/config.conf", "local", "host") self.port = conf_read("config/config.conf", "local", "port") self.buffer = conf_read("config/config.conf", "local", "buffer") self.target_host = conf_read("config/config.conf", "target", "host") self.target_port = conf_read("config/config.conf", "target", "port") self.raw_msg_listen = False self.window = Tk() self.window.title("Raw Socket ICMP Server") self.window.geometry("630x560") Label(self.window, text='Local IP: ').place(x=25, y=30) Label(self.window, text='Target IP: ').place(x=25, y=70) Label(self.window, text='Port: ').place(x=25, y=110) Label(self.window, text='Buffer: ').place(x=25, y=150) self.var_local_host = StringVar() self.var_local_host.set( conf_read("config/config.conf", "local", "host")) entry_host = Entry(self.window, state="disabled", textvariable=self.var_local_host) entry_host.place(x=95, y=30) self.var_target_host = StringVar() self.var_target_host.set( conf_read("config/config.conf", "target", "host")) entry_target_host = Entry(self.window, state="disabled", textvariable=self.var_target_host) entry_target_host.place(x=95, y=70) self.var_port = StringVar() self.var_port.set(conf_read("config/config.conf", "local", "port")) entry_port = Entry(self.window, state="disabled", textvariable=self.var_port) entry_port.place(x=95, y=110) self.var_buffer = StringVar() self.var_buffer.set(conf_read("config/config.conf", "local", "buffer")) entry_buffer = Entry(self.window, state="disabled", textvariable=self.var_buffer) entry_buffer.place(x=95, y=150) Label(self.window, text='ICMP Type: ').place(x=310, y=30) Label(self.window, text='ICMP Code: ').place(x=310, y=70) Label(self.window, text='ICMP Seq: ').place(x=310, y=110) Label(self.window, text='ICMP ID: ').place(x=310, y=150) Label(self.window, text='ICMP LEN: ').place(x=310, y=190) self.var_type = StringVar() self.var_type.set(conf_read("config/config.conf", "icmp", "type")) entry_type = Entry(self.window, state="disabled", textvariable=self.var_type) entry_type.place(x=405, y=30) self.var_code = StringVar() self.var_code.set(conf_read("config/config.conf", "icmp", "code")) entry_code = Entry(self.window, state="disabled", textvariable=self.var_code) entry_code.place(x=405, y=70) self.var_seq = StringVar() self.var_seq.set(conf_read("config/config.conf", "icmp", "seq")) entry_seq = Entry(self.window, state="disabled", textvariable=self.var_seq) entry_seq.place(x=405, y=110) self.var_packet_id = StringVar() self.var_packet_id.set(random.randint(0, 0xffff)) entry_packet_id = Entry(self.window, textvariable=self.var_packet_id) entry_packet_id.place(x=405, y=150) self.var_packet_len = StringVar() self.var_packet_len.set(conf_read("config/config.conf", "icmp", "len")) entry_packet_len = Entry(self.window, textvariable=self.var_packet_len) entry_packet_len.place(x=405, y=190) Label(self.window, text='Received msg: ').place(x=25, y=200) self.txt_rev_msg = ScrolledText(self.window, height=10, bd=2, relief='groove', wrap=CHAR, bg="WhiteSmoke") self.txt_rev_msg.place(x=25, y=220) Label(self.window, text='Your msg: ').place(x=25, y=390) self.txt_msg = ScrolledText(self.window, height=6.5, width=55, bd=2, wrap=WORD, relief='groove', bg="WhiteSmoke") self.txt_msg.place(x=25, y=410) self.btn_send = Button(self.window, text='Send', width=15, activeforeground='blue', command=self.send_msg) self.btn_send.place(x=472, y=490) self.window.protocol('WM_DELETE_WINDOW', self.close_window) self.window.mainloop() def send_msg(self): data = self.txt_msg.get("0.0", "end") self.btn_send.config({"state": "disabled"}) self.send_raw_msg(self.var_target_host.get(), data.encode("utf-8"), int(self.var_type.get()), int(self.var_code.get()), int(self.var_packet_id.get()), int(self.var_seq.get())) self.txt_msg.delete('0.0', 'end') self.btn_send.config({"state": "normal"}) if not self.raw_msg_listen: self.start_server_thread(self._start_raw_listen, (self.var_local_host.get(), )) self.raw_msg_listen = True new_packet_id = (int(self.var_packet_id.get()) + 1) % 65535 self.var_packet_id.set(str(new_packet_id)) def send_raw_msg(self, dest_addr, data, icmp_type, code, pack_id, seq): try: my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) except socket.error as e: self._insert_text(e.strerror, "[ERROR]") print(e.strerror) raise if isinstance(data, str): data = data.encode("utf-8") packet = self.create_packet(icmp_type, code, pack_id, seq, data) while packet: sent = my_socket.sendto(packet, (dest_addr, 1)) packet = packet[sent:] rec_packet, addr = my_socket.recvfrom(int(self.var_buffer.get())) print(rec_packet) self._insert_text(dest_addr, "[Target IP]") my_socket.close() def _start_raw_listen(self, host_ip): length = int(self.var_packet_len.get()) # if os.name == "nt": # protocol = socket.IPPROTO_IP # else: # protocol = socket.IPPROTO_ICMP try: my_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) except socket.error as e: self._insert_text(e.strerror, "[ERROR]") print(e.strerror) raise my_socket.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) my_socket.bind((host_ip, 0)) self._insert_text("Waiting RAW socket message......") while True: rec_packet, addr = my_socket.recvfrom(int(self.var_buffer.get())) if len(rec_packet) == (28 + length): msg = rec_packet[-length:].decode("utf-8", "ignore").strip("@") icmp_header = rec_packet[20:28] type, code, checksum, p_id, sequence = struct.unpack( 'bbHHh', icmp_header) print(type, code, checksum, p_id, sequence) self._insert_text(str(rec_packet), "[ICMP FULL PACKET]") self._insert_text(len(rec_packet), "[ICMP LENGTH]") self._insert_text(addr[0], "[ICMP SOURCE IP]") self._insert_text(msg, "[ICMP MSG]") self._insert_text(p_id, "[ICMP PACKET ID]") self._insert_text(type, "[ICMP TYPE]") self._insert_text(code, "[ICMP CODE]") self._insert_text(sequence, "[ICMP SEQ]") if not rec_packet: break def stop_server(self): self.window.destroy() def _insert_text(self, msg, type_msg=""): self.txt_rev_msg.insert(END, "[{}]-{}: {}".format(ctime(), type_msg, msg)) self.txt_rev_msg.insert(END, "\n") self.txt_rev_msg.update() def close_window(self): ans = askyesno(title='Confirm', message='Close the window?') if ans: self.stop_server() else: return def create_packet(self, icmp_type, code, pack_id, seq, data, chksum=0): # Header is type (8), code (8), checksum (16), id (16), sequence (16) header = struct.pack('bbHHh', icmp_type, code, chksum, pack_id, seq) length = int(self.var_packet_len.get()) data = data[:length] if len( data) > length else data + (length - len(data)) * b'@' # Calculate the checksum on the data and the dummy header. my_checksum = self.checksum(header + data) # Now that we have the right checksum, we put that in. It's just easier # to make up a new header than to stuff it into the dummy. header = struct.pack('bbHHh', icmp_type, 0, socket.htons(my_checksum), pack_id, 1) print(icmp_type, 0, socket.htons(my_checksum), pack_id, 1) print(header) return header + data @staticmethod def checksum(source_string): sum = 0 l = len(source_string) count_to = (l / 2) * 2 count = 0 while count < count_to: this_val = source_string[count + 1] * 256 + source_string[count] sum = sum + this_val sum = sum & 0xffffffff count = count + 2 if count_to < l: sum = sum + source_string[l - 1] sum = sum & 0xffffffff sum = (sum >> 16) + (sum & 0xffff) sum = sum + (sum >> 16) answer = ~sum answer = answer & 0xffff answer = answer >> 8 | (answer << 8 & 0xff00) return answer @staticmethod def start_server_thread(func, args=()): t = threading.Thread(target=func, args=args) t.setDaemon(True) t.start()
class ChatForm(tk.Frame): font_color = "#000000" font_size = 16 user_list = [] tag_i = 0 """将监听事件移除并关闭该窗口""" def remove_listener_and_close(self): remove_message_listener(self.message_listener) client.util.socket_listener.remove_listener(self.socket_listener) self.master.destroy() if self.target['id'] in client.memory.window_instance[self.target['type']]: del client.memory.window_instance[self.target['type']][self.target['id']] """定义监听事件""" def message_listener(self, data): self.digest_message(data) """监听socket传来的数据""" def socket_listener(self, data): init_time = int(time.time()) dirname = "send_msg_log" filename = str(init_time) dir_flag = os.path.exists(dirname) if dir_flag == False: os.mkdir(dirname) if data['parameters']['message']['type'] == 1: with open(dirname + '/' + filename, 'wb') as f: contents = data['parameters']['message']['data'] f.write(contents) f.close() with open(dirname + '/' + filename, 'rb') as f: file_format = filetype.guess(dirname + '/' + filename) file_format = file_format.extension if file_format == None: file_format = "txt" f.close() os.rename(dirname + '/' + filename, (str(dirname + '/' + filename) + '_.' + file_format)) if data['type'] == MessageType.query_room_users_result: if data['parameters'][1] != self.target['id']: return self.user_list = data['parameters'][0] self.refresh_user_listbox() if data['type'] == MessageType.room_user_on_off_line: if data['parameters'][0] != self.target['id']: return for i in range(0, len(self.user_list)): if self.user_list[i][0] == data['parameters'][1]: self.user_list[i][2] = data['parameters'][2] self.refresh_user_listbox() """更新好友列表""" def refresh_user_listbox(self): self.user_listbox.delete(0, END) self.user_list.sort(key=lambda x: x[2]) for user in self.user_list: self.user_listbox.insert(0, user[1] + ("(在线)" if user[2] else "(离线)")) self.user_listbox.itemconfig(0, {'fg': ("blue" if user[2] else "#505050")}) """处理消息并将其展示出来""" def digest_message(self, data): time = datetime.datetime.fromtimestamp( int(data['time']) / 1000 ).strftime('%Y-%m-%d %H:%M:%S') self.append_to_chat_box(data['sender_name'] + " " + time + '\n', ('me' if client.memory.current_user['id'] == data[ 'sender_id'] else 'them')) # type 0 - 文字消息 1 - 图片消息 if data['message']['type'] == 0: self.tag_i += 1 self.chat_box.tag_config('new' + str(self.tag_i), lmargin1=16, lmargin2=16, foreground=data['message']['fontcolor'], font=(None, data['message']['fontsize'])) self.append_to_chat_box(data['message']['data'] + '\n', 'new' + str(self.tag_i)) if data['message']['type'] == 1: client.memory.tk_img_ref.append(ImageTk.PhotoImage(data=data['message']['data'])) self.chat_box.image_create(END, image=client.memory.tk_img_ref[-1], padx=16, pady=5) self.append_to_chat_box('\n', '') """ 双击聊天框 """ def user_listbox_double_click(self, _): if len(self.user_listbox.curselection()) == 0: return None index = self.user_listbox.curselection()[0] selected_user_id = self.user_list[len(self.user_list) - 1 - index][0] selected_user_username = self.user_list[len(self.user_list) - 1 - index][3] if selected_user_id == client.memory.current_user['id']: return client.memory.contact_window[0].try_open_user_id(selected_user_id, selected_user_username) return def __init__(self, target, master=None): super().__init__(master) self.master = master self.target = target self.user_listbox = tk.Listbox(self, bg='#63d5eb', width=0, bd=0) client.util.socket_listener.add_listener(self.socket_listener) client.memory.unread_message_count[self.target['type']][self.target['id']] = 0 client.memory.contact_window[0].refresh_contacts() master.resizable(width=False, height=False) master.geometry('580x500') self.sc = client.memory.sc # 私人聊天 if self.target['type'] == 0: self.master.title(self.target['username']) # 群组聊天 if self.target['type'] == 1: self.master.title("[群:" + str(self.target['id']) + "] " + self.target['room_name']) self.sc.send(MessageType.query_room_users, self.target['id']) self.right_frame = tk.Frame(self) self.user_listbox.bind('<Double-Button-1>', self.user_listbox_double_click) if self.target['type'] == 1: self.user_listbox.pack(side=LEFT, expand=False, fill=BOTH) self.right_frame.pack(side=LEFT, expand=True, fill=BOTH) self.input_frame = tk.Frame(self.right_frame, bg='#63d5eb') self.input_textbox = ScrolledText(self.right_frame, bg='#63d5eb', font=("楷书", 16), height=5) self.input_textbox.bind("<Control-Return>", self.send_message) self.input_textbox.bind_all('<Key>', self.apply_font_change) self.send_btn = tk.Button(self.input_frame, text='发送消息(Ctrl+Enter)', font=("仿宋", 16, 'bold'), fg="black", bg="#35d1e9",activebackground="#6cdcf0", relief=GROOVE, command=self.send_message) self.send_btn.pack(side=RIGHT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体颜色', font=("仿宋", 16, 'bold'), fg="black", bg="#35d1e9", activebackground="#6cdcf0", relief=GROOVE, command=self.choose_color) self.font_btn.pack(side=LEFT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体大小', font=("仿宋", 16, 'bold'), fg="black", bg="#35d1e9", activebackground="#6cdcf0", relief=GROOVE, command=self.choose_font_size) self.font_btn.pack(side=LEFT, expand=False) self.image_btn = tk.Button(self.input_frame, text='发送文件', font=("仿宋", 16, 'bold'), fg="black", bg="#35d1e9", activebackground="#6cdcf0", relief=GROOVE, command=self.send_image) self.image_btn.pack(side=LEFT, expand=False) self.chat_box = ScrolledText(self.right_frame, bg='#70d5eb') self.input_frame.pack(side=BOTTOM, fill=X, expand=False) self.input_textbox.pack(side=BOTTOM, fill=X, expand=False, padx=(0, 0), pady=(0, 0)) self.chat_box.pack(side=BOTTOM, fill=BOTH, expand=True) self.chat_box.bind("<Key>", lambda e: "break") self.chat_box.tag_config("default", lmargin1=10, lmargin2=10, rmargin=10, font=("仿宋", 15)) self.chat_box.tag_config("me", foreground="green", spacing1='0', font=("仿宋", 15)) self.chat_box.tag_config("them", foreground="blue", spacing1='0', font=("仿宋", 15)) self.chat_box.tag_config("message", foreground="black", spacing1='0', font=("楷体", 15)) self.chat_box.tag_config("system", foreground="#505050", spacing1='0', justify='center', font=("新宋体", 10)) self.pack(expand=True, fill=BOTH) add_message_listener(self.target['type'], self.target['id'], self.message_listener) master.protocol("WM_DELETE_WINDOW", self.remove_listener_and_close) # 历史消息显示 if target['id'] in client.memory.chat_history[self.target['type']]: for msg in client.memory.chat_history[self.target['type']][target['id']]: self.digest_message(msg) self.append_to_chat_box('- 以上是历史消息 -\n', 'system') """ 附加聊天框 """ def append_to_chat_box(self, message, tags): self.chat_box.insert(tk.END, message, [tags, 'default']) self.chat_box.update() self.chat_box.see(tk.END) """ 发送消息 """ def send_message(self, _=None): message = self.input_textbox.get("1.0", END) if not message or message.replace(" ", "").replace("\r", "").replace("\n", "") == '': return self.sc.send(MessageType.send_message, {'target_type': self.target['type'], 'target_id': self.target['id'], 'message': { 'type': 0, 'data': message.strip().strip('\n'), 'fontsize': self.font_size, 'fontcolor': self.font_color } }) self.input_textbox.delete("1.0", END) return 'break' """ 选择字体颜色 """ def choose_color(self): _, self.font_color = colorchooser.askcolor(initialcolor=self.font_color) self.apply_font_change(None) """ 选择字体大小 """ def choose_font_size(self): result = simpledialog.askinteger("设置", "请输入字体大小", initialvalue=self.font_size) if result is None: return self.font_size = result self.apply_font_change(None) """" 更新字体 """ def apply_font_change(self, _): try: self.input_textbox.tag_config('new', foreground=self.font_color, font=(None, self.font_size)) self.input_textbox.tag_add('new', '1.0', END) except: pass """" 发送图片 """ def send_image(self): filename = filedialog.askopenfilename(filetypes=[("Image Files", ["*.jpg", "*.jpeg", "*.png", "*.gif", "*.JPG", "*.JPEG", "*.PNG", "*.GIF"]), ("All Files", ["*.*"])]) if filename is None or filename == '': return with open(filename, "rb") as imageFile: f = imageFile.read() b = bytearray(f) self.sc.send(MessageType.send_message, {'target_type': self.target['type'], 'target_id': self.target['id'], 'message': {'type': 1, 'data': b}})
class ChatForm(tk.Frame): font_color = "#000000" font_size = 12 def on_list_click(self, e): name = self.chatroom_user_list.get( self.chatroom_user_list.curselection()) for tmp in memory.chatroom_user_list[self.username]: if tmp[1] == name: uname = tmp[0] for fn in memory.friend_list: if uname == fn[1]: # It's friend... uname = memory.friend_list[fn] + " (" + uname + ")" run(uname) return # Not friend... result = messagebox.askokcancel("还不是好友?", "你和" + name + "还不是好友,是否立即添加?") if result: friend_name = uname.encode() serializeMessage = common_handler.pack_message( common_handler.MessageType.add_friend, friend_name) client_socket.send_msg(serializeMessage) messagebox.showinfo('添加好友', '好友请求已发送') def __init__(self, master=None, username=None, nickname="Unkown"): super().__init__(master) self.master = master self.username = username self.nickname = nickname self.master.resizable(width=True, height=True) self.master.geometry('660x500') self.master.minsize(420, 370) self.master.title("与 {} 聊天中...".format(self.nickname)) memory.Chat_window[self.username] = self print(memory.Chat_window) # Chatroom window for v in memory.friend_list: if v[1] == self.username: if v[0] == 2: self.left_frame = tk.Frame(self) self.scroll = Scrollbar(self.left_frame) self.scroll.pack(side=RIGHT, fill=Y) self.chatroom_user_list = Listbox( self.left_frame, yscrollcommand=self.scroll.set) self.chatroom_user_list.bind("<Double-Button-1>", self.on_list_click) self.scroll.config(command=self.chatroom_user_list.yview) self.chatroom_user_list.pack(expand=True, fill=BOTH) self.update_chatroom_user_list(v[1]) self.left_frame.pack(side=RIGHT, expand=True, fill=BOTH) # self.friend_name = tk.Label( # self.left_frame, text=nickname, bg='#EEE', width=15) # self.friend_name.pack(expand=True, fill=BOTH, ipadx=5, ipady=5) self.right_frame = tk.Frame(self, bg='white') self.right_frame.pack(side=LEFT, expand=True, fill=BOTH) self.input_frame = tk.Frame(self.right_frame) self.input_textbox = ScrolledText(self.right_frame, height=7) self.input_textbox.bind("<Control-Return>", self.send_message) self.input_textbox.bind_all('<Key>', self.apply_font_change) self.send_btn = tk.Button(self.input_frame, text='发送消息(Ctrl+Enter)', command=self.send_message) self.send_btn.pack(side=RIGHT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体颜色', command=self.choose_color) self.font_btn.pack(side=LEFT, expand=False) self.font_btn = tk.Button(self.input_frame, text='字体大小', command=self.choose_font_size) self.font_btn.pack(side=LEFT, expand=False) # self.image_btn = tk.Button( # self.input_frame, text='发送图片', command=self.send_image) # self.image_btn.pack(side=LEFT, expand=False) self.chat_box = ScrolledText(self.right_frame, bg='white') self.input_frame.pack(side=BOTTOM, fill=X, expand=False) self.input_textbox.pack(side=BOTTOM, fill=X, expand=False, padx=(0, 0), pady=(0, 0)) self.chat_box.pack(side=BOTTOM, fill=BOTH, expand=True) self.chat_box.bind("<Key>", lambda e: "break") self.chat_box.tag_config("default", lmargin1=10, lmargin2=10, rmargin=10) self.chat_box.tag_config("me", foreground="green", spacing1='5') self.chat_box.tag_config("them", foreground="blue", spacing1='5') self.chat_box.tag_config("message", foreground="black", spacing1='0') self.chat_box.tag_config("system", foreground="grey", spacing1='0', justify='center', font=(None, 8)) self.pack(expand=True, fill=BOTH, padx=5, pady=5, ipadx=5, ipady=5) def append_to_chat_box(self, time, user, message, tags): if user == memory.username: user = "******" time_info = "%s %s 说:\n" % (time, user) self.chat_box.insert(tk.END, time_info, [tags, 'message']) self.chat_box.insert(tk.END, message, [tags, 'default']) self.chat_box.insert(tk.END, "\n", [tags, 'message']) self.chat_box.update() self.chat_box.see(tk.END) def send_message(self, _=None): stime = dtime.datetime.now() time_info = "%s年%s月%s日 %s时%s分%s秒" % (stime.year, stime.month, stime.day, stime.hour, stime.minute, stime.second) message = self.input_textbox.get("1.0", END) if not message or message.replace(" ", "").\ replace("\r", "").replace("\n", "") == '': return for k1 in memory.friend_list: if k1 == (1, self.username): self.append_to_chat_box(time_info, "我", message, 'me') self.input_textbox.delete("1.0", END) # format datetime send_message_handler(time_info, message, self.username) return 'break' def choose_color(self): _, self.font_color = colorchooser.askcolor( initialcolor=self.font_color) self.apply_font_change(None) def choose_font_size(self): result = simpledialog.askinteger("设置", "请输入字体大小", initialvalue=self.font_size) if result is None: return self.font_size = result self.apply_font_change(None) def apply_font_change(self, _): try: self.input_textbox.tag_config('new', foreground=self.font_color, font=(None, self.font_size)) self.input_textbox.tag_add('new', '1.0', END) except Exception: pass def close_window(self): del memory.Chat_window[self.username] self.master.destroy() def update_chatroom_user_list(self, chatroom_name): cn = chatroom_name.encode() serializeMessage = common_handler.pack_message( common_handler.MessageType.query_room_users, cn) client_socket.send_msg(serializeMessage)
class Qualify(object): def __init__(self, **kwargs): mainFram = kwargs.get('mainFram') self.packname = kwargs.get('pckname') self.devices = kwargs.get('devices') pwindow = PanedWindow(mainFram, orient=VERTICAL, showhandle=False, sashrelief=SUNKEN) # 默认是左右分布的 pwindow.pack(fill=BOTH, expand=1) self.frame_top = Frame(mainFram, height=300, width=800) self.frame_top.propagate(0) # 0表示父窗口依以子控件大小调整 self.frame_top.pack(fill=BOTH, expand=1) self.frame_bottom = Frame(mainFram) self.frame_bottom.pack(fill=BOTH, expand=1) self.data_text = ScrolledText(self.frame_bottom) self.data_text.pack(fill=BOTH, expand=1) pwindow.add(self.frame_top) pwindow.add(self.frame_bottom) # self.create_appromsize_widget() def create_appromsize_widget(self): '''创建 应用ROM 大小控件''' self.appsize_lf = ttk.LabelFrame(self.frame_top,text='应用ROM',width=800,height=400) self.appsize_lf.pack(fill=BOTH,expand=1) ttk.Label(self.appsize_lf,text='包名:').grid(row=0,column=1,pady=10) self.appsize_pck= ttk.Entry(self.appsize_lf,width=45,state='readonly',textvariable= self.packname) self.appsize_pck.grid(row=0,column=2) start_btn = ttk.Button(self.appsize_lf, text='开始测试',command=self.thread_appromsize) start_btn.grid(row=2,column=2) def create_appruning_widget(self): '''创建应用运行时RAM''' self.apprun_lf = ttk.LabelFrame(self.frame_top, text='应用运行时RAM', width=800,height=300) self.apprun_lf.pack(fill=BOTH, expand=1) Label(self.apprun_lf, text='包名:').grid(row=0, column=1, pady=10, sticky=E) self.pckname_appram = ttk.Entry(self.apprun_lf,width=30,textvariable=self.packname, state='readonly') self.pckname_appram.grid(row=0,column=2,sticky=W) Label(self.apprun_lf, text='监控间隔时间(分):').grid(row=1, column=1, pady=10, sticky=E) num = [2, 4, 6, 8, 10, 15] self.monitoring_time = ttk.Combobox(self.apprun_lf, values=num, state='readonly', width=10) self.monitoring_time.current(0) self.monitoring_time.grid(row=1, column=2, sticky=W) Label(self.apprun_lf, text='监控命令:').grid(row=2, column=1, pady=10, sticky=E) self.runcommand = Text(self.apprun_lf, height=3, width=80) self.runcommand.insert(END, 'adb shell dumpsys meminfo') self.runcommand.grid(row=2, column=2, sticky=W) Label(self.apprun_lf, text='monkey命令:').grid(row=3, column=1) self.monkeycommand = Text(self.apprun_lf, height=4, width=80) self.monkeycommand.insert(END, 'adb shell monkey -p 包名 -s 10 --pct-touch 30 --throttle 300 -v 10000 --monitor-native-crashes') self.monkeycommand.grid(row=3, column=2, pady=10) btn_start = ttk.Button(self.apprun_lf, text='开始测试', command=self.thread_appram_runing) btn_start.grid(row=4, column=2) def thread_appram_runing(self): for i in range(1): t = threading.Thread(target=self.getappramruning, args=()) t.start() def thread_appromsize(self): for i in range(1): t = threading.Thread(target=self.getappromsize, args=()) t.start() def getappramruning(self): '''获取应用运行时RAM占用大小''' devcies = self.devices.get() packagename = self.pckname_appram.get().strip() runcommand = self.runcommand.get('0.0', END).strip() # 监控命令 monkeycommand = self.monkeycommand.get('0.0', END).strip() # monkey命令 sleep_time = int(self.monitoring_time.get()) # 监控间隔时间 if len(packagename) <= 5 or len(runcommand) <= 5 or len(monkeycommand) <= 5: messagebox.showwarning('警告', '请检查参数') else: count_list = [] # 次数 max_list = [] # 运行monkey命令 subprocess.Popen(monkeycommand) time.sleep(2) i = 0 while get_pid(devcies,'monkey'): current_time = datetime.datetime.now().strftime('%H:%M:%S') ram_list = get_appramruning(runcommand, packagename) ram_sum = sum(ram_list) max_list.append(ram_sum) i += 1 count_list.append(i) text = '%s 第%s次 %sK \n' % (current_time, i, ram_sum) self.data_text.insert(END, text) self.data_text.see(END) time.sleep(sleep_time * 60) _max = round(max(max_list) / 1024, 2) print(max(max_list) / 1024) text1 = '最大值:%sK / 1024 = %sM' % (max(max_list), _max) self.data_text.insert(END, text1) self.data_text.update() messagebox.showinfo('提醒', '测试完成') def getappromsize(self): '''获取应用ROM占用大小''' devices = self.devices.get() if len(devices) > 0: packagename = self.appsize_pck.get() if len(packagename) <= 5: LOG.info('包名必须真实有效') messagebox.showwarning('警告', '请检查您的包名') else: rslist, apkromsize = get_appromsize(packagename, devices) print(rslist) for i in rslist: self.data_text.insert(END, i) self.data_text.insert(END, '\n') else: LOG.info('测试的设备必须正常连接,请注意') messagebox.showwarning('警告', '设备连接异常 请重新连接设备!')
class Application(Tk): """ 主要的窗口程序,直接继承 tkinter 底层的 Tk 类构建。 """ def __init__(self, master=None): """ 窗口生成时的必要准备。 """ super(Application, self).__init__(master) self.title("PyMusic Ver %s by %s" % (__version__, __author__)) # 设置窗口的大小。 t = self.winfo_screenwidth() // 800 self.geometry("%dx%d" % (400 * t, 250 * t)) # 设置窗口尺寸是否可调。 self.resizable(width=True, height=True) self.update() # print(self.winfo_width()) # 自定义一个字体对象。 self.font = Font(self, family="Monospace", size=4 * t, weight=BOLD) # .grid() 布局方式对行或列占据比例的设置,weight 的总值为分母,单个 weight 的值为分子, minsize 为最小宽度。 self.rowconfigure(0, weight=1, minsize=int(250 * t * 2 / 5)) self.rowconfigure(1, weight=1, minsize=int(250 * t / 5)) self.rowconfigure(2, weight=1, minsize=int(250 * t * 2 / 5)) self.columnconfigure(0, weight=1) # 建立自己定义的对象并解析参数。 self.create_input() self.create_button() self.create_output() def create_input(self): """ 建立输入乐谱的文本框。 """ self.input_frame = Frame(self) # 提示语,隶属于第一个 Frame,展示在这个 Frame 的第一行。 Label(self.input_frame,\ text="在这里输入:",\ font=self.font).grid(row=0, column=0, sticky='w') # 建立隶属于第一个 Frame 的文本框对象,用于后续获取文本。 self.input = ScrolledText(self.input_frame,\ font=self.font,\ # width=self.winfo_width() - 200,\ # height=self.winfo_height() * 2 // 5 - 30,\ fg="DarkSlateGray") # 在 Frame 的第二行展示。 self.input.grid(row=1, column=0) self.input_frame.grid(row=0, column=0) def create_button(self): """ 建立一个转换按钮。 """ # 绑定回车作为执行键(有问题)。 # self.input.bind(sequence="<Enter>", func=self.convent) # 建立确定按钮,点击后执行 convent() 方法开启对战。 self.conv_button = Button(self, text="转换",\ state="normal",\ command=self.convent,\ font=self.font,\ fg="red") self.conv_button.grid(row=1, column=0) def create_output(self): """ 用于输出处理后的乐谱。 """ self.output_frame = Frame(self) Label(self.output_frame,\ text="这里会输出:",\ font=self.font).grid(row=0, column=0, sticky='w') self.output = ScrolledText(self.output_frame,\ font=self.font,\ # width=self.winfo_width() - 200,\ # height=self.winfo_height() * 2 // 5 - 30,\ fg="DarkSlateGray") self.output.grid(row=1, column=0) self.output_frame.grid(row=2, column=0) # self.name_input2.bind(sequence="<Enter>", func=self.callback) def convent(self): strings = self.input.get(0.0, END) for char in strings: if char in conv_dict.keys(): self.output.insert(END, conv_dict[char]) else: self.output.insert(END, char) # 实时更新显示内容。 self.output.update() # 自动滚动到文本末尾。 self.output.see(END)
class Stego: def __init__(self, master): print("Setting up GUI") self.master = master self.master.title(TITLE) # Images Container imagesContainer = Frame(master=self.master, bg=self.master['bg']) self.canvasOrig = Canvas(bg='white') self.canvasOrig.pack(in_=imagesContainer, side='left') self.canvasNew = Canvas(bg='white') self.canvasNew.pack(in_=imagesContainer, side='left') imagesContainer.pack(side='top', fill='x') # File Opening/Saving Container fileSelectsContainer = Frame(master=self.master, bg=self.master['bg']) self.pickFileBtn = Button(text='Select an image', command=self.openFileHandle) self.pickFileBtn.pack(in_=fileSelectsContainer, side='left') self.saveNewBtn = Button(text='Save new image', command=self.saveImageHandle) self.saveNewBtn['state'] = DISABLED self.saveNewBtn.pack(in_=fileSelectsContainer, side='left') fileSelectsContainer.pack(side='top', fill='none', expand=True) # Text Input self.textInput = ScrolledText(master=self.master, width=TEXT_INPUT_W, height=TEXT_INPUT_H) self.textInput['state'] = DISABLED self.textInput.pack() # Step Input Container stepsContainer = Frame(master=self.master, bg=self.master['bg']) stepsLabel = Label(text='Step: ') stepsLabel.pack(in_=stepsContainer, side='left') self.stepsVar = StringVar() self.stepsVar.set(DEFAULT_STEP_COUNT) self.stepsInput = Entry(textvariable=self.stepsVar) self.stepsInput['state'] = DISABLED self.stepsInput.pack(in_=stepsContainer, side='left') self.maskSteps = IntVar() self.maskSteps.set(DEFAULT_MASK) self.maskStepsBtn = Checkbutton(text='Mask Steps', variable=self.maskSteps) self.maskStepsBtn['state'] = DISABLED self.maskStepsBtn.pack(in_=stepsContainer, side='left') stepsContainer.pack(side='top', fill='none', expand=True) # Message Buttons Container messageBtnsContainer = Frame(master=self.master, bg=self.master['bg']) self.hideMessageBtn = Button(text='Hide Message', command=self.hideMessageHandle) self.hideMessageBtn['state'] = DISABLED self.hideMessageBtn.pack(in_=messageBtnsContainer, side='left') self.showMessageBtn = Button(text='Recover Message', command=self.recoverMessageHandle) self.showMessageBtn['state'] = DISABLED self.showMessageBtn.pack(in_=messageBtnsContainer, side='left') messageBtnsContainer.pack(side='top', fill='none', expand=True) # Close Button self.closeBtn = Button(master=self.master, text='Close', command=master.quit) self.closeBtn.pack() def enableButtons(self): print("Enabling Buttons") self.saveNewBtn['state'] = NORMAL self.saveNewBtn.update() self.showMessageBtn['state'] = NORMAL self.showMessageBtn.update() self.hideMessageBtn['state'] = NORMAL self.hideMessageBtn.update() self.textInput['state'] = NORMAL self.textInput.update() self.stepsInput['state'] = NORMAL self.stepsInput.update() self.maskStepsBtn['state'] = NORMAL self.maskStepsBtn.update() # pickFileBtn callback def openFileHandle(self): print("Open File Handler Hit") filePath = filedialog.askopenfilename(initialdir=os.getcwd(), title='Select a File', filetypes=(('png files', '*.png'), ('all files', '*.*'))) print("File Path Selected: {}".format(filePath)) if filePath == "": return self.canvasOrig.filePath = filePath self.canvasOrig.img = PIL.Image.open(filePath) w, h = self.canvasOrig.img.size self.canvasOrig.config(width=w, height=h) self.canvasOrig.tkImg = PIL.ImageTk.PhotoImage(self.canvasOrig.img) self.canvasOrig.imgSprite = self.canvasOrig.create_image( w / 2, h / 2, anchor=CENTER, image=self.canvasOrig.tkImg) self.canvasOrig.update() self.enableButtons() # Convert a string to an array of bits def convertStringToBitsArray(self): print("Converting Message to Bit Array") bytes = bytearray() bytes.extend(self.textInput.get('1.0', END).encode('utf-8')) bytes.append(23) # End of Transmission Block utf-8 character bits = np.unpackbits(bytes) return bits def hideMessageHandle(self): print("Hide Message Handler Hit") self.canvasNew.filePath = self.canvasOrig.filePath self.canvasNew.img = PIL.Image.open(self.canvasNew.filePath) w, h = self.canvasNew.img.size self.canvasNew.config(width=w, height=h) self.canvasNew.tkImg = PIL.ImageTk.PhotoImage(self.canvasNew.img) self.canvasNew.imgSprite = self.canvasNew.create_image( w / 2, h / 2, anchor=CENTER, image=self.canvasNew.tkImg) self.canvasNew.update() bits = self.convertStringToBitsArray() size = self.canvasNew.img.size width, height = size newImg = PIL.Image.new('RGB', (width, height), 'white') pixels = newImg.load() # Use best fit steps if user did not enter a step count if self.stepsVar.get() == '': totalPixels = width * height - 4 tempStep = max(totalPixels * 3 // len(bits), 1) # Biggest step we can hold in 12 bits is 4095 step = min(tempStep, MAX_STEP) self.stepsVar.set(str(step)) else: # Use User input step step = int(self.stepsVar.get()) if step > MAX_STEP: step = MAX_STEP self.stepsVar.set(str(step)) print("Step Count: {}".format(step)) settingsBits = '{0:012b}'.format(step) bitsPtr = 0 settingsPtr = 0 for i in range(width): for j in range(height): pixel = self.canvasNew.img.getpixel((i, j)) if settingsPtr < len(settingsBits) and self.maskSteps.get( ) == 0: r = (pixel[0] & ~1) | int(settingsBits[settingsPtr]) settingsPtr += 1 g = (pixel[1] & ~1) | int(settingsBits[settingsPtr]) settingsPtr += 1 b = (pixel[2] & ~1) | int(settingsBits[settingsPtr]) settingsPtr += 1 pixels[i, j] = (r, g, b) elif settingsPtr < len(settingsBits) and self.maskSteps.get( ) == 1: pixels[i, j] = pixel settingsPtr += 1 else: if (i * width + j) % step == 0: # Change this pixel if bitsPtr + 3 < len(bits): r = (pixel[0] & ~1) | bits[bitsPtr] bitsPtr += 1 g = (pixel[1] & ~1) | bits[bitsPtr] bitsPtr += 1 b = (pixel[2] & ~1) | bits[bitsPtr] bitsPtr += 1 pixels[i, j] = (r, g, b) else: pixels[i, j] = pixel else: # Use original pixel pixels[i, j] = pixel self.canvasNew.img = newImg self.canvasNew.tkImg = PIL.ImageTk.PhotoImage(self.canvasNew.img) self.canvasNew.imgSprite = self.canvasNew.create_image( width / 2, height / 2, anchor=CENTER, image=self.canvasNew.tkImg) self.canvasNew.update() print('Hide Message Handle Hit') def saveImageHandle(self): print('Save Message Handle Hit') filepath = filedialog.asksaveasfilename( initialdir=os.getcwd(), title='Save as', filetypes=(('png file', '*.png'), ('all files', '*.*'))) if '.png' != filepath[-4:]: filepath += '.png' self.canvasNew.img.save(filepath, 'png') print("File saved as: {}".format(filepath)) def recoverMessageHandle(self): print("Recover Message Handler Hit") self.canvasNew.filePath = self.canvasOrig.filePath self.canvasNew.img = PIL.Image.open(self.canvasNew.filePath) w, h = self.canvasNew.img.size self.canvasNew.config(width=w, height=h) self.canvasNew.tkImg = PIL.ImageTk.PhotoImage(self.canvasNew.img) self.canvasNew.imgSprite = self.canvasNew.create_image( w / 2, h / 2, anchor=CENTER, image=self.canvasNew.tkImg) self.canvasNew.update() newImg = PIL.Image.new('RGB', (w, h), 'white') pixels = newImg.load() allBitsArr = [] if self.stepsVar.get() != '': print("Using User Input for Steps") step = max(int(self.stepsVar.get()), 1) else: print("Using Calculated Number for Steps") settingsBits = "" for x in range(4): pixel = self.canvasNew.img.getpixel((0, x)) rBit = (pixel[0] & 1) gBit = (pixel[1] & 1) bBit = (pixel[2] & 1) settingsBits += (str(rBit)) settingsBits += (str(gBit)) settingsBits += (str(bBit)) pixels[0, x] = (0, 0, 0) step = int(settingsBits, 2) self.stepsVar.set(step) for i in range(w): for j in range(h): # Ignore first 4 pixels (Message starts after the first 4 pixels) if i == 0 and j < 4: continue pixel = self.canvasNew.img.getpixel((i, j)) if ( i * w + j ) % step == 0: # Get bits of msg and change this pixel to black rBit = (pixel[0] & 1) gBit = (pixel[1] & 1) bBit = (pixel[2] & 1) allBitsArr.append(rBit) allBitsArr.append(gBit) allBitsArr.append(bBit) pixels[i, j] = (0, 0, 0) else: # Use original pixel pixels[i, j] = pixel msgBytes = np.packbits(allBitsArr) msg = "" for ele in msgBytes: if ele == 23: break msg += str(chr(ele)) self.textInput.delete('1.0', END) self.textInput.insert('1.0', msg) print("Message recovered: {}".format(msg)) self.canvasNew.img = newImg self.canvasNew.tkImg = PIL.ImageTk.PhotoImage(self.canvasNew.img) self.canvasNew.imgSprite = self.canvasNew.create_image( w / 2, h / 2, anchor=CENTER, image=self.canvasNew.tkImg) self.canvasNew.update()
class MainWindow(object): tmp_path = os.getenv('temp') tmp_file = os.path.join(tmp_path, 'info.txt') def __init__(self): self.root = Tk() self.root.title('Zabbix导入更新主机-V1.0') self.root.resizable(False, False) self.file = StringVar() self.url = StringVar() self.user = StringVar() self.pwd = StringVar() Label(self.root, text='用户名 ').grid(row=0, sticky=W) Label(self.root, text='密码 ').grid(row=1, sticky=W) Label(self.root, text='API URL ').grid(row=2, sticky=W) Label(self.root, text="主机列表 ").grid(row=3, sticky=W) Label(self.root, text='执行输出 ').grid(row=4, sticky=W + N) self.e_url = Entry(self.root, width=35, textvariable=self.url) self.e_file = Entry(self.root, width=35, textvariable=self.file) self.e_user = Entry(self.root, textvariable=self.user) self.e_pwd = Entry(self.root, textvariable=self.pwd) self.t_log = ScrolledText(self.root, width=40, height=13) self.e_pwd['show'] = '*' self.e_user.grid(row=0, column=1, sticky=W) self.e_pwd.grid(row=1, column=1, sticky=W) self.e_url.grid(row=2, column=1, sticky=W) self.e_file.grid(row=3, column=1, sticky=W) self.t_log.grid(row=4, column=1, columnspan=2, sticky=W + N) Button(self.root, text='选择文件', command=self.selectFile).grid(row=3, column=3, sticky=W) Button(self.root, text='提交', width=10, fg='red', command=self.operateHost).grid(row=5, column=3, sticky=S) # 读取上次填写的信息 try: with open(self.tmp_file) as f: vars = f.read().split(',') self.url.set(vars[0]) self.file.set(vars[1]) self.pwd.set(vars[2]) self.user.set(vars[3]) except Exception as e: pass self.root.mainloop() def selectFile(self): file_ = askopenfilename() self.file.set(file_) def writeRecoed(self, zabbixUrl, hostFile, zabbixPwd, zabbixUser): with open(self.tmp_file, 'w') as f: f.write(','.join((zabbixUrl, hostFile, zabbixPwd, zabbixUser))) def operateHost(self): zabbixUrl, hostFile, zabbixPwd, zabbixUser = self.e_url.get( ), self.e_file.get(), self.e_pwd.get(), self.e_user.get() self.writeRecoed(zabbixUrl, hostFile, zabbixPwd, zabbixUser) def print2text(string): self.t_log.insert('insert', "{}\n".format(string)) self.t_log.update() #通过模板名获取模板ID def get_templateid(template_name): templateList = [] template_data = {"host": template_name} result = zapi.template.get(filter=template_data) for i in range(len(template_name)): templateList.append( {"templateid": str(result[i]['templateid'])}) return templateList #通过Proxy名称获取ProxyID def get_proxyid(proxy_name): proxy_data = {"host": [proxy_name]} #print template_data result = zapi.proxy.get(filter=proxy_data) if result: return result[0]['proxyid'] else: return result #检查组名是否已经存在 def check_group(group_name): newGroup = [] for gname in group_name: if not zapi.hostgroup.get(filter={"name": gname}): groupid = zapi.hostgroup.create(name=gname) newGroup.append(gname) return newGroup #通过组名获取组ID def get_groupid(group_name): groupList = [] group_date = {"name": group_name} group_res = zapi.hostgroup.get(filter=group_date) for i in range(len(group_name)): groupList.append({"groupid": str(group_res[i]['groupid'])}) return groupList #添加主机 def create_host(host_data): data = {"host": [host_data['host']]} newGroups = host_data['groups'] newTemplates = host_data['templates'] newInventory = host_data['inventory'] hostInfo = zapi.host.get(filter=data) if hostInfo: print2text("主机 {} 已存在, 更新主机信息..".format(host_data["host"])) hostid = hostInfo[0]['hostid'] zapi.host.update({ "hostid": str(hostid), "inventory_mode": 0, "templates": newTemplates, "groups": newGroups, "inventory": newInventory }) return True else: res = zapi.host.create(host_data) if res: print2text("添加主机: %s " % (host_data["host"])) return True else: print2text("添加失败: %s " % (host_data["host"])) return False def multiple_item_spilt(string): if string.find(';') != -1: string = string.strip().split(';') return string def open_excel(file): data = xlrd.open_workbook(file) table = data.sheets()[0] nrows = table.nrows ncols = table.ncols excelList = [] for rownum in range(1, nrows): row_val = table.row_values(rownum) row_val = [str(i) for i in row_val] row_val = list(map(multiple_item_spilt, row_val)) excelList.append(row_val) return excelList def open_csv(file): hostlist = [] for line in open(file, encoding='utf-8'): if line.startswith('#'): continue t = tuple(line.strip().split(',')) l = list(map(multiple_item_spilt, t)) hostlist.append(l) return hostlist try: zapi = ZabbixAPI(zabbixUrl) zapi.login(zabbixUser, zabbixPwd) countTotal, countSucc, countFail = 0, 0, 0 filetype = os.path.splitext(hostFile)[-1] if filetype == '.csv': hosts = open_csv(hostFile) elif filetype in ('.xls', '.xlsx'): hosts = open_excel(hostFile) else: raise FileNotFoundError("文件格式不正确!") for host in hosts: countTotal += 1 hostName = host[0].strip() visibleName = host[1].strip() hostIp = host[2].strip() groupName = host[3] if isinstance(groupName, str): groupName = [groupName.strip()] template = host[4] if isinstance(template, str): template = [template.strip()] templateId = get_templateid(template) proxyName = host[5].strip() contact = host[6].strip() hostType = host[7].strip() print2text("检测主机 %s..." % hostName) newGroup = check_group(groupName) if newGroup: print2text('添加主机组: %s' % ','.join(newGroup)) groupId = get_groupid(groupName) host_data = { "host": hostName, "name": visibleName, "interfaces": [{ "type": 1, "main": 1, "useip": 1, "ip": hostIp, "dns": "", "port": 10050 }], "groups": groupId, "templates": templateId, "inventory": { "type": hostType, "contact": contact } } if proxyName != '': proxyId = get_proxyid(proxyName) host_data.update({"proxy_hostid": proxyId}) res = create_host(host_data) if res: countSucc += 1 else: countFail += 1 resultStr = '执行结果: 导入主机: {} 主机, 成功导入:{}, 失败导入:{}'.format( countTotal, countSucc, countFail) print2text(resultStr) messagebox.showinfo('执行结果', resultStr) except Exception as e: messagebox.showerror("错误", e)
class ChatWindow(tk.Frame): font_color = "#000000" font_size = 10 user_list = [] tag_i = 0 def __init__(self, contact, master=None): super().__init__(master) self.master = master self.master.child = self self.contact = contact self.user_listbox = tk.Listbox(self, bg='#EEE') add_listener(self.handle) master.resizable(width=True, height=True) master.geometry('660x500') master.minsize(520, 370) # self.sc = client.memory.sc if self.contact['is_private']: self.master.title(self.contact['username']) else: self.master.title( "Group:" + client_global.groups[self.contact['group_id']]['group_name'] + "#" + str(self.contact['group_id'])) # self.sc.send(MessageType.query_room_users, self.contact['id']) self.right_frame = tk.Frame(self, bg='white') self.user_listbox.bind('<Double-Button-1>', self.user_listbox_double_click) if not self.contact['is_private']: self.user_listbox.pack(side=LEFT, expand=False, fill=BOTH) self.refresh_user_listbox() self.right_frame.pack(side=LEFT, expand=True, fill=BOTH) self.input_frame = tk.Frame(self.right_frame, bg='white') self.input_textbox = ScrolledText(self.right_frame, height=10) self.input_textbox.bind("<Control-Return>", self.send_message) # self.input_textbox.bind_all('<Key>', self.apply_font_change) self.send_btn = tk.Button(self.input_frame, text='发送消息(Ctrl+Enter)', command=self.send_message) self.send_btn.pack(side=RIGHT, expand=False) self.image_btn = tk.Button(self.input_frame, text='发送图片', command=self.send_image) self.image_btn.pack(side=LEFT, expand=False) self.chat_box = ScrolledText(self.right_frame, bg='white') self.input_frame.pack(side=BOTTOM, fill=X, expand=False) self.input_textbox.pack(side=BOTTOM, fill=X, expand=False, padx=(0, 0), pady=(0, 0)) self.chat_box.pack(side=BOTTOM, fill=BOTH, expand=True) self.chat_box.bind("<Key>", lambda e: "break") self.chat_box.tag_config("default", lmargin1=10, lmargin2=10, rmargin=10) self.chat_box.tag_config("me", foreground="green", spacing1='5') self.chat_box.tag_config("them", foreground="blue", spacing1='5') self.chat_box.tag_config("message", foreground="black", spacing1='0') self.chat_box.tag_config("system", foreground="grey", spacing1='0', justify='center', font=(None, 8)) self.pack(expand=True, fill=BOTH) msgs = client_global.contacts_private.get(self.contact['username'], []) \ if self.contact['is_private'] \ else client_global.contacts_group.get(self.contact['group_id'], []) for msg in msgs: self.digest_message(msg) def handle(self, msg_type, msg_data): if msg_type == GeneralMessage.PASS: if self.contact['is_private'] and msg_data['is_private']: source = msg_data['source_username'] target = msg_data['target_username'] if set([self.contact['username'], client_global.current_user]) == set([source, target]): # 私信,双方的username和当前窗口匹配 self.digest_message(msg_data) if not self.contact['is_private'] and not msg_data['is_private'] \ and self.contact['group_id'] == msg_data['group_id']: # 群聊,group_id和当前窗口匹配 self.digest_message(msg_data) if msg_type == GeneralMessage.NEW_MEMBER: if self.contact['group_id'] == msg_data['group_id']: if msg_data['source_username'] == client_global.current_user: self.append_to_chat_box( 'you invited ' + msg_data['target_username'], 'system') else: self.append_to_chat_box( msg_data['source_username'] + ' invited ' + msg_data['target_username'], 'system') def refresh_user_listbox(self): # [id, nickname, online, username] self.user_listbox.delete(0, END) self.user_list = list( client_global.groups[self.contact['group_id']]['group_members']) self.user_list.sort(reverse=True) for uname in self.user_list: self.user_listbox.insert(0, uname) self.user_listbox.itemconfig(0, {'fg': ("green")}) def digest_message(self, data): time = data['time'].ctime() if data.get('source_username', None): self.append_to_chat_box( data['source_username'] + " " + time + '\n', ('me' if client_global.current_user == data['source_username'] else 'them')) # type 0 - 文字消息 1 - 图片消息 if data['type'] == 0: self.tag_i += 1 self.chat_box.tag_config('new' + str(self.tag_i), lmargin1=16, lmargin2=16) self.append_to_chat_box(data['data'] + '\n', 'new' + str(self.tag_i)) else: # no source_username, system self.append_to_chat_box(data['data'] + '\n', ('system')) if data['type'] == 1: client_global.tk_img_ref.append( ImageTk.PhotoImage(data=data['data'])) self.chat_box.image_create(END, image=client_global.tk_img_ref[-1], padx=16, pady=5) self.append_to_chat_box('\n', '') def user_listbox_double_click(self, _): if len(self.user_listbox.curselection()) == 0: return None index = self.user_listbox.curselection()[0] selected_user = self.user_list[-index - 1] if selected_user == client_global.current_user: return form = ChatForm(client_global.tkroot, takefocus=True) ChatWindow({'is_private': True, 'username': selected_user}, form) # pprint(selected_user_id) return def append_to_chat_box(self, message, tags): self.chat_box.insert(tk.END, message, [tags, 'default']) self.chat_box.update() self.chat_box.see(tk.END) def send_message(self, _=None): text = self.input_textbox.get("1.0", END) if not text or text.replace(" ", "").replace("\r", "").replace( "\n", "") == '': return msg = { 'is_private': self.contact['is_private'], 'type': 0, 'data': text } if msg['is_private']: msg['target_username'] = self.contact['username'] else: msg['group_id'] = self.contact['group_id'] client_global.session.send(GeneralMessage.SEND, msg) self.input_textbox.delete("1.0", END) def send_image(self): filename = filedialog.askopenfilename(filetypes=[("Image Files", [ "*.jpg", "*.jpeg", "*.png", "*.gif", "*.JPG", "*.JPEG", "*.PNG", "*.GIF" ]), ("All Files", ["*.*"])]) print("so dialog?") if filename is None or filename == '': return with open(filename, "rb") as imageFile: f = imageFile.read() b = bytes(f) msg = { 'type': 1, 'data': b, 'is_private': self.contact['is_private'], } if self.contact['is_private']: msg['target_username'] = self.contact['username'] else: msg['group_id'] = self.contact['group_id'] client_global.session.send(GeneralMessage.SEND, msg)
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 Application: def __init__(self, master, starttest, editcase): self.CheckVar1 = IntVar() self.CheckVar2 = IntVar() self.CheckVar3 = IntVar() Label(master, text='安卓自动化测试系统', font=('宋体', 20, "bold"), fg='blue').grid(row=0, column=0, rowspan=2, columnspan=8) Button(master, height=4, width=12, text="编辑case", command=editcase).grid(row=2, column=0, rowspan=2) Button(master, height=4, width=12, text="选择case", command=self.choosecase).grid(row=4, column=0, rowspan=2) Button(master, height=4, width=12, text="开始测试", command=starttest).grid(row=6, column=0, rowspan=2) Button(master, height=4, width=12, text="停止当前case", command=self.stop).grid(row=8, column=0, rowspan=2) Button(master, height=1, width=30, text="设置对比图片", command=self.PIC).grid(row=2, column=1, columnspan=2, padx=10) Button(master, height=1, width=12, text='摄像头截图', command=self.CAM).grid(row=2, column=4, sticky=W, padx=10) Button(master, height=1, width=16, text="查看问题截图", command=self.openerror).grid(row=2, column=6) Button(master, height=1, width=16, text="清空截图信息", command=self.clearPIC).grid(row=2, column=7) Button(master, text="全屏图片名称确认", command=self.queding).grid(row=3, column=2, sticky=W, padx=5) Button(master, text="ROI图片名称确认", height=1, width=16, command=self.ROIqueding).grid(row=3, column=4, sticky=W, padx=5) number1 = tkinter.StringVar() self.numberChosen1 = ttk.Combobox(master, width=12, textvariable=number1, state='readonly') self.numberChosen1['values'] = self.devices_list() # 设置下拉列表的值 self.numberChosen1.grid(column=7, row=3) # 设置其在界面中出现的位置 column代表列 row 代表行 # self.numberChosen1.current(0) # 设置下拉列表默认显示的值,0为numberChosen['values'] 的下标值 number2 = tkinter.StringVar() self.numberChosen2 = ttk.Combobox(master, width=12, textvariable=number2, state='readonly') self.numberChosen2['values'] = (0, 1, 2, 3) # 设置下拉列表的值 self.numberChosen2.grid(column=3, row=2, sticky=E) # 设置其在界面中出现的位置 column代表列 row 代表行 self.numberChosen2.current( 0) # 设置下拉列表默认显示的值,0为numberChosen['values'] 的下标值 self.nameinput1 = Entry(master) self.nameinput1.grid(row=3, column=1, sticky=E, padx=5) self.nameinput2 = Entry(master) self.nameinput2.grid(row=3, column=3, sticky=E, padx=5) self.logshow = ScrolledText(master, font=('宋体', 16, "bold"), fg='red') self.logshow.grid(row=4, column=1, columnspan=7, rowspan=6, sticky=W + E + N + S, padx=5, pady=5) # def ReceiveData(self): with open(r'..\report\report.txt') as f: while True: line = f.readline() # self.logshow.grid() self.logshow.insert(END, line) self.logshow.see(END) self.logshow.update() def devices_list(self): list = Server().get_device() return list def PIC(self): tkinter.messagebox.showinfo( 'Message', '如果要对比多个图片,请在标记图片后,在右边的方框命名,并在Excel中填上对应的名称,图片加载需要几秒钟,不要走开!') # os.system("python drow_ROI.py") DrawROI() def CAM(self): tkinter.messagebox.showinfo( 'Message', '如果要对比多个图片,请在标记图片后,在右边的方框命名,并在Excel中填上对应的名称,图片加载需要几秒钟,不要走开!') os.system("python use_camara.py") def queding(self): name1 = self.nameinput1.get() print(name1) name_list = os.listdir(InitParam()._screenshotpath) if name1 + '.png' in name_list: tkinter.messagebox.showinfo('Error', '图片名字冲突,请重命名') else: os.rename( os.path.join( os.path.abspath(os.path.dirname(os.getcwd())) + '\screenshot', "screenshot.png"), os.path.join( os.path.abspath(os.path.dirname(os.getcwd())) + '\screenshot', name1 + ".png")) def ROIqueding(self): name2 = self.nameinput2.get() print(name2) with open(InitParam().roi_yaml_filepath, 'r+') as fr: data = yaml.load(fr) y1 = data['key']['iy'] x1 = data['key']['ix'] y = data['key']['y'] x = data['key']['x'] data1 = { 'key' + name2: { "ix": x1, "iy": y1, "x": x, "y": y, } } yaml.dump(data1, fr) os.rename( os.path.join(InitParam()._screenshotpath, 'screenshot.png'), os.path.join(InitParam()._screenshotpath + '\ROI\\', name2 + ".png")) def openerror(self): filename = filedialog.askopenfilename(title='打开问题图片', initialdir='../error_screenshot', filetypes=[('png', '*.png'), ('All Files', '*')]) print(filename) image = cv2.imread(filename) cv2.imshow('image', image) def openreport(self): filename = filedialog.askopenfilename(title='打开内存测试报告', initialdir='../report', filetypes=[('csv', '*.csv'), ('All Files', '*')]) os.system(filename) def del_files(self, path): for root, dirs, files in os.walk(path): for name in files: if name.endswith(".png"): #指定要删除的格式,这里是png 可以换成其他格式 os.remove(os.path.join(root, name)) def clearPIC(self): with open(InitParam().roi_yaml_filepath, 'w') as fr: fr.truncate() fr.close() self.del_files('../main_word') def choosecase(self): # get = Getcase() # get.setcase() os.system("python select_testcase.py") def stop(self): os.system('taskkill -F -PID node.exe') sys.exit(1)