コード例 #1
0
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()
コード例 #2
0
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
コード例 #3
0
	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()
コード例 #4
0
ファイル: ListWindows.py プロジェクト: bjshan/pp4e
	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()
コード例 #5
0
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)
コード例 #6
0
	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()
コード例 #7
0
 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()
コード例 #8
0
ファイル: graphic.py プロジェクト: JarryShaw/TreeViewer
 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.')
コード例 #9
0
ファイル: graphic.py プロジェクト: JarryShaw/TreeViewer
 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)
コード例 #10
0
ファイル: ListWindows.py プロジェクト: SherwinKP/algorithm
 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()
コード例 #11
0
ファイル: ListWindows.py プロジェクト: Yodeman/PyMailGui
    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()
コード例 #12
0
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)
コード例 #13
0
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()  # 在这里生效,在主线程中运行
コード例 #14
0
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
コード例 #15
0
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
コード例 #16
0
ファイル: guiStreams.py プロジェクト: death-finger/Scripts
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)
コード例 #17
0
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)
コード例 #18
0
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()
コード例 #19
0
ファイル: guiStreams.py プロジェクト: skinkie/Scripts
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)
コード例 #20
0
ファイル: guiStreams.py プロジェクト: romanticair/python
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)
コード例 #21
0
ファイル: GUI.py プロジェクト: samhowes/Downloader
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)
コード例 #22
0
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'
コード例 #23
0
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}})
コード例 #24
0
ファイル: tkmain.py プロジェクト: AlynxZhou/namefight
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
コード例 #25
0
ファイル: client.py プロジェクト: JimJin2050/socket_demo
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
コード例 #26
0
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('警告', '设备连接异常 请重新连接设备!')
コード例 #27
0
ファイル: raw_server.py プロジェクト: JimJin2050/socket_demo
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()
コード例 #28
0
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}})
コード例 #29
0
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)
コード例 #30
0
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('警告', '设备连接异常 请重新连接设备!')
コード例 #31
0
ファイル: pymusic.py プロジェクト: AlynxZhou/Harmonica
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)
コード例 #32
0
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()
コード例 #33
0
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)
コード例 #34
0
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)
コード例 #35
0
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("进行标识被取消")
コード例 #36
0
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)