コード例 #1
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
コード例 #2
0
    def __init__(self, master):
        #使用Frame增加一层容器
        global scr_text
        global b1
        global b3
        fm1 = Frame(master)
        scr_text = ScrolledText(fm1,bg="Gainsboro",padx=5,pady=3)
        scr_text.insert(END, "请点击右侧按钮执行相关操作")
        scr_text.see(END)
        scr_text.pack(fill=BOTH,expand=YES,side=TOP,anchor=W,ipadx=3,ipady=3,pady=10,padx=30)
        fm1.pack(side=LEFT, fill=BOTH, expand=YES)

        fm2 = Frame(master)
        Label(fm2,text = "目标路径:").pack()
        Entry(fm2, textvariable = r_path).pack(padx=20,fill=X)
        Button(fm2, text = "路径选择", command = self.selectPath).pack(pady=10)

        b1 = Button(fm2,text="数据存储", command=lambda:self.thread_it(self.save_data_event))
        b1['width'] = 25
        b1['height'] = 1
        b1.pack(ipady=3,pady=10,padx=30)

        b3 = Button(fm2,text="数据读取", command=lambda:self.thread_it(self.read_data_event))
        b3['width'] = 25
        b3['height'] = 1
        b3.pack(ipady=3,pady=10,padx=30)     
        fm2.pack(side=LEFT)
コード例 #3
0
class ListFrame(Frame):
    def __init__(self, parent):
        super(ListFrame, self).__init__(master=parent)
        self.LEADING = ''
        self.setup()
        self.analyze_bar = AnalyzeBar(self, self)
        # report text
        self.report_text = ScrolledText(self,
                                        bg='white',
                                        relief=GROOVE,
                                        font='TkFixedFont')
        self.report_text.grid(row=0, column=0, sticky='news')
        # status bar
        self.status_bar = StatusBar(self)

    def setup(self):
        self.grid(row=1, column=0, sticky='wens')
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(0, weight=1)

    def append(self, string):
        self.report_text.insert(END, self.LEADING + string + '\n')
        self.report_text.see(END)

    def indicate(self, string, freeze):
        self.status_bar.set_text(string)
        if freeze:
            self.master.analyze_bar.freeze()
        else:
            self.master.analyze_bar.unfreeze()

    def clear(self):
        self.status_bar.set_text('Ready')
        self.report_text.delete('1.0', END)
コード例 #4
0
class App(Thread):
    client = socket.socket()
    client.connect(('localhost', 20001))

    def __init__(self, master):
        Thread.__init__(self)
        frame = Frame(master)
        frame.pack()
        self.gettext = ScrolledText(frame, height=20, width=80)
        self.gettext.pack()
        self.gettext.insert(END, 'Bienvenido al Chat Cliente\n\n')
        self.gettext.configure(state='disabled')
        sframe = Frame(frame)
        sframe.pack(anchor='w')
        self.pro = Label(sframe, text="Cliente>>")
        self.sendtext = Entry(sframe, width=80)
        self.sendtext.focus_set()
        self.sendtext.bind(sequence="<Return>", func=self.Send)
        self.pro.pack(side=LEFT)
        self.sendtext.pack(side=LEFT)

    def Send(self, args):
        self.gettext.configure(state='normal')
        text = self.sendtext.get()
        if text == "": text = " "
        #self.gettext.insert(END,'Servidor >> {} \n'.format(text))
        self.gettext.insert(END, 'Cliente  >> {} \n'.format(text))
        self.sendtext.delete(0, END)
        self.client.send(str.encode(text))
        self.sendtext.focus_set()
        self.gettext.configure(state='disabled')
        self.gettext.see(END)

    def run(self):
        Receive(self.client, self.gettext)
コード例 #5
0
class MessageBox(tk.Frame):
    """
    Box for displaying messages.
    """
    def __init__(self,parent, *args, **kwargs):
            tk.Frame.__init__(self,parent,*args,**kwargs)
            self.parent = parent
            self.grandpa = parent.grandpa
            # there is something wrong with that height
            
            self.tbox = ScrolledText(self,width=int(parent.w),height=int(parent.h/4) )
            
            #When using grid, any extra space in the parent is allocated proportionate to the "weight" of a row and/or a column 
            #(ie: a column with a weight of 2 gets twice as much of the space as one with a weight of 1). By default, rows and columns have a weight of 0 (zero),
            #meaning no extra space is given to them.
            #
            #You need to give the column that the widget is in a non-zero weight, 
            # so that any extra space when the window grows is allocated to that column
            #
            # You'll also need to specify a weight for the row, and a sticky value of N+S+E+W if you want it to grow in all directions
            self.grid_rowconfigure(0, weight = 1)
            self.grid_columnconfigure(0, weight = 1)
            self.tbox.grid(row = 0)
    
    def insert_text(self,text):
        self.tbox.insert(tk.END,text)
        self.tbox.see(tk.END)

    def clear(self):
        self.tbox.delete(1.0,tk.END) 
コード例 #6
0
class TextEditor():                     # see PyEdit for more
    def __init__(self, parent=None):
        # TODO: 1226 why This can generate independent window ?
        #frm=Toplevel(Frame.__init__(self, parent))
        frm=Toplevel()
        # TODO : assign title based on cmdline tag 
        frm.title('New Text')
        # TODO , how to make button and Text in a better Layout format ?
        #        grid() param to learn 
        Button(frm, text='Save',  command=self.onSave).grid(row=0,column=0)
        Button(frm, text='Cut',   command=self.onCut).grid(row=0,column=1)
        Button(frm, text='Paste', command=self.onPaste).grid(row=0,column=2)
        Button(frm, text='Find',  command=self.onFind).grid(row=0,column=3)
        self.text = ScrolledText(frm)
        self.text.grid(row=1,columnspan=4)

        #Button(self, text='Save',  command=self.onSave).grid()
        #Button(self, text='Cut',   command=self.onCut).grid()
        #Button(self, text='Paste', command=self.onPaste).grid()
        #Button(self, text='Find',  command=self.onFind).grid()
        #self.text = ScrolledText(self)

    def gettext(self):                                   # returns a string
        return self.text.get('1.0', END+'-1c')           # first through last

    def onSave(self):
        filename = asksaveasfilename()
        #print(filename)
        if filename:
            alltext = self.gettext()                      # first through last
            open(filename, 'w').write(alltext)            # store text in file

    def onCut(self):
        text = self.text.get(SEL_FIRST, SEL_LAST)         # error if no select
        self.text.delete(SEL_FIRST, SEL_LAST)             # should wrap in try
        self.text.clipboard_clear()
        self.text.clipboard_append(text)

    def onPaste(self):                                    # add clipboard text
        try:
            text = self.text.selection_get(selection='CLIPBOARD')
            self.text.insert(INSERT, text)
        except TclError:
            pass                                          # not to be pasted

    def onFind(self):
        target = askstring('SimpleEditor', 'Search String?')
        if target:
            where = self.text.search(target, INSERT, END)  # from insert cursor
            if where:                                      # returns an index
                print(where)
                pastit = where + ('+%dc' % len(target))    # index past target
               #self.text.tag_remove(SEL, '1.0', END)      # remove selection
                self.text.tag_add(SEL, where, pastit)      # select found target
                self.text.mark_set(INSERT, pastit)         # set insert mark
                self.text.see(INSERT)                      # scroll display
                self.text.focus()                          # select text widget
コード例 #7
0
ファイル: gui.py プロジェクト: wearyoung/daovision
	def _conButtonCmd(self):
		popwin = PopupWindow("Container Log")
		popwin.grab_set()
		popwin.focus()
		details = self.checkresult.getContainerLogs()
		stext = ScrolledText(popwin)
		stext.config(font = ("courier", 15, "normal"))
		stext.pack()
		for d in details:
			stext.insert("end",d)
		stext.see("end")
コード例 #8
0
ファイル: gui.py プロジェクト: wearyoung/daovision
	def _buttonCmd(self):
		popwin = PopupWindow("Details")
		popwin.grab_set()
		popwin.focus()
		details = self.checkresult.getDetails()
#		with os.popen("kubectl describe nodes/115.154.138.241") as re:
#			details = re.readlines()
		stext = ScrolledText(popwin)
		stext.config(font = ("courier", 15, "normal"))
		stext.pack()
		for d in details:
			stext.insert("end",d)
		stext.see("end")
class Principal(Thread):
    conexion = socket.socket()
    conexion.bind(('localhost', 20001))
    conexion.listen(5)
    client, addr = conexion.accept()

    def __init__(self, master):
        Thread.__init__(self)
        frame = Frame(master)
        frame.pack()
        self.mensaje = ScrolledText(frame,
                                    height=10,
                                    width=80,
                                    bg='mint cream',
                                    state=NORMAL)
        self.mensaje.pack()
        sframe = Frame(frame)
        sframe.pack(anchor='w')
        self.pro = Label(sframe, text="Servidor >>")
        self.env_msj = Entry(sframe, width=80)
        self.env_msj.focus_set()
        self.env_msj.bind(sequence="<Return>", func=self.enviar)
        self.pro.pack(side=LEFT)
        self.env_msj.pack(side=LEFT)
        self.boton = Button(text="Cerrar",
                            command=ventana.destroy,
                            height=2,
                            width=10,
                            bg="MistyRose3")
        self.boton.pack(side=RIGHT)
        self.mensaje.tag_config("yo", foreground='black', font='Fixedsys 14')
        self.mensaje.insert(END, 'Bienvenido al Chat Servidor\n\n', "yo")
        self.mensaje.configure(state=DISABLED)

    def enviar(self, args):
        self.mensaje.configure(state=NORMAL)
        text = self.env_msj.get()
        if text == "": text = " "
        self.mensaje.tag_config("el",
                                foreground='midnight blue',
                                font='Fixedsys 14')
        self.mensaje.insert(END, 'Servidor >> %s \n' % text, "el")
        self.env_msj.delete(0, END)
        self.client.send(str.encode(text))
        self.env_msj.focus_set()
        self.mensaje.configure(state=DISABLED)
        self.mensaje.see(END)

    def run(self):
        msj_entrante(self.client, self.mensaje)
コード例 #10
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)
コード例 #11
0
    def onHist(self):
        # show recent calcs log popup
        from tkinter.scrolledtext import ScrolledText  # or PP4E.Gui.Tour
        new = Toplevel()  # make new window
        ok = Button(new, text="OK", command=new.destroy)
        ok.pack(pady=1, side=BOTTOM)  # pack first=clip last
        text = ScrolledText(new, bg='beige')  # add Text + scrollbar
        text.insert('0.0', self.eval.getHist())  # get Evaluator text
        text.see(END)  # 3.0: scroll to end
        text.pack(expand=YES, fill=BOTH)

        # new window goes away on ok press or enter key
        new.title("PyCalc History")
        new.bind("<Return>", (lambda event: new.destroy()))
        ok.focus_set()  # make new window modal:
        new.grab_set()  # get keyboard focus, grab app
        new.wait_window()  # don't return till new.destroy
コード例 #12
0
ファイル: calculator.py プロジェクト: chuzui/algorithm
    def onHist(self):
        # show recent calcs log popup
        from tkinter.scrolledtext import ScrolledText     # or PP4E.Gui.Tour
        new = Toplevel()                                  # make new window
        ok = Button(new, text="OK", command=new.destroy)
        ok.pack(pady=1, side=BOTTOM)                      # pack first=clip last
        text = ScrolledText(new, bg='beige')              # add Text + scrollbar
        text.insert('0.0', self.eval.getHist())           # get Evaluator text
        text.see(END)                                     # 3.0: scroll to end
        text.pack(expand=YES, fill=BOTH)

        # new window goes away on ok press or enter key
        new.title("PyCalc History")
        new.bind("<Return>", (lambda event: new.destroy()))
        ok.focus_set()                      # make new window modal:
        new.grab_set()                      # get keyboard focus, grab app
        new.wait_window()                   # don't return till new.destroy
コード例 #13
0
ファイル: Visual.py プロジェクト: abhishekreddy/Jarvis
class Visual(tk.Frame):
    """This class represents visual bot"""

    botname = BOT_NAME
    username = USER_NAME

    def __init__(self, *args):
        tk.Frame.__init__(self, *args)
        self.label = tk.Label(self, text=self.botname)
        self.label.pack()
        self.chat = ScrolledText(self,
                                 wrap=WORD,
                                 state=DISABLED,
                                 height=CHAT_HEIGHT,
                                 width=CHAT_WIDTH)
        self.chat.pack()
        self.comment = tk.Text(self,
                               wrap=WORD,
                               height=COMMENT_HEIGHT,
                               width=COMMENT_WIDTH)
        self.comment.pack()
        self.button = tk.Button(self,
                                text=BUTTON_TEXT,
                                command=self.button_callback)
        self.button.pack()

        self.talk = ProcessSentence()

    def button_callback(self):
        text = self.comment.get("1.0", END)
        self.update_chat(self.talk.get_user_name(), text)
        text.rstrip(os.linesep)
        responce = self.talk.check_for_greeting(text)
        if responce:
            self.update_chat(self.talk.get_bot_name(), responce + '\n')

    def update_chat(self, name, text):
        self.chat.configure(state=NORMAL)
        self.chat.insert('end', name + " : ", 'GREEN')
        self.chat.tag_config('GREEN', foreground='GREEN')
        self.chat.insert('end', text)
        self.chat.see(END)
        self.chat.configure(state=DISABLED)
コード例 #14
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)
コード例 #15
0
class ResultFrame(Frame):
    def __init__(self, master):
        super().__init__(master, bd=1, relief=SUNKEN)
        self.grid_columnconfigure(1, weight=1)
        self.pack(fill=BOTH, expand=1, padx=10, pady=10)

        self.result_frame_text = ScrolledText(self)
        # self.result_frame_text = ScrolledText(self, state="disabled")
        self.result_frame_text.pack(fill=BOTH, expand=1)

        # Redirect stdout and stderr to this frame.
        sys.stdout = self
        sys.stderr = self

    def write(self, text):
        sys.__stdout__.write(text)
        # self.result_frame_text.config(state="normal")
        self.result_frame_text.insert(END, text)
        # self.result_frame_text.config(state="disabled")
        self.result_frame_text.see(END)
コード例 #16
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()
コード例 #17
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)
コード例 #18
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)
コード例 #19
0
class Right_panel(ttk.Frame):
    """
    UI element containing the interbal frame and input logic

    Args:
        parent: Tkinter parent object
        on_fetch_click: callback for fetch button press
        args: Tkinter options
        kwargs: more Tkinter options

    Attributes:
        fetch_btn: button to issue a fetch command to selected host
        keylog_text: area to display the keylog content
    """
    def __init__(self, parent, on_fetch_click, *args, **kwargs):
        super().__init__(parent, *args, **kwargs)

        self.fetch_btn = ttk.Button(self, text="fetch")
        self.fetch_btn.bind("<ButtonRelease-1>", on_fetch_click)
        self.fetch_btn.pack(fill=tk.X)

        self.keylog_text = ScrolledText(self, state="disabled")
        self.keylog_text.pack(fill=tk.BOTH, expand=1)

    def set_text(self, text, append=False):
        """
        Sets text in the keylog text area

        Args:
            text: text to put in text area
            append: whether to append the text to the end or clear then put the text. default is false
        """
        self.keylog_text.configure(state='normal')
        if not append:
            self.keylog_text.delete(1.0, tk.END)
        self.keylog_text.insert(tk.END, text)
        self.keylog_text.configure(state='disabled')
        self.keylog_text.see(tk.END)
コード例 #20
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\text\n' % myname)
        self.text.see('end')

    def threadfail(self, exc_info, myname):  # have access to self state
        self.text.insert('end', '%s\tfail\t%s\n' % (myname, exc_info[0]))

    def threadprogress(self, count, myname):
        self.text.insert('end', '%s\tprog\t%s\n' % (myname, count))
        self.text.see('end')
        self.text.update()  # works here: run in main thread
コード例 #21
0
class DebugLogger(object):
    def __init__(self):
        self.GUI = tk.Toplevel()
        self.GUI.protocol('WM_DELETE_WINDOW', self.GUI.withdraw)
        self.GUI.title("Debug Console")

        self.textbox = ScrolledText(self.GUI)
        self.textbox.configure(state="disabled")
        self.textbox.pack(fill="both", expand=True)
        self.textbox.tag_config('stdout', foreground='blue')
        self.textbox.tag_config('stderr', foreground='red')
        self.GUI.focus()
        self.stdout = StdOut(self)
        self.stderr = StdErr(self)

    def write(self, buf, type):
        self.textbox.configure(state="normal")
        self.textbox.insert(tk.END, str(buf), type)
        self.textbox.configure(state="disabled")
        self.textbox.see("end")

    def flush(self):
        pass
コード例 #22
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)
コード例 #23
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)
コード例 #24
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()  # 在这里生效,在主线程中运行
コード例 #25
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
コード例 #26
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()
コード例 #27
0
ファイル: Swipe.py プロジェクト: chuanzhidong/GiftCards
class SwipeFrame(Frame):
    def __init__(self, parent):
        super().__init__(parent)

        self.columnconfigure(0, weight=1)
        self.rowconfigure(4, weight=1)

        Separator(self, orient=HORIZONTAL).grid(row=0,
                                                columnspan=4,
                                                sticky=E + W,
                                                pady=5)

        self.swipe_field = EntryWithHintText(
            self,
            hint="Type PIN, then swipe card. If there's no PIN, just swipe.")
        self.swipe_field.grid(row=1, column=0, sticky=E + W)
        self.swipe_field.bind('<Return>', self.card_swiped)

        Separator(self, orient=HORIZONTAL).grid(row=2,
                                                columnspan=4,
                                                sticky=E + W,
                                                pady=5)

        Label(self, text='Swipe Output', anchor=CENTER).grid(row=3,
                                                             columnspan=4,
                                                             sticky=E + W)

        self.output_text = ScrolledText(self,
                                        bg='#F0F0F0',
                                        borderwidth=2,
                                        relief=GROOVE)
        self.output_text.config(state=DISABLED)
        self.output_text.grid(row=4, columnspan=4, sticky=N + E + W + S)

    def card_swiped(self, event=None):
        field_data = self.swipe_field.get()

        # card not swiped
        if "%B" not in field_data:
            return
        else:
            pin, data = field_data.split("%B")

        if data.count('?') != 2 or data.count('^') != 2:
            self.swipe_field.delete(len(pin), END)
        else:
            sec1, sec2, sec3 = data.split('^')
            if len(sec1) != 19:
                t1, t2, t3 = sec3.split('?')
                if len(t1) == 8:
                    card_no = sec1[0:16]
                else:
                    card_no = sec1[0] + sec3[14:16] + sec1[6:15] + sec3[16:20]
            else:
                card_no = sec1[0:20]

            output_line = '{},{}\n'.format(
                ''.join(card_no[i:i + 4] for i in range(0, len(card_no), 4)),
                pin)
            self.output_text.config(state=NORMAL)
            self.output_text.insert('end-1c', output_line)
            self.output_text.see(END)
            self.output_text.config(state=DISABLED)
            self.swipe_field.delete(0, END)
コード例 #28
0
class Chat_UI():
    def __init__(self, main_window):
        # region UI
        global USERNAME
        self.online_users_listbox = ''  # 用于显示在线用户的列表框
        self.online_users = []  # 在线用户列表
        self.chatter = '群聊'  # 聊天对象, 默认为群聊

        self.main_window = main_window
        self.main_window.geometry('590x420+320+100')
        self.main_window.resizable(0, 0)

        # 消息区域
        self.message_aera = ScrolledText(self.main_window)
        self.message_aera.place(x=5, y=5, width=450, height=360)
        # 消息区字体颜色
        self.message_aera.tag_config('red', foreground='red')
        self.message_aera.tag_config('blue', foreground='blue')
        self.message_aera.tag_config('green', foreground='green')
        self.message_aera.insert(tkinter.END, '您已进入聊天室\n', 'blue')

        # 在线用户区
        self.online_users_listbox = tkinter.Listbox(self.main_window)
        self.online_users_listbox.place(x=455, y=5, width=130, height=360)
        # 在用户列表绑定选择聊天对象事件
        self.online_users_listbox.bind('<ButtonRelease-1>',
                                       self.select_chatter)

        # 消息编辑区
        self.message_text = tkinter.StringVar()
        self.message_text.set('')
        self.message_entry = tkinter.Entry(self.main_window,
                                           width=120,
                                           textvariable=self.message_text)
        self.message_entry.place(x=5, y=375, width=435, height=30)

        # 发送按钮
        self.send_button = tkinter.Button(self.main_window,
                                          text='发送',
                                          command=self.send)
        self.send_button.place(x=455, y=375, width=60, height=30)
        # 绑定回车发送信息
        self.main_window.bind('<Return>', self.send)

        # 清空按钮
        self.send_button = tkinter.Button(self.main_window,
                                          text='清空',
                                          command=self.clear)
        self.send_button.place(x=525, y=375, width=60, height=30)
        # endregion

        self.my_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.my_socket.connect((SERVER_IP, SERVER_PORT))

        # 用户名+=ip+port
        addr = self.my_socket.getsockname()  # 获取客户端ip和端口号
        addr = addr[0] + ':' + str(addr[1])  # SERVER_IP:port
        USERNAME = USERNAME + ' (' + addr + ')'
        self.main_window.title(USERNAME + ' 群聊')

        self.my_socket.send(USERNAME.encode())

        r = threading.Thread(target=self.recv)
        r.start()  # 开始线程接收信息

    # 清空按钮事件
    def clear(self, *args):
        self.message_text.set('')

    # 发送按钮事件
    def send(self, *args):
        self.online_users.append('群聊')
        if self.chatter not in self.online_users:
            tkinter.messagebox.showerror('发送失败', message='请选择聊天对象')
            return False
        if self.chatter == USERNAME:
            tkinter.messagebox.showerror('发送失败', message='请不要选择自己')
            return False
        msg = USERNAME + ':;' + self.message_entry.get() + ':;' + self.chatter
        self.my_socket.send(msg.encode())
        self.clear()  # 发送后清空文本框
        return True

    # 选择聊天对象事件
    def select_chatter(self, *args):
        # 获取点击的索引然后得到内容(用户名)
        index = self.online_users_listbox.curselection()[0]
        if index == 0 or index == 1:
            self.main_window.title(USERNAME + ' 群聊')
            self.chatter = '群聊'
        else:
            self.chatter = self.online_users_listbox.get(index)
            self.main_window.title(USERNAME + '  -->  ' + self.chatter)

    # 刷新在线列表
    def refresh_list(self, receive_data):
        self.online_users_listbox.delete(0, tkinter.END)  # 清空列表框
        online_count = ('在线人数: ' + str(len(receive_data)) + ' 人')
        self.online_users_listbox.insert(tkinter.END, online_count)
        self.online_users_listbox.itemconfig(tkinter.END,
                                             fg='black',
                                             bg="lightgray")
        self.online_users_listbox.insert(tkinter.END, '群聊')
        self.online_users_listbox.itemconfig(tkinter.END, fg='black')
        for data in receive_data:
            self.online_users_listbox.insert(tkinter.END, data)
            self.online_users_listbox.itemconfig(tkinter.END, fg='black')

    # 接收服务端发送的信息
    def recv(self):
        while True:
            receive_data = self.my_socket.recv(1024)
            receive_data = receive_data.decode()
            try:
                # 接收到在线用户列表
                receive_data = json.loads(receive_data)
                self.online_users = receive_data
                self.refresh_list(receive_data)
            except:
                # 接收到消息
                receive_data = receive_data.split(':;')
                data1 = receive_data[0]  # 发送信息的用户名
                data2 = receive_data[1].strip()  # 消息
                data3 = receive_data[2]  # 聊天对象
                if data3 == '群聊':
                    data2 = data1 + ' to all : ' + data2 + '\n'
                    if data1 == USERNAME:  # 自己发送的
                        self.message_aera.insert(tkinter.END, data2, 'blue')
                    else:  # 接收的
                        self.message_aera.insert(tkinter.END, data2, 'green')
                elif data1 == USERNAME or data3 == USERNAME:  # 私聊
                    data2 = data1 + ' to ' + data3 + ' : ' + data2 + '\n'
                    self.message_aera.insert(tkinter.END, data2, 'red')
                self.message_aera.see(tkinter.END)

    def __del__(self):
        self.my_socket.close()  # 关闭 TCP 连接
コード例 #29
0
class ChatClientGUI(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.master = master
        self.master.protocol("WM_DELETE_WINDOW", self.close_window)
        self.master.title("Chat Client GUI")
        self.pack(fill="both", expand=True)
        self.font = font.Font(font=("Helvetica Neue", 12))
        self.background_color = "#333333"
        self.box_background_color = "#655F5F"
        self.text_color = "#FFFFFF"

        # Build the chat
        self.chat_frame = Frame(self)
        self.chat_frame.pack(fill="both", expand=True, anchor="nw")
        self.chat_frame.configure(bg=self.background_color)
        self.chat_box = ScrolledText(self.chat_frame,
                                     font=self.font,
                                     wrap="word")
        self.chat_box.configure(state="disabled",
                                bg=self.box_background_color,
                                fg=self.text_color)
        self.chat_box.pack(side="left",
                           fill="both",
                           expand=True,
                           padx=5,
                           pady=5,
                           anchor="nw")

        # Users list
        self.users_label = Label(self.chat_frame,
                                 text="Users in Channel",
                                 bg=self.background_color,
                                 fg=self.text_color,
                                 font=font.Font(font=("Helvetica Neue", 12,
                                                      "bold")))
        self.users_label.pack(side="top", anchor="n")
        self.users_box = ScrolledText(self.chat_frame,
                                      font=self.font,
                                      width=25)
        self.users_box.configure(state="disabled",
                                 bg=self.box_background_color,
                                 fg=self.text_color)
        self.users_box.pack(side="right",
                            fill="y",
                            padx=5,
                            pady=5,
                            anchor="ne")

        # Build the input section
        self.input_frame = Frame(self, height=1)
        self.input_frame.pack(side="bottom", fill="x", anchor="sw")
        self.input_frame.configure(bg=self.background_color)
        self.chat_input = Entry(self.input_frame, font=self.font)
        self.chat_input.configure(bg=self.box_background_color,
                                  fg=self.text_color,
                                  insertbackground=self.text_color)
        self.chat_input.pack(side="left",
                             fill="x",
                             expand=True,
                             padx=5,
                             pady=5)
        self.chat_input.bind("<Return>", self.send_message_on_return)
        self.send_button = Button(self.input_frame,
                                  text="Send",
                                  width=10,
                                  command=self.send_message,
                                  bg=self.box_background_color,
                                  fg=self.text_color)
        self.send_button.pack(side="right", fill="x", padx=5, pady=5)

        # Update the window and then set the minsize
        self.master.update()
        self.master.minsize(self.master.winfo_width(),
                            self.master.winfo_height())

        # Non tkinter class variables
        self.instance = None
        self.running = True

        # Spawn threads used for chat client and channel users fetch
        self.chat_client_thread = Thread(target=self.start_chat_client)
        self.chat_client_thread.start()
        self.users_fetch = Thread(target=self.get_users)
        self.users_fetch.start()

    def send_message(self):
        message = self.chat_input.get()
        self.instance.send_privmsg(message)
        self.write_to_chatbox(message, self.instance.client_username)
        self.chat_input.delete(0, "end")

    def send_message_on_return(self, event):
        # Forward to the send message handler (to get around needing the "event" parameter)
        self.send_message()
        del event

    def write_to_chatbox(self, msg, username):
        date = f"[{datetime.now():%I:%M:%S}] "
        formatted_message = f"{date} {username}: {msg}"
        self.chat_box.configure(state="normal")
        self.chat_box.insert("end", formatted_message + "\n")
        self.chat_box.see("end")
        self.chat_box.configure(state="disabled")

    def write_many(self, msg, times):
        for _ in range(times):
            self.write_to_chatbox(msg)

    def start_chat_client(self):
        with open("settings.json", "r") as r:
            settings = json.load(r)
            username = settings["username"]
            token = settings["token"]
            channel = settings["channel"]
            server = settings["server"]
            port = settings["port"]
        self.instance = IRCClient(username, token, channel, server, port,
                                  settings, self)
        self.instance.start()

    def get_users(self):
        while self.running:
            time.sleep(5)
            users = self.instance.channels.get(self.instance.channel).users()
            self.users_box.configure(state="normal")
            self.users_box.delete('1.0', 'end')
            for user in users:
                self.users_box.insert('end', user + "\n")
            self.users_box.configure(state="disabled")

    def close_window(self):
        self.running = False
        self.instance.disconnect()
        os._exit(0)
コード例 #30
0
class ToolsGui():
    def __init__(self, init_window_name):
        self.init_window_name = init_window_name
        self.bs64image = None

    def md5_upper_event(self, event):
        self.str_trans_to_md5(True)

    def fast_copy(self):
        data = self.result_data_Text.get(0.0, END).strip()
        pyperclip.copy(data)

    # 设置窗口
    def set_init_window(self):
        # 左侧视图
        self.init_window_name.update()
        print(self.init_window_name.winfo_width())
        frm1 = Frame(self.init_window_name)
        frm1.pack(fill=BOTH, side=LEFT, expand=True)

        self.init_data_label = Label(frm1,
                                     text="待处理数据",
                                     font=("宋体", 15, "bold"),
                                     height=2,
                                     bg='dodgerblue')
        self.init_data_label.pack(fill=X)

        self.init_data_Text = ScrolledText(frm1, undo=True)  # 原始数据录入框
        self.init_data_Text.pack(fill=BOTH, expand=True)
        self.log_label = Label(frm1,
                               text="日志",
                               font=("宋体", 15, "bold"),
                               height=2,
                               bg='dodgerblue')
        self.log_label.pack(fill=X)
        self.log_data_Text = ScrolledText(frm1, )  # 日志框
        self.log_data_Text.pack(fill=BOTH, expand=True)

        # 中间按钮试图
        frm2 = Frame(self.init_window_name)
        frm2.pack(fill=BOTH, side=LEFT, expand=True)
        # md5计算
        self.str_trans_to_md5_button = Button(frm2,
                                              text="MD5计算\n(右键点击大写)",
                                              bg="limegreen",
                                              command=self.str_trans_to_md5)
        self.str_trans_to_md5_button.bind('<Button-3>',
                                          self.md5_upper_event,
                                          add=True)
        self.str_trans_to_md5_button.pack(fill=BOTH, expand=True)
        # base64编码
        self.str_trans_to_bs64_button = Button(frm2,
                                               text="base64编码",
                                               bg="gold",
                                               command=self.str_trans_to_bs64)
        self.str_trans_to_bs64_button.pack(fill=BOTH, expand=True)
        # base64解码
        self.bs64_trans_to_str_button = Button(frm2,
                                               text="base64解码",
                                               bg="limegreen",
                                               command=self.bs64_trans_to_str)
        self.bs64_trans_to_str_button.pack(fill=BOTH, expand=True)
        # url编码
        self.str_trans_to_url_button = Button(frm2,
                                              text="URL编码",
                                              bg="gold",
                                              command=self.str_trans_to_url)
        self.str_trans_to_url_button.pack(fill=BOTH, expand=True)
        # url解码
        self.url_trans_to_str_button = Button(frm2,
                                              text="URL解码",
                                              bg="limegreen",
                                              command=self.url_trans_to_str)
        self.url_trans_to_str_button.pack(fill=BOTH, expand=True)
        # unicode转中文
        self.unicode_trans_to_zh_button = Button(
            frm2,
            text="Unicode转中文",
            bg="gold",
            command=self.unicode_trans_to_zh)
        self.unicode_trans_to_zh_button.pack(fill=BOTH, expand=True)
        # json格式化
        self.str_trans_to_json_button = Button(frm2,
                                               text="Json格式化",
                                               bg="limegreen",
                                               command=self.str_trans_to_json)
        self.str_trans_to_json_button.pack(fill=BOTH, expand=True)

        # base64转图片
        self.bs64_trans_to_pic_button = Button(frm2,
                                               text="base64转图片",
                                               bg="gold",
                                               command=self.bs64_trans_to_pic)
        self.bs64_trans_to_pic_button.pack(fill=BOTH, expand=True)

        # 图片转base64
        self.pic_trans_to_bs64_button = Button(frm2,
                                               text="图片转base64",
                                               bg="limegreen",
                                               command=self.pic_trans_to_bs64)
        self.pic_trans_to_bs64_button.pack(fill=BOTH, expand=True)

        # chrome请求头转换
        self.header_trans_to_json_button = Button(
            frm2,
            text="请求头转Json",
            bg="gold",
            command=self.header_trans_to_json)
        self.header_trans_to_json_button.pack(fill=BOTH, expand=True)

        # 右侧结果试图
        frm3 = Frame(self.init_window_name)
        frm3.pack(fill=BOTH, side=RIGHT, expand=True)
        self.result_data_label = Label(frm3,
                                       height=2,
                                       text="输出结果",
                                       font=("宋体", 15, "bold"),
                                       bg="dodgerblue")
        self.result_data_label.pack(fill=X)
        copybtn = Button(self.result_data_label,
                         text='一键复制',
                         command=self.fast_copy)
        copybtn.pack(side=RIGHT)
        self.result_data_Text = ScrolledText(frm3)  # 处理结果展示
        self.result_data_Text.pack(fill=BOTH, expand=True)

    # 功能函数
    def str_trans_to_md5(self, upper=False):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                myMd5 = hashlib.md5()
                myMd5.update(src)
                res = myMd5.hexdigest()
                if upper:
                    res = res.upper()
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_bs64(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = base64.b64encode(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def bs64_trans_to_str(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = base64.b64decode(src).decode()
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_url(self):
        src = self.init_data_Text.get(0.0, END).strip().encode()
        if src:
            try:
                res = urllib.parse.quote(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def url_trans_to_str(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                res = urllib.parse.unquote(src)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def unicode_trans_to_zh(self):
        src = self.init_data_Text.get(0.0, END).strip()
        print(src, type(src))
        if src:
            try:
                src = src.replace('\\\\u', '\\u')
                res = src.encode().decode('unicode_escape')
                print(res, type(res))
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def str_trans_to_json(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                tmp = eval(src)
                res = json.dumps(tmp, ensure_ascii=False, indent=4)
                self.write_res_to_text(res)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def pic_trans_to_bs64(self):
        try:
            picpath = filedialog.askopenfilename(title='选择图片文件',
                                                 filetypes=[('PNG图片', '*.png'),
                                                            ('JPG图片',
                                                             ('*.jpg', '*.jpe',
                                                              '*.jpeg')),
                                                            ('BMP图片', '*.bmp'),
                                                            ('所有文件', '*')])
            if picpath:
                self.init_data_Text.delete(1.0, END)
                self.init_data_Text.insert(1.0, '图片路径:\n' + picpath)
                with open(picpath, 'rb') as handle:
                    image_base64 = str(base64.b64encode(handle.read()),
                                       encoding='utf-8')
                    self.write_res_to_text(image_base64)
        except Exception as e:
            self.result_data_Text.delete(1.0, END)
            self.write_log_to_text("[ERROR]:%s" % e)

    def bs64_trans_to_pic(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if src:
            try:
                binary_data = base64.b64decode(src)
                # print(binary_data)
                img_data = BytesIO(binary_data)
                img_open = Image.open(img_data)
                self.bs64image = ImageTk.PhotoImage(img_open)
                self.result_data_Text.delete(1.0, END)
                self.result_data_Text.image_create(END, image=self.bs64image)
            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    def header_trans_to_json(self):
        src = self.init_data_Text.get(0.0, END).strip()
        if ': ' in src:
            try:
                lines = src.split('\n')
                h = {}
                for line in lines:
                    if line:
                        l = line.split(': ')
                        h[l[0]] = l[1]
                res = json.dumps(h,
                                 ensure_ascii=False,
                                 indent=4,
                                 separators=(',', ': '))
                self.write_res_to_text(res)

            except Exception as e:
                self.result_data_Text.delete(1.0, END)
                self.write_log_to_text("[ERROR]:%s" % e)

    # 结果展示
    def write_res_to_text(self, res):
        # 输出到界面
        self.result_data_Text.delete(1.0, END)
        self.result_data_Text.insert(1.0, res)
        self.write_log_to_text("[INFO]:转换成功!")

    # 日志动态打印
    def write_log_to_text(self, logmsg):
        current_time = time.strftime('[%Y-%m-%d %H:%M:%S]',
                                     time.localtime(time.time()))
        logmsg_in = str(current_time) + logmsg + "\n"  # 换行
        self.log_data_Text.configure(state='normal')
        self.log_data_Text.insert(END, logmsg_in)
        self.log_data_Text.see(END)
        self.log_data_Text.configure(state='disabled')
コード例 #31
0
ファイル: im.py プロジェクト: mordervomubel/im
class ChatWindow(Toplevel):
	chats = {}

	@staticmethod
	def get(peer):
		try:
			return ChatWindow.chats[peer]
		except KeyError:
			ChatWindow.chats[peer] = ChatWindow(peer)
			return ChatWindow.chats[peer]
		
	def __init__(self, peer):
		Toplevel.__init__(self, mainwindow)
		self.peer = peer
		self.recvFile = None

		self.title(peer[0] + ':' + str(peer[1]))

		#self.root = Tk()
		#self.main = Frame(self.root)
		self.main = Frame(self)
		self.main.pack(expand=True, fill=BOTH)

		self.chat_Text = ScrolledText(self.main)
		self.chat_Text.pack(expand=True, fill=BOTH)
		self.chat_Text['height'] = 10
		#print self.keys()
		#print self.chat_Text.keys()

		self.send_Frame = Frame(self.main)
		self.send_Frame.pack(fill=X)

		self.send_Text = Entry(self.send_Frame)
		self.send_Text.pack(side=LEFT, expand=True, fill=X)
		self.send_Text.bind('<Return>', self.send_Action)
		self.send_Button = Button(self.send_Frame, text='Send', command=self.send_Action)
		self.send_Button.pack(side=LEFT)
		self.holePunch_Button = Button(self.send_Frame, text='UDP punch', command=self.holePunch_Action)
		self.holePunch_Button.pack(side=LEFT)
		self.sendFile_Button = Button(self.send_Frame, text='File', command=self.sendFile_Action)
		self.sendFile_Button.pack(side=LEFT)

		self.status_Label = Label(self.main, text='Peer: ' + self.peer[0] + ':' + str(self.peer[1]))
		self.status_Label.pack()

		self.send_Text.focus()

		#self.protocol("WM_DELETE_WINDOW", self._destroy)
	
	def destroy(self):
		#print 'destroy'
		del ChatWindow.chats[self.peer]
		Toplevel.destroy(self)

	def send_Action(self, *args):
		text = self.send_Text.get()
		message = persist['myname'] + ': ' + text
		if (text.strip()):
			self.chat_Text.insert(END, timestamp() + ' ' + message)
			self.chat_Text.see(END)
			self.send_Text.delete(0, len(text))

			sock.sendto(b'TEXT' + message.encode(), self.peer)
			#sock.lastActive = time.time()
		else:
			self.send_Text.delete(0,END)
	
	def holePunch_Action(self, *args):
		#request server to forward our hole punch request to peer
		print('Sending hole punch request')
		sock.sendto(b'PCH?' + socket.inet_aton(self.peer[0]) + self.peer[1].to_bytes(2, 'big'), server)
	
	def sendFile_Action(self, *args):
		filename = '/tmp/test'
		size = os.path.getsize(filename)
		net_size = socket.htonl(size)
		
# 0x12345678
# 78 56 34 12
# 12 34 56 78

		self.sendFile = BLANK()
		self.sendFile.handle = open(filename, 'br')

		data = size.to_bytes(4, 'big') + self.sendFile.handle.read(chunkSize)
		sock.sendto(b'FILE' + data, self.peer)
		section = 0

		while True:
			data = self.sendFile.handle.read(chunkSize)
			if data == b'': break
			section += 1
			sock.sendto(b'FILE' + section.to_bytes(4, 'big') + data, self.peer)



	def receive(self, message):
		msgType = message[:4]
		msg = message[4:]
		if msgType == b'TEXT':
			self.chat_Text.insert(END, timestamp() + ' ' + str(msg, encoding='utf-8') + '\n')
			self.chat_Text.see(END)
			self.bell()

			#ip = self.peer[0].split('.')
			#ip = bytes((int(ip[0]), int(ip[1]), int(ip[2]), int(ip[3])))
			ip = self.peer[0]
			ip = socket.inet_aton(ip)

			port = self.peer[1]
			port = bytes((port // 0x100, port & 0xFF))

			sock.sendto(b'CFRM' + ip + port, self.peer)
			#sock.lastActive = time.time()

		elif msgType == b'CFRM':
			#ip = '{}.{}.{}.{}'.format(msg[0], msg[1], msg[2], msg[3])
			ip = socket.inet_ntoa(msg[0:4])
			port = msg[4] * 0x100 + msg[5]
			self.chat_Text.insert(END, ' [R]\n')
		
		elif msgType == b'PCHA':
			print('Received hole punch from:', self.peer)
			self.chat_Text.insert(END, timestamp() + ' ' + '[UDP hole punch success]\n')
			self.chat_Text.see(END)

		elif msgType == b'FILE':
			if self.recvFile == None:
				self.recvFile = BLANK()
				self.recvFile.size = int.from_bytes(msg[:4], 'big')
				self.recvFile.part = 0

				self.recvFile.handle = open('/tmp/test2', 'wb')
				self.recvFile.handle.write(msg[4:])
			else:
				self.recvFile.part = int.from_bytes(msg[:4], 'big')
				self.recvFile.handle.seek(self.recvFile.part * chunkSize)
				self.recvFile.handle.write(msg[4:])

			sock.sendto(b'FCNF' + self.recvFile.part.to_bytes(4, 'big'), self.peer)

			if self.recvFile.handle.tell() == self.recvFile.size:
				self.recvFile.handle.close()
				self.recvFile = None
コード例 #32
0
class chat:
    # HOST = '172.28.32.140'
    HOST = '172.93.34.44'
    PORT = 9999
    ADDR = (HOST, PORT)
    tmp = 0

    def __init__(self):
        self.s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

        # -----------------------------------------------------------------------------
        self.root = Tk()

        #主聊天人窗口
        self.master = StringVar()
        self.MasterEntry = Entry(self.root,
                                 textvariable=self.master,
                                 width=8,
                                 font=('Verdana', 15),
                                 bg='turquoise',
                                 highlightcolor='red')
        self.master.set("bbb")

        # to
        self.labelto = Label(self.root,
                             text=' to ',
                             width=8,
                             font=('Arial', 12))

        # 客户聊天人窗口
        self.client = StringVar()
        self.ClientEntry = Entry(self.root,
                                 textvariable=self.client,
                                 width=8,
                                 font=('Verdana', 15),
                                 bg='yellowgreen')
        self.client.set("aaa")

        # 聊天窗口
        self.t_show = ScrolledText(self.root,
                                   width=40,
                                   height=30,
                                   font=('Verdana', 12),
                                   background='#ffffff',
                                   state=DISABLED)
        self.t_show.tag_config('m', foreground='turquoise')
        self.t_show.tag_config('c', foreground='yellowgreen')
        #self.t_show.insert('1.0', '')

        # 聊天输入窗口
        self.chat = StringVar()
        self.ChatEntry = Entry(self.root,
                               textvariable=self.chat,
                               width=25,
                               font=('Verdana', 15),
                               foreground='gray')
        self.chat.set("Enter message")
        self.ChatEntry.bind('<Key-Return>', self.enter_send)  # bind enter键按下事件
        self.ChatEntry.bind('<FocusIn>', self.chat_cursor_enter)  # bind 光标进入事件
        self.ChatEntry.bind('<FocusOut>',
                            self.chat_cursor_leave)  # bind 光标离开事件

        #发送和退出按钮
        self.SendButton = Button(self.root,
                                 text="发送",
                                 width=16,
                                 command=self.send)
        self.ExitButton = Button(self.root,
                                 text="退出",
                                 width=8,
                                 command=self.exit,
                                 padx=5)

        #图片显示
        self.photo = PhotoImage(file='./gif/xiaoqie.gif')
        self.labelimage = Label(image=self.photo)
        self.labelimage.image = self.photo

        self.labelimage.grid(row=1,
                             column=3,
                             columnspan=2,
                             rowspan=1,
                             sticky=W + E + N + S)
        self.MasterEntry.grid(row=0, column=0)
        self.labelto.grid(row=0, column=1)
        self.ClientEntry.grid(row=0, column=2)
        self.t_show.grid(row=1,
                         column=0,
                         columnspan=3,
                         rowspan=1,
                         sticky=W + E + N + S,
                         padx=10,
                         pady=10)
        self.ChatEntry.grid(row=2, column=0, columnspan=2, padx=10, pady=10)
        self.SendButton.grid(row=2, column=2)
        self.ExitButton.grid(row=2, column=3, columnspan=2)

        # self.s.sendto('hello'.encode('utf-8'), ('172.28.32.140', 9999))
        self.s.sendto('hello'.encode('utf-8'), self.ADDR)
        print('thread %s is running...' % threading.current_thread().name)
        self.t = threading.Thread(target=self.recv_loop, name='LoopThread')
        self.t.setDaemon(True)  # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题
        self.t.start()

        self.t = threading.Thread(target=self.flash, name='ImageThread')
        self.t.setDaemon(True)  # 设置为守护线程,守护进程有个好处就是主进程结束,自动结束,解决之前窗口强制退出报错问题
        self.t.start()
        # self.root.mainloop()

    def flash(self):
        # PhotoImage(file='F:/wuyongxiang/laoying/images/' + str(tmp) + '.gif')
        #files = os.listdir('F:/wuyongxiang/study/python/untitled1/gif/xiaoqie/')
        files = os.listdir('./gif/xiaoqie/')
        print(files)
        files.sort(key=lambda x: int(x[:-4]))  # 使用sort 的key 的lambda  按大小进行排序
        print(files)
        photos = [PhotoImage(file='./gif/xiaoqie/' + filet) for filet in files]
        # print('F:/wuyongxiang/laoying/images/'+file)
        print('photos is : %d' % len(photos))
        #time.sleep(1)
        while True:
            self.tmp = self.tmp + 1
            for photo in photos:
                print('%s ' % photo)

                self.labelimage.configure(
                    image=photo)  #这样就可以不在使用grid重新排版添加控件,如此节省资源
                self.labelimage.image = photo
                #self.labelimage.grid(row=0, column=0, rowspan=2, columnspan=2)   #不在需要重新布局,这样太占资源
                #self.labelimage1.grid(row=1, column=3, columnspan=2, rowspan=1, sticky=W + E + N + S)
                a = random.uniform(0.1, 0.4)  #随机产生浮点数 0.1-0.4之间
                #print('aaaaaaaaaaaaaaaaaaaaa %f'%a)
                time.sleep(a)
                del photo
            if self.tmp > 2:
                del photos
                files = os.listdir('./gif/xiaoqie/')
                # print(files)
                files.sort(
                    key=lambda x: int(x[:-4]))  # 使用sort 的key 的lambda  按大小进行排序
                # print(files)
                # photos=[0]
                photos = [
                    PhotoImage(file='./gif/xiaoqie/' + filet)
                    for filet in files
                ]
                # print('F:/wuyongxiang/laoying/images/'+file)
                # print('photos is : %d' % len(photos))

                print('--------------------------')
                self.tmp = 0
                with Image.open('./gif/xiaoqie.gif') as im:
                    if im.is_animated:
                        frames = [f.copy() for f in ImageSequence.Iterator(im)]
                        # frames.reverse() # 内置列表倒序方法
                        # frames.reverse()
                        random.shuffle(frames)
                        frames[0].save('./gif/xiaoqie.gif',
                                       save_all=True,
                                       append_images=frames[1:])

                im = Image.open("./gif/xiaoqie.gif")
                im.save("./gif/xiaoqie/0.gif")
                while True:
                    try:
                        seq = im.tell()
                        im.seek(seq + 1)
                        im.save("./gif/xiaoqie/%s.gif" % (seq), quality=100)
                    except EOFError:
                        break

    def chat_cursor_enter(self, event):
        if self.chat.get() == 'Enter message' or self.chat.get() == '':
            self.chat.set("")
        self.ChatEntry['foreground'] = 'black'  # 重新设置Entry字体颜色

    def chat_cursor_leave(self, event):
        self.ChatEntry['foreground'] = 'gray'  # 重新设置Entry字体颜色
        if self.chat.get() == 'Enter message' or self.chat.get(
        ) == '':  # 如果输入框里面有输入内容则不使用默认语句覆盖
            self.chat.set("Enter message")

    # def send(self):
    #     print('test!')
    def enter_send(self, event):
        print('按下Enter: ' + event.char)
        self.send()

    def send(self):
        # 发送数据:
        # s.sendto(data, ('172.93.34.44', 9999))
        if self.master.get() == '':
            self.t_show.config(state=NORMAL)  #让消息显示框可以正常输入
            self.t_show.insert(END, '请输入您的姓名!\n', 'm')
            self.t_show.config(state=DISABLED)  #让消息显示框禁止输入
            return

        if self.client.get() == '':
            self.t_show.config(state=NORMAL)  # 让消息显示框可以正常输入
            self.t_show.insert(END, '请输入对方姓名!\n', 'm')
            self.t_show.config(state=DISABLED)  # 让消息显示框禁止输入
            return
        # self.DefaultMaster=self.master.get()
        # self.DefaultClient=self.master.get()

        tmpdata = b'<' + self.master.get().encode(
            'utf-8') + b' to ' + self.client.get().encode(
                'utf-8') + b'>data=' + self.chat.get().encode('utf-8')
        print('send data is: %s' % tmpdata)
        self.s.sendto(tmpdata, self.ADDR)
        # s.sendto(sendvar.get().encode('utf-8'), ('172.93.34.44', 9999))
        # self.t_show.insert(END, '  ' + self.chat.get() + ':' + self.master.get() + '\n','m')
        self.t_show.config(state=NORMAL)  # 让消息显示框可以正常输入
        self.t_show.insert(END, self.chat.get() + '\n\n', 'm')
        self.t_show.config(state=DISABLED)  # 让消息显示框禁止输入
        self.t_show.see(END)  # 让滚动条一直处于最下端
        self.chat.set('')

    def exit(self):
        tpdata = b'<' + self.master.get().encode(
            'utf-8') + b' to ' + self.client.get().encode(
                'utf-8') + b'><!quit>'
        print('exit send :%s' % tpdata)
        self.s.sendto(tpdata, self.ADDR)
        # self.s.sendto(b'<'+self.master.get().encode('utf-8')+b' to '+self.client.get().encode('utf-8')+b'><!quit>data=',self.ADDR)
        # self.s.sendto( '<!quit>data='.encode('utf-8'),self.ADDR)

        # self.ExitButton['text'] = '成功'
        #time.sleep(1)  # 一定要延时,否则没等消息过来终止线程,窗口退出会异常
        self.root.destroy()

    def recv_loop(self):
        print('thread %s is running...' % threading.current_thread().name)
        self.s.settimeout(2)
        while True:
            # time.sleep(3)
            # 接收数据:
            # self.rec = self.s.recv(1024).decode('utf-8')
            try:
                self.rec = self.s.recv(1024)
                # break
            except socket.timeout:
                print('-------超时,重新接收--------')
                continue
            print('接收的数据是:%s' % self.rec.decode('utf-8'))
            # patternclient =   # 匹配查找client 名字8
            if re.search(re.compile(b"<!quit>"), self.rec) != None:
                break
            if re.search(re.compile(b"(?<=<).+?(?= to)"), self.rec) != None:
                clientname = re.search(re.compile(b"(?<=<).+?(?= to)"),
                                       self.rec).group(0).decode('utf-8')
                if re.search(re.compile(b"(?<=data=).+"), self.rec) != None:
                    # 带有谁发送提示
                    # self.t_show.insert(END,clientname+':'+re.search(re.compile(b"(?<=data=).+"),self.rec).group(0).decode('utf-8')+'\n','a')
                    self.t_show.config(state=NORMAL)  # 让消息显示框可以正常输入
                    self.t_show.insert(
                        END,
                        re.search(re.compile(b"(?<=data=).+"),
                                  self.rec).group(0).decode('utf-8') + '\n\n',
                        'c')
                    self.t_show.config(state=DISABLED)  # 让消息显示框禁止输入
                    self.t_show.see(END)  # 让滚动条一直处于最下端
                    if self.master.get() != clientname:  # 防止自己跟自己聊天
                        self.client.set(clientname)
コード例 #33
0
class ExtractFrame(Frame):
    def __init__(self, parent):
        super().__init__(parent)

        self.extract_thread = None

        left_frame = Frame(self)
        left_frame.columnconfigure(0, weight=1)

        right_pane = Frame(self)

        output_frame = Frame(right_pane, style='Progress.TFrame')
        output_frame.columnconfigure(0, weight=1)
        output_frame.rowconfigure(1, weight=1)
        self.output_label = Label(output_frame, text='Card Output', anchor=W)
        self.output_label.grid(row=0, sticky=W)

        self.output_text = ScrolledText(output_frame,
                                        bg='#F0F0F0',
                                        height=10,
                                        borderwidth=2,
                                        relief=GROOVE)
        self.output_text.config(state=DISABLED)
        self.output_text.grid(row=1, sticky=N + E + W + S)
        # right_pane.add(output_frame)

        progress_frame = Frame(right_pane, style='Progress.TFrame')
        progress_frame.columnconfigure(0, weight=1)
        progress_frame.rowconfigure(1, weight=1)

        self.progress_label = Label(progress_frame, text='Progress', anchor=W)
        self.progress_label.grid(row=0, sticky=W)

        self.progress_text = ScrolledText(progress_frame,
                                          bg='#F0F0F0',
                                          height=10,
                                          borderwidth=2,
                                          relief=GROOVE)
        self.progress_text.config(state=DISABLED)
        self.progress_text.grid(row=1, sticky=N + E + W + S)

        # right_pane.add(progress_frame)
        output_frame.pack(expand=1, fill="both")
        progress_frame.pack(expand=1, fill="both")

        # get settings
        self._settings = self.winfo_toplevel().get_settings()
        self._queue = queue.Queue()
        self._kill_queue = queue.Queue()
        self.checkbox_widgets = []
        self.all_checked = BooleanVar()
        left_frame_checkboxes = Frame(left_frame,
                                      borderwidth=2,
                                      relief='groove')
        self.checkbox_widgets.append(
            Checkbutton(left_frame_checkboxes,
                        text='Gift Card Sources',
                        variable=self.all_checked,
                        command=lambda v=self.all_checked: self.check_all(v)))
        self.checkbox_widgets[-1].grid(row=0,
                                       columnspan=3,
                                       sticky=N + W + E + S)

        Separator(left_frame_checkboxes, orient=HORIZONTAL).grid(row=1,
                                                                 columnspan=3,
                                                                 sticky=EW)

        active_sources = self._settings['Settings']['selected_source'].split(
            ',')
        self.checkboxes = [
            BooleanVar(name=extractors_list[count].name())
            for count in range(len(extractors_list))
        ]
        for i, c in enumerate(self.checkboxes):
            c.set(extractors_list[i].name() in active_sources)

        choices = [e.name() for e in extractors_list]
        self.only_links = []
        for i, e in enumerate(extractors_list):
            self.checkbox_widgets.append(
                Checkbutton(left_frame_checkboxes,
                            text=e.name(),
                            variable=self.checkboxes[i],
                            command=lambda: self.save_sources()))
            self.checkbox_widgets[-1].grid(row=i + 2, sticky=N + W)
            self.only_links.append(
                Label(left_frame_checkboxes,
                      text='Only',
                      style='Link.TLabel',
                      cursor='hand2'))
            self.only_links[-1].bind(
                '<Button-1>',
                lambda f, i=i: self.check_only(i, self.all_checked))
            self.only_links[-1].grid(row=i + 2, column=2)

        Separator(left_frame_checkboxes,
                  orient=HORIZONTAL).grid(row=len(extractors_list) + 2,
                                          columnspan=3,
                                          sticky=EW)
        self.take_screenshots = BooleanVar()
        self.take_screenshots.set(self._settings['Settings']['screenshots'])
        self.checkbox_widgets.append(
            Checkbutton(left_frame_checkboxes,
                        text='Screenshots',
                        variable=self.take_screenshots,
                        command=lambda v=self.take_screenshots: self.
                        toggle_screenshots(v)))
        self.checkbox_widgets[-1].grid(columnspan=3, sticky=NSEW)

        left_frame_checkboxes.grid(row=0)
        self.extract_button = Button(left_frame,
                                     text='Extract',
                                     style='Extract.TButton',
                                     command=self.extract)
        self.extract_button.grid(row=1, sticky=N + E + W + S, pady=1)
        self.cancel_button = Button(left_frame,
                                    text='Cancel',
                                    command=self.cancel)
        self.cancel_button.grid(row=2, sticky=N + E + W + S)
        self.cancel_button.configure(state=DISABLED)

        left_frame.pack(side=LEFT, anchor=N + W, padx=5, pady=5)
        right_pane.pack(side=LEFT, expand=1, fill="both")
        self.do_update()

    def toggle_screenshots(self, value):
        self._settings['Settings']['screenshots'] = str(value.get())
        self.winfo_toplevel().save_settings()

    def save_sources(self):
        self._settings['Settings']['selected_source'] = ','.join([
            extractors_list[i].name() for i, c in enumerate(self.checkboxes)
            if c.get()
        ])
        self.winfo_toplevel().save_settings()

    def check_only(self, only, all_checked):
        for i, c in enumerate(self.checkboxes):
            c.set(i == only)
        all_checked.set(False)
        self.save_sources()

    def check_all(self, value):
        val = value.get()
        for c in self.checkboxes:
            c.set(val)
        self.save_sources()

    def do_update(self):
        try:
            while True:
                line = self._queue.get_nowait()
                if line.startswith('CARDOUTPUT'):
                    line = line[10:]
                    self.output_text.configure(state=NORMAL)
                    self.output_text.delete(1.0, END)
                    self.output_text.insert(INSERT, line)
                    self.output_text.configure(state=DISABLED)
                elif line.startswith('EXTRACTIONFINISHED'):
                    self.restore_gui()
                else:
                    self.progress_text.config(state='normal')
                    self.progress_text.insert('end-1c', line + '\n')
                    self.progress_text.config(state='disabled')
                    self.progress_text.see(END)
        except queue.Empty:
            pass
        self.after(100, self.do_update)

    def save_screenshot(self, browser, card_number):
        screenshots_dir = os.path.join(os.getcwd(), 'screenshots')
        if not os.path.exists(screenshots_dir):
            os.makedirs(screenshots_dir)

        browser.save_screenshot(
            os.path.join(screenshots_dir, card_number + '.png'))

    def update_progress(self, text):
        # check kill queue to see if we should stop
        try:
            line = self._kill_queue.get_nowait()
            if self.browser:
                self.browser.close()
            self._queue.put_nowait('Extraction canceled.')
            self.extraction_cleanup()
        except queue.Empty:
            pass
        self._queue.put_nowait(text)

    def cancel(self):
        self.update_progress('Cancelling...')
        if self.extract_thread:
            self._kill_queue.put_nowait('DIE')

    def restore_gui(self):
        for c in self.checkbox_widgets:
            c.configure(state=NORMAL)

        for l in self.only_links:
            l.configure(state=NORMAL)

        self.extract_button.configure(state=NORMAL)
        self.cancel_button.configure(state=DISABLED)

    def extract(self):
        # disable GUI
        for c in self.checkbox_widgets:
            c.configure(state=DISABLED)

        for l in self.only_links:
            l.configure(state=DISABLED)

        self.extract_button.configure(state=DISABLED)
        self.cancel_button.configure(state=NORMAL)

        self.extract_thread = threading.Thread(target=self.extract_real)
        self.extract_thread.start()

    def output_cards(self, cards):
        csv_output = 'CARDOUTPUT'
        for store in cards:
            # sort by time received
            cards[store] = sorted(cards[store],
                                  key=lambda k: k['datetime_received'])
            csv_output += store + "\r\n"
            for c in cards[store]:
                csv_output += "{},{},{}\r\n".format(c['card_amount'],
                                                    c['card_code'],
                                                    c['card_pin'])
            csv_output += "\r\n"

        self.update_progress(csv_output)

    def extract_real(self):
        config = self._settings
        extractor = None
        self.update_progress("Initializing...")
        cards = {}
        urls = []

        e = [
            extractors_list[i] for i, c in enumerate(self.checkboxes)
            if c.get()
        ]
        if len(e) == 0:
            self.update_progress('No sources selected!')
            self.extraction_cleanup()

        emails = [i for e_list in [x.email() for x in e] for i in e_list]
        days = int(config.get('Settings', 'days'))
        browser = None
        self.browser = None
        for section in (e for e in self._settings.sections()
                        if e.startswith('Email')):
            #        for section in ['Email1', 'Email2', 'Email3', 'Email4']:
            if int(config.get(section, 'imap_active')) == 1:
                imap_ssl = int(config.get(section, 'imap_ssl')) == 1
                imap_host = config.get(section, 'imap_host')
                imap_port = int(config.get(section, 'imap_port'))
                imap_username = config.get(section, 'imap_username')
                imap_password = config.get(section, 'imap_password')
                phonenum = config.get(section, 'phonenum')

                self.update_progress(
                    "Connecting to {}...".format(imap_username))

                # Connect to the server
                if imap_ssl:
                    mailbox = IMAP4_SSL(host=imap_host, port=imap_port)
                else:
                    mailbox = IMAP4(host=imap_host, port=imap_port)

                # Log in and select the configured folder
                mailbox.login(imap_username, imap_password)
                mailbox.select("INBOX")
                since = (date.today() -
                         timedelta(days - 1)).strftime("%d-%b-%Y")
                from_list = '(OR ' * (len(emails) - 1) + '(FROM "'+emails[0]+'") ' +\
                            ''.join(['(FROM "'+em+'")) ' for em in emails[1:]])[0:-1]
                # subject = ' HEADER Subject "'+extractor.subject()+'" ' if extractor.subject() is not "" else " "
                space = ' ' if len(emails) > 1 else ''
                search = '({}{}SINCE "{}")'.format(from_list, space, since)
                # status, messages = mailbox.search(None, '(OR (OR (FROM "*****@*****.**") (FROM "*****@*****.**")) (FROM "*****@*****.**"))')
                # search = '(FROM "*****@*****.**") SINCE "23-Nov-2018"'
                status, messages = mailbox.search(None, search)

                if status == "OK":
                    # Convert the result list to an array of message IDs
                    messages = [m.decode('ascii') for m in messages[0].split()]
                    if len(messages) == 0:
                        continue
                    self.update_progress(
                        "Fetching messages from {}...".format(imap_username))
                    data = []
                    try:
                        status, data = mailbox.fetch(','.join(messages),
                                                     '(RFC822)')
                        # remove every other element of list, extract messages
                        data = [
                            email.message_from_bytes(i[1])
                            for index, i in enumerate(data)
                            if (index + 1) % 2 != 0
                        ]
                    except IMAP4.error:
                        # Can't fetch all messages at once, do them one at a time
                        for msg_id in messages:
                            self.update_progress(
                                "{}: Fetching message id {}...".format(
                                    imap_username, msg_id))
                            # Fetch it from the server
                            status, m = mailbox.fetch(msg_id, '(RFC822)')
                            if status == "OK":
                                data.append(email.message_from_bytes(m[0][1]))

                    if status == "OK":
                        for idx, msg in enumerate(data):
                            # Get To: and From: addresses
                            to_address = email.utils.parseaddr(
                                msg.get("To", imap_username))[1]
                            from_address = email.utils.parseaddr(
                                msg.get("From"))[1]
                            # Get extractor
                            extractor = [
                                ext for ext in extractors_list
                                if from_address in ext.email()
                            ][0]
                            # Get the HTML body payload
                            msg_html = extractor.fetch_payload(msg)
                            if msg_html is None:
                                continue
                            # Save the email timestamp
                            datetime_received = datetime.fromtimestamp(
                                email.utils.mktime_tz(
                                    email.utils.parsedate_tz(msg.get('date'))))
                            # Parse the message
                            msg_parsed = BeautifulSoup(msg_html, 'html.parser')
                            # Find the "View My Code" link
                            url = extractor.fetch_url(msg_parsed, browser,
                                                      imap_username)

                            if url is not None:
                                if isinstance(url, list):
                                    for u in url:
                                        urls.append([
                                            messages[idx], extractor,
                                            datetime_received, u,
                                            imap_username, to_address, phonenum
                                        ])
                                else:
                                    urls.append([
                                        messages[idx], extractor,
                                        datetime_received, url, imap_username,
                                        to_address, phonenum
                                    ])
        if len(urls) < 1:
            self.update_progress('No cards to extract!')
            self.extraction_cleanup()

        if browser is None:
            self.update_progress("Launching ChromeDriver...")
            chrome_options = webdriver.ChromeOptions()
            if config.get('Settings', 'hide_chrome_window'):
                chrome_options.add_argument("--window-position=-10000,0")
            try:
                profile = config.get('Settings', 'profile')
                chrome_options.add_argument(
                    '--user-data-dir={}'.format(profile))
            except NoOptionError:
                pass

            browser = webdriver.Chrome(config.get('Settings',
                                                  'chromedriver_path'),
                                       chrome_options=chrome_options)
            self.browser = browser  # TODO make it all self.browser

        for msg_id, extractor, datetime_received, url, imap_username, to_address, phonenum in urls:
            self.update_progress(
                "{}: Getting gift card from message id: {}".format(
                    imap_username, msg_id))
            while True:
                # keep retrying to load the page if it's timing out.
                # TODO add cancel option
                while True:
                    try:
                        browser.get(url)
                    except TimeoutException:
                        self.update_progress(
                            'Page load timed out. Retrying...')
                        continue
                    # if page load times out, retry...
                    if 'ERR_TIMED_OUT' in browser.page_source or 'com.bhn.general.service.error' in browser.page_source:
                        self.update_progress(
                            'Page load timed out. Retrying...')
                        time.sleep(1)
                        continue
                    break

                # challenege for various cards
                extractor.complete_challenge(browser, to_address, phonenum)
                card = extractor.fetch_codes(browser)

                if card is None:
                    break

                if card['card_store'] not in cards:
                    cards[card['card_store']] = []

                if card['card_code'] != '':
                    break

            if card is not None:
                card['datetime_received'] = str(datetime_received)
                card['url'] = url
                cards[card['card_store']].append(card)
                if config.get('Settings', 'screenshots'):
                    self.save_screenshot(browser, card['card_code'])
                # if self.ids.prints.active:
                #     browser.execute_script('window.print()')
                extractor.delay()

                # update output window for each new card
                self.output_cards(cards)

        browser.close()
        self.extraction_cleanup()

    def extraction_cleanup(self):
        self._queue.put_nowait('EXTRACTIONFINISHED')
        exit()
コード例 #34
0
ファイル: recipe-578076.py プロジェクト: jacob-carrier/code
class MarkovDemo(Frame):

    "MarkovDemo(master=None, **kw) -> MarkovDemo instance"

    TEXT = dict(height=2, width=46, wrap=WORD)  # Text Options
    GRID = dict(padx=5, pady=5)                 # Grid Options

    # Initialize a MarkovDemo instance with a GUI for interaction.

    def __init__(self, master=None, **kw):
        "Initialize the MarkovDemo instance's widgets and settings."
        super().__init__(master, **kw)
        self.build_widgets()
        self.place_widgets()
        self.setup_widgets()
        self.grid_rowconfigure(2, weight=1)
        self.grid_rowconfigure(3, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.key = self.primer = None

    def build_widgets(self):
        "Build the various widgets that will be used in the program."
        # Create processing frame widgets.
        self.processing_frame = LabelFrame(self, text='Processing Mode:')
        self.mode_var = StringVar(self, 'encode')
        self.decode_button = Radiobutton(self.processing_frame,
                                         text='Decode Cipher-Text',
                                         command=self.handle_radiobuttons,
                                         value='decode',
                                         variable=self.mode_var)
        self.encode_button = Radiobutton(self.processing_frame,
                                         text='Encode Plain-Text',
                                         command=self.handle_radiobuttons,
                                         value='encode',
                                         variable=self.mode_var)
        self.freeze_var = BooleanVar(self, False)
        self.freeze_button = Checkbutton(self.processing_frame,
                                         text='Freeze Key & Primer',
                                         command=self.handle_checkbutton,
                                         offvalue=False,
                                         onvalue=True,
                                         variable=self.freeze_var)
        # Create encoding frame widgets.
        self.encoding_frame = LabelFrame(self, text='Encoding Options:')
        self.chain_size_label = Label(self.encoding_frame, text='Chain Size:')
        self.chain_size_entry = Entry(self.encoding_frame)
        self.plain_text_label = Label(self.encoding_frame, text='Plain-Text:')
        self.plain_text_entry = Entry(self.encoding_frame)
        # Create input frame widgets.
        self.input_frame = LabelFrame(self, text='Input Area:')
        self.input_text = ScrolledText(self.input_frame, **self.TEXT)
        # Create output frame widgets.
        self.output_frame = LabelFrame(self, text='Output Area:')
        self.output_text = ScrolledText(self.output_frame, **self.TEXT)

    def place_widgets(self):
        "Place the widgets where they belong in the MarkovDemo frame."
        # Locate processing frame widgets.
        self.processing_frame.grid(sticky=EW, **self.GRID)
        self.decode_button.grid(row=0, column=0, **self.GRID)
        self.encode_button.grid(row=0, column=1, **self.GRID)
        self.freeze_button.grid(row=0, column=2, **self.GRID)
        # Locate encoding frame widgets.
        self.encoding_frame.grid(sticky=EW, **self.GRID)
        self.chain_size_label.grid(row=0, column=0, sticky=W, **self.GRID)
        self.chain_size_entry.grid(row=0, column=1, sticky=EW, **self.GRID)
        self.plain_text_label.grid(row=1, column=0, sticky=W, **self.GRID)
        self.plain_text_entry.grid(row=1, column=1, sticky=EW, **self.GRID)
        self.encoding_frame.grid_columnconfigure(1, weight=1)
        # Locate input frame widgets.
        self.input_frame.grid(sticky=NSEW, **self.GRID)
        self.input_text.grid(sticky=NSEW, **self.GRID)
        self.input_frame.grid_rowconfigure(0, weight=1)
        self.input_frame.grid_columnconfigure(0, weight=1)
        # Locate output frame widgets.
        self.output_frame.grid(sticky=NSEW, **self.GRID)
        self.output_text.grid(sticky=NSEW, **self.GRID)
        self.output_frame.grid_rowconfigure(0, weight=1)
        self.output_frame.grid_columnconfigure(0, weight=1)

    def setup_widgets(self):
        "Setup each widget's configuration for the events they handle."
        self.input_text.bind('<Key>', self.handle_key_events)
        self.input_text.bind('<Control-Key-a>', self.handle_control_a)
        self.input_text.bind('<Control-Key-/>', lambda event: 'break')
        self.output_text['state'] = DISABLED
        self.output_text.bind('<Control-Key-a>', self.handle_control_a)
        self.output_text.bind('<Control-Key-/>', lambda event: 'break')

    ########################################################################

    # Take care of any special event needing dedicated processing.

    def handle_radiobuttons(self):
        "Change the interface based on the encoding / decoding setting."
        if self.encrypting:
            self.freeze_button.grid()
            if not self.freeze_var.get():
                self.encoding_frame.grid()
        else:
            self.freeze_button.grid_remove()
            if not self.freeze_var.get():
                self.encoding_frame.grid_remove()
        self.handle_key_events(None)

    def handle_checkbutton(self):
        "Change the interface based on the key / primer freeze setting."
        if self.freeze_var.get():
            self.encoding_frame.grid_remove()
        else:
            self.encoding_frame.grid()

    def handle_key_events(self, event):
        "Schedule refreshing the output area after an input area event."
        if event is None or event.char and event.state | 0o11 == 0o11:
            self.after_idle(self.refresh)

    @staticmethod
    def handle_control_a(event):
        "Select all text in the widget associated with the given event."
        event.widget.tag_add(SEL, 1.0, END + '-1c')
        return 'break'

    ########################################################################

    # Handle interface's updates when either encoding or decoding.

    def refresh(self):
        "Refresh the output based on the value of the input."
        text = self.input_text.get(1.0, END + '-1c')
        if not text:
            self.output = text
        elif self.encrypting:
            self.encode(text)
        else:
            self.decode(text)

    def output(self, value):
        "Set the text in the output area to the string value."
        self.output_text['state'] = NORMAL
        self.output_text.delete(1.0, END)
        self.output_text.insert(END, value)
        if self.encrypting and self.freeze_var.get():
            self.output_text.see(END)
        self.output_text['state'] = DISABLED

    output = property(fset=output, doc='Output area property.')

    @property
    def chain_size(self):
        "Chain size for the Markov chains used when encrypting."
        try:
            value = ast.literal_eval(self.chain_size_entry.get())
            assert isinstance(value, int) and 2 <= value <= 256
            return value
        except:
            self.chain_size_entry.delete(0, END)
            self.chain_size_entry.insert(0, '2')
            return 2

    @property
    def plain_text(self):
        "Plain text or ignored characters in encryption process."
        try:
            value = self.repr_to_obj(self.plain_text_entry.get(), '')
            assert isinstance(value, str)
            return value
        except:
            self.plain_text_entry.delete(0, END)
            return ''

    ########################################################################

    # Encrypt a string for display in the interface's output area.

    def encode(self, string):
        "Encode the string and show the cipher-text in the output."
        try:
            cipher = self.build_cipher(string)
        except ValueError:
            self.output = ''
        except:
            self.output = traceback.format_exc()
        else:
            self.output = self.build_header() + '\n\n' + cipher

    def build_cipher(self, string):
        "Build cipher-text based on plain-text and return answer."
        if self.key and self.freeze_var.get():
            cipher, primer = me.encrypt_str(string, self.key, self.primer)
        else:
            args = string, self.chain_size, self.plain_text
            cipher, self.key, self.primer = me.auto_encrypt_str(*args)
        return cipher

    def build_header(self):
        "Build header from key and primer values in current use."
        header = '\n'.join(map(self.bytes_to_repr, self.key.data))
        header += '\n' + self.bytes_to_repr(self.primer.data)
        return header

    ########################################################################

    # Decrypt a string for display in the interface's output area.

    def decode(self, string):
        "Decode encrypted message and display plain-text in output."
        try:
            cipher = self.extract_keys(string)
            text = self.extract_text(cipher)
        except ValueError:
            self.output = ''
        except:
            self.output = traceback.format_exc()
        else:
            self.output = text

    def extract_keys(self, string):
        "Extract keys to decryption and return the cipher-text area."
        header, cipher = string.split('\n\n', 1)
        *key, primer = map(self.repr_to_obj, header.split('\n'))
        self.key, self.primer = me.Key(tuple(key)), me.Primer(primer)
        return cipher

    def extract_text(self, string):
        "Extract text message from string using built key and primer."
        text, primer = me.decrypt_str(string, self.key, self.primer)
        return text

    ########################################################################

    # Provide some special methods to simplify the program's code.

    @property
    def encrypting(self):
        "Encrypting boolean stating current operations mode."
        return {'encode': True, 'decode': False}[self.mode_var.get()]

    @staticmethod
    def bytes_to_repr(obj):
        "Convert bytes object into suitable representation."
        if not isinstance(obj, bytes):
            raise TypeError('Object must be a bytes instance!')
        return repr(obj)[2:-1]

    @staticmethod
    def repr_to_obj(string, prefix='b'):
        "Convert representation into an equivalent object."
        for template in '{}"{}"', "{}'{}'":
            try:
                return ast.literal_eval(template.format(prefix, string))
            except:
                pass
        raise ValueError('Cannot convert {!r} to object!'.format(string))

    @classmethod
    def main(cls):
        "Create context for demo and run a test instance."
        NoDefaultRoot()
        root = Tk()
        root.minsize(420, 330)
        root.title('Markov Demo 2')
        test = cls(root)
        test.grid(sticky=NSEW)
        root.grid_rowconfigure(0, weight=1)
        root.grid_columnconfigure(0, weight=1)
        root.mainloop()
コード例 #35
0
ファイル: gui.py プロジェクト: wearyoung/daovision
class SshPanel(Frame):
	def __init__(self, parent):
		Frame.__init__(self, parent)
		self.scrolltext = ScrolledText(self, width = 120,
				font = ("", 14, "normal"), height = 30)
		self.scrolltext.config(state = "disable")

		f = Frame(self)
		self.entry = Entry(f, width = 75, font = ("", 15, "normal"))
#		self.entry.grab_set()
		self.entry.focus_set()
		self.entry.grid(row = 0, column = 0)
		self.entry.bind("<Return>", lambda event, frame = self: frame._runCommand())

		self.button1 = Button(f, text = "sumbmit", font = ("", 15, "normal"),
						command = lambda frame = self: frame._runCommand())
		self.button1.grid(row = 0, column = 1, padx = 4, pady = 2)
		self.button2 = Button(f, text = "clear", font = ("", 15, "normal"),
						command = lambda frame = self: frame._deleteText())
		self.button2.grid(row = 0, column = 2, padx = 4, pady = 2)
		f.grid(row = 1, column = 0)
		self.scrolltext.grid(row = 0, column = 0)

		with shelve.open("userconfigdb") as db:
			keys = tuple(db.keys())
		if not keys:
			configButtonCmd()
		with shelve.open("userconfigdb") as db:
			self.sshIP = db[tuple(db.keys())[0]].hostaddress
		self._configButtonCmd()

	def _deleteText(self):
		self.scrolltext.config(state = "normal")
		self.scrolltext.delete("1.0", END)
		self.scrolltext.config(state = "disable")
	
	def _fetch(self, root, vars):
		attrs  = []
		for var in vars:
			t = var.get()
			if not t:
				return
			attrs.append(t)
		self.username = attrs[0]
		self.passwd = attrs[1]
		root.destroy()

	def _configButtonCmd(self):
		popwin = PopupWindow("User Config")
		popwin.grab_set()
		popwin.focus()

		form = Frame(popwin)
		left = Frame(form)
		right = Frame(form)
		bottom = Frame(popwin)
		form.pack(fill = X)
		left.pack(side = LEFT)
		right.pack(side = RIGHT, expand = YES, fill = X)
	#	bottom.pack(side = LEFT)

		fields = ("username", "password")
		variables = []
		for field in fields:
			lab = Label(left, width = 10, text = field)
			ent = Entry(right)
			lab.pack(side = TOP)
			ent.pack(side = TOP, fill = X)
			var = StringVar()
			ent.config(textvariable = var)
			variables.append(var)
	
		Button(popwin, text = "Ok", font = ("", 15, "normal"),
			command = (lambda vars = variables, root = popwin: self._fetch(root, vars))).pack()
        

	def _runCommand(self):
		command = self.entry.get()
		self.entry.delete(0, END)
		self.scrolltext.config(state = "normal")

		if command != "":
			ssh = paramiko.SSHClient()
			try:
				ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
#				print(self.username, self.passwd)
				ssh.connect(self.sshIP, 22, self.username, self.passwd, timeout = 10)
				stdin,stdout,stderr = ssh.exec_command(command)
				out = stdout.readlines()
				err = stderr.readlines()
				for r in out:
					self.scrolltext.insert(END, "  " + r)
				for r in err:
					self.scrolltext.insert(END, "  " + r)
			except:
				pass
			finally:
				ssh.close()
		self.scrolltext.insert(END, "---------------------------------\n")
		self.scrolltext.config(state = "disable")
		self.scrolltext.see("end")
コード例 #36
0
class App(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Keyboard Control of Robot Arm")
        self.arm = Arm()
##        self.arm.command_timeout = 50 # if arm still timeout's then uncomment this line and increase value

        f = tk.Frame(self)
        f.pack(side="top", expand=True, fill="x")

        f1 = tk.Frame(f, bd=1, relief="sunken")
        f1.pack(side="left")

        tk.Label(f1, text="Function:")       .grid(column=1, row=1, sticky="w")
        tk.Label(f1, text="Key:")            .grid(column=2, row=1, sticky="w")
        
        tk.Label(f1, text="Base Left:")      .grid(column=1, row=2, sticky="w")
        tk.Label(f1, text="Left")            .grid(column=2, row=2, sticky="w")
        tk.Label(f1, text="Base Right:")     .grid(column=1, row=3, sticky="w")
        tk.Label(f1, text="Right")           .grid(column=2, row=3, sticky="w")
        tk.Label(f1, text="Shoulder Up:")    .grid(column=1, row=4, sticky="w")
        tk.Label(f1, text="Up")              .grid(column=2, row=4, sticky="w")
        tk.Label(f1, text="Shoulder Down:")  .grid(column=1, row=5, sticky="w")
        tk.Label(f1, text="Down")            .grid(column=2, row=5, sticky="w")

        f2 = tk.Frame(f, bd=1, relief="sunken")
        f2.pack(side="left")
        
        tk.Label(f2, text="Function:")       .grid(column=3, row=1, sticky="w")
        tk.Label(f2, text="Key:")            .grid(column=4, row=1, sticky="w")
        
        tk.Label(f2, text="Elbow Up:")       .grid(column=3, row=2, sticky="w")
        tk.Label(f2, text="Home")            .grid(column=4, row=2, sticky="w")
        tk.Label(f2, text="Elbow Down:")     .grid(column=3, row=3, sticky="w")
        tk.Label(f2, text="End")             .grid(column=4, row=3, sticky="w")
        tk.Label(f2, text="Wrist Up:")       .grid(column=3, row=4, sticky="w")
        tk.Label(f2, text="Insert")          .grid(column=4, row=4, sticky="w")
        tk.Label(f2, text="Wrist Down:")     .grid(column=3, row=5, sticky="w")
        tk.Label(f2, text="Delete")          .grid(column=4, row=5, sticky="w")

        f3 = tk.Frame(f, bd=1, relief="sunken")
        f3.pack(side="left", fill="y")
        
        tk.Label(f3, text="Function:")       .grid(column=5, row=1, sticky="w")
        tk.Label(f3, text="Key:")            .grid(column=6, row=1, sticky="w")
        
        tk.Label(f3, text="Grip Open:")      .grid(column=5, row=2, sticky="w")
        tk.Label(f3, text="Page-Up")         .grid(column=6, row=2, sticky="w")
        tk.Label(f3, text="Grip Close:")     .grid(column=5, row=3, sticky="w")
        tk.Label(f3, text="Page-Down")       .grid(column=6, row=3, sticky="w")
        tk.Label(f3, text="Toggle Light:")   .grid(column=5, row=4, sticky="w")
        tk.Label(f3, text="L")               .grid(column=6, row=4, sticky="w")
        
        self.c_window = ScrolledText(self, width=20, height=20)
        self.c_window.pack(side="top", expand=True, fill="both")

        self.count = 1

        self.lit = False

        self.bind("<FocusOut>", self.stop_all)
        self.bind("<Escape>", self.stop_all)
        self.bind("<l>", self.toggle_light)
        self.bind("<KeyPress-Prior>", self.grip_open) # page up key
        self.bind("<KeyRelease-Prior>", self.grip_stop) # page up key
        self.bind("<KeyPress-Next>", self.grip_close) # page down key
        self.bind("<KeyRelease-Next>", self.grip_stop) # page down key
        
        self.bind("<KeyPress-Left>", self.base_left)
        self.bind("<KeyRelease-Left>", self.base_stop)
        self.bind("<KeyPress-Right>", self.base_right)
        self.bind("<KeyRelease-Right>", self.base_stop)

        self.bind("<KeyPress-Up>", self.shoulder_up)
        self.bind("<KeyRelease-Up>", self.shoulder_stop)
        self.bind("<KeyPress-Down>", self.shoulder_down)
        self.bind("<KeyRelease-Down>", self.shoulder_stop)

        self.bind("<KeyPress-Home>", self.elbow_up)
        self.bind("<KeyRelease-Home>", self.elbow_stop)
        self.bind("<KeyPress-End>", self.elbow_down)
        self.bind("<KeyRelease-End>", self.elbow_stop)

        self.bind("<KeyPress-Insert>", self.wrist_up)
        self.bind("<KeyRelease-Insert>", self.wrist_stop)
        self.bind("<KeyPress-Delete>", self.wrist_down)
        self.bind("<KeyRelease-Delete>", self.wrist_stop)

    def message(self, message):
        if (self.count == 1):
            pass
        else:
            self.c_window.insert("end", "\n")
        self.c_window.insert("end", str(self.count) + "\t" + message)
        self.c_window.see("end")
        self.count += 1

    def stop_all(self, event=None):
        self.message("Stop All")
        self.arm.stop_moving()

    def base_left(self, event=None):
        self.message("Base Left")
        self.arm.base_left()

    def base_right(self, event=None):
        self.message("Base Right")
        self.arm.base_right()

    def base_stop(self, event=None):
        self.message("Base Stop")
        time.sleep(0.1)
        self.arm.stop_moving()

    def shoulder_up(self, event=None):
        self.message("Shoulder Up")
        self.arm.shoulder_up()

    def shoulder_down(self, event=None):
        self.message("Shoulder Down")
        self.arm.shoulder_down()

    def shoulder_stop(self, event=None):
        self.message("Shoulder Stop")
        time.sleep(0.1)
        self.arm.stop_moving()

    def elbow_up(self, event=None):
        self.message("Elbow Up")
        self.arm.elbow_up()

    def elbow_down(self, event=None):
        self.message("Elbow Down")
        self.arm.elbow_down()
        
    def elbow_stop(self, event=None):
        self.message("Elbow Stop")
        time.sleep(0.1)
        self.arm.stop_moving()

    def wrist_up(self, event=None):
        self.message("Wrist Up")
        self.arm.wrist_up()

    def wrist_down(self, event=None):
        self.message("Wrist Down")
        self.arm.wrist_down()

    def wrist_stop(self, event=None):
        self.message("Wrist Stop")
        time.sleep(0.1)
        self.arm.stop_moving()

    def grip_open(self, event=None):
        self.message("Grip Open")
        self.arm.grip_open()

    def grip_close(self, event=None):
        self.message("Grip Close")
        self.arm.grip_close()

    def grip_stop(self, event=None):
        self.message("Grip Stop")
        time.sleep(0.1)
        self.arm.stop_moving()

    def toggle_light(self, event=None):
        self.message("Toggle Light")
        if self.lit:
            self.arm.light_off()
            self.lit = False
        else:
            self.arm.light_on()
            self.lit = True
コード例 #37
0
class CipherGUI(Frame):
    """
    Renders a GUI that allows enciphering/deciphering of text using Bruce Schneier's solitaire algorithm.
    """
    
    def __init__(self, parent):
        """
        Initializes the GUI elements.
        """
        Frame.__init__(self, parent)
        self.parent = parent
        self.parent.title("Solitaire Cipher")

        self.helpFile = open("help.dat", "r")
        self.helpText = self.helpFile.read()

        self.aboutFile = open("about.dat", "r")
        self.aboutText = self.aboutFile.read()

        self.toCipher = Text(self.parent, undo = 1)
        self.toCipher.grid(row = 1, column = 1, padx = 10, pady = 10)
        self.toCipher.insert(END, "Type text to encipher...")
        self.toDecipher = Text(self.parent, undo = 1)
        self.toDecipher.grid(row = 2, column = 1, padx = 10, pady = 10)
        self.toDecipher.insert(END, "Type text to decipher...")
       
        lockImage = PhotoImage(file = "lock.gif")
        unlockImage = PhotoImage(file = "unlock.gif")
        self.encipherButton = Button(self.parent, text = "Encipher", command = self._encode, padx = 10, pady = 10, image = lockImage, compound = TOP)
        self.decipherButton = Button(self.parent, text = "Decipher", command = self._decode, padx = 10, pady = 10, image = unlockImage, compound = TOP)
        #Due to weirdness with Tk's handling of image references, need to keep a throwaway reference
        #to maintain iamge icons
        self.encipherButton.image = lockImage
        self.encipherButton.grid(row = 1, column = 2, padx = 10, pady = 10)
        self.decipherButton.image = unlockImage
        self.decipherButton.grid(row = 2, column = 2, padx = 10, pady = 10)

        splashImage = PhotoImage(file = "splash.gif")
        self.splashLabel = Label(self.parent, text = "Solitaire Cipher v1.0", image = splashImage, compound = TOP, font = "Courier")
        self.splashLabel.image = splashImage
        self.splashLabel.grid(row = 2, column = 0, padx = 10)

        self.log = ScrolledText(self.parent, width = 30, height = 22)
        #Can't use console log method yet.
        self.log.insert(END, ">> Ready. View Help for entry rules.")
        self.log.state = DISABLED
        self.log.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = S)
        self.log.config(state = DISABLED)

        self.passphrase = Entry(self.parent, show = "*", width = 30)
        self.passphrase.grid(row = 1, column = 0, padx = 10, pady = 10, sticky = NE)
        self.passphrase.xview_moveto(0)
        self.passphraseLabel = Label(self.parent, text = "Passcode:", padx = 8).grid(row = 1, column = 0, sticky = NW, pady = 10)

        self.menubar = Menu(self.parent)
        self.menubar.add_command(label = "About", command = self._display_about)
        self.menubar.add_command(label = "Help", command = self._display_help)
        self.menubar.add_command(label = "Quit", command = self.quit)
        self.parent.config(menu = self.menubar)

        self.parent.iconbitmap("cards-64.ico")

    def _console_log(self, message):
        """
        Logs events like decode/encode to the console.
        """
        self.log.config(state = NORMAL)
        self.log.insert(END, "\n>> " + message)  
        self.log.config(state = DISABLED)
        self.log.see(END)

    def _encode(self):
        """
        Encodes the contents of toCipher using Cipher class and places in toDecipher.
        """
        passkey = self.passphrase.get()
        #If text is retrived to END, newline is added. Must go 1 character less.
        message = self.toCipher.get(1.0, END+"-1c")
        if self._validate(message, passkey):
            passkey = passkey.upper()
            message = message.replace(" ", "").upper()
            encode = Cipher(message, passkey)
            encodedMessage = encode.encipher()
            self._console_log("Encoding successful. \nSee lower box for result.")
            self.toDecipher.delete(1.0, END)
            self.toDecipher.insert(END, encodedMessage)
        elif passkey == "":
            self._console_log("Error: no passcode entered.")
        elif message == "":
            self._console_log("Error: no message entered.")
        else:
            self._console_log("Encoding unsuccessful. \nInput contains one or more \nillegal characters. See Help \nfor rules.")

    def _decode(self):
        """
        Decodes the contents of toDecipher using Cipher class and places in toCipher.
        """
        passkey = self.passphrase.get()
        #If text is retrived to END, newline is added. Must go 1 character less.
        message = self.toDecipher.get(1.0, END+"-1c")
        if self._validate(message, passkey):
            passkey = passkey.upper()
            message = message.replace(" ", "").upper()
            decode = Cipher(message, passkey)
            decodedMessage = decode.decipher()
            self._console_log("Decoding successful. \nSee upper box for result.")
            self.toCipher.delete(1.0, END)
            self.toCipher.insert(END, decodedMessage)
        elif passkey == "":
            self._console_log("Error: no passcode entered.")
        elif message == "":
            self._console_log("Error: no message entered.")
        else:
            self._console_log("Decoding unsuccessful. \nInput contains one or more \nillegal characters. See Help \nfor rules.")

    def _validate(self, message, passkey):
        """
        Checks text input from toCipher, toDecipher, and passphrase fields for illegal characters during cipher/decipher processes.
        """
        passkeyOK = passkey.isalpha()
        messageOK = message.replace(" ", "").isalpha()
        return passkeyOK and messageOK

    def _display_help(self):
        """
        Displays help dialog on menu press.
        """
        help = Toplevel()
        help.grab_set()
        help.title("Help")
        help.resizable(0,0)
        help.iconbitmap("cards-64.ico")
        helpMessage = Message(help, text = self.helpText, padx = 10, pady = 10)
        helpMessage.pack()


    def _display_about(self):
        """
        Displays about dialog on menu press.
        """
        about = Toplevel()
        about.grab_set()
        about.title("About")
        about.resizable(0,0)
        about.iconbitmap("cards-64.ico")
        aboutMessage = Message(about, text = self.aboutText, padx = 10, pady = 10)
        aboutMessage.pack()
コード例 #38
0
class ChatGUI(Frame):
    
    def __init__(self, parent, conn, title):
        #Frame.__init__(self, parent, background="grey")   
         
        self.parent = parent
        self.conn = conn
        self.title = title
        
        self.centerWindow()
        self.initUI()
    
    def initUI(self):
      
        self.lineCounter = 0
      
        # create a custom font
        self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic")
        self.customFontMessage = font.Font(family="Calibri")
        
        self.parent.title(self.title) 
        
        frame = Frame(self.parent)
        frame.pack(fill=BOTH, expand=1, side=LEFT)
        
        self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage)
        self.box.insert(END, 'Welcome to Python Chat!')
        self.box.config(state=DISABLED)
        self.box.pack(expand="yes", fill=BOTH, side=TOP)
        
        self.textarea = Text(frame, width=30, height=5)
        #self.textarea.insert(END, "")
        self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu
        self.textarea.pack(expand="yes", fill=BOTH, side=TOP)

        
        okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) 
        okButton.pack(expand="no", fill=BOTH, side=TOP)
        
        self.usersFrame = Frame(self.parent)
        self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT)
        
        self.userListbox = Listbox(self.usersFrame, width=3)
        self.userListbox.bind("<Double-Button-1>", self.privateChat)
        self.userListbox.pack(fill=BOTH, expand=1)
            
        self.updateUsersFrame()
        
    def centerWindow(self):
      
        w = 600
        h = 475

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        
        x = (sw - w)/2
        y = (sh - h)/2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
     
    def gettext(self, e): #e sta per event, questo e' un listener
        text = self.textarea.get("1.0", END + " - 2c") # 1.0: row:columa -  END-2c rimuove l'ultimo carattere, una newline \r\n
        self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io
        self.sendToServer(text)
        
    def printConversation(self, message):
        self.box.config(state=NORMAL)
        self.box.insert(END,"\n" + message)
        self.lineCounter = self.lineCounter + 2
        
        #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END))
        m = re.search("\[.*\].*:", message, re.MULTILINE)
        
        
        if m is not None:
            #print("MATCH")
            #print(m.group(0))
            #print(str(m.start(0)) + "_" + str(m.end(0)))
            #print("COUNTER")
            #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0)))
            self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0)))
            self.box.tag_config("header", font=self.customFontHeader, foreground = "blue")
        
        
        self.box.config(state=DISABLED)
        #self.box.yview_scroll(10000,"units")
        self.box.see(END)

    
    def sendToServer(self, messageToSend):
        self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict'))
    
    def sendFile(self):
        #aprire una dialog di quelle predefinite (Sfoglia...)
        #capire come fare la send di un file sul socket...
        pass
    def updateUsersFrame(self):
        
        global connectedClients
    
        self.userListbox.delete(0, END)
                    
        self.userListbox.insert(END, "Connected users")
        for item in connectedClients:
            self.userListbox.insert(END, item)
        #self.userListbox.update()
        #self.usersFrame.update()
    def privateChat(self, e):
        global conversationBoxList
        userselected = self.userListbox.selection_get()
        if not userselected == "Connected users":
            print("EVVAI CHAT PRIVATA con "+userselected)
            
            newWindow = Toplevel(self.parent)
            newWindow.title("Python Chat with "+userselected)
            newWindow.minsize(400, 475)
            newWindow.focus()
            
            def disconnectPM():
                del conversationBoxList[userselected]
                newWindow.destroy()
            newWindow.protocol('WM_DELETE_WINDOW', disconnectPM)
            
            #label = Label(newWindow, text="PROVA PROVA")
            #label.pack(side="top", fill="both", padx=10, pady=10)
            frame = Frame(newWindow)
            frame.pack(fill=BOTH, expand=1, side=LEFT)
            
            box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage)
            box.config(state=DISABLED)
            box.pack(expand="yes", fill=BOTH, side=TOP)
            
            textarea = Text(frame, width=30, height=5)
            textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, userselected)) 
            textarea.pack(expand="yes", fill=BOTH, side=TOP)
            
            #aggiungo alla mappa globale il box di conversazione
            conversationBoxList[userselected] = box
            

    def receivePrivateChat(self, connectingUser):
        global conversationBoxList
        print("CHAT PRIVATA in arrivo con "+connectingUser)
            
        newWindow = Toplevel(self.parent)
        newWindow.title("Python Chat requested by "+connectingUser)
        newWindow.minsize(400, 475)
        newWindow.focus()
        
        def disconnectPM():
            del conversationBoxList[connectingUser]
            newWindow.destroy()
        newWindow.protocol('WM_DELETE_WINDOW', disconnectPM)
        
        #label = Label(newWindow, text="PROVA PROVA")
        #label.pack(side="top", fill="both", padx=10, pady=10)
        frame = Frame(newWindow)
        frame.pack(fill=BOTH, expand=1, side=LEFT)
        
        box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage)
        box.config(state=DISABLED)
        box.pack(expand="yes", fill=BOTH, side=TOP)
        
        textarea = Text(frame, width=30, height=5)
        textarea.bind("<KeyRelease-Return>", lambda event : self.getprivatetext(event, textarea, connectingUser)) 
        textarea.pack(expand="yes", fill=BOTH, side=TOP)
        
        #aggiungo alla mappa globale il box di conversazione
        conversationBoxList[connectingUser] = box

    def getprivatetext(self, e, textarea, nickname):
            text = textarea.get("1.0", END + " - 2c") 
            textarea.delete("0.0", END) 
            self.sendToServer("##" + nickname + "##" + text)
    
    def setprivatetext(self, nickname, message, isLocalMessage):
        
            #isLocalMessage identifica un messaggio che mando io e che devo ri-ricevere nella mia finestra
            if isLocalMessage:
                for i in conversationBoxList.keys():
                    box = conversationBoxList[i]
                    box.config(state=NORMAL)
                    box.insert(END,"\n" + message)
                    box.config(state=DISABLED)
                    box.see(END)            
            else:
                conversationbox = conversationBoxList[nickname]
                
                conversationbox.config(state=NORMAL)
                conversationbox.insert(END,"\n" + message)
                #self.lineCounter = self.lineCounter + 2
                
                #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END))
                #m = re.search("\[.*\].*:", message, re.MULTILINE)
                
                '''
                if m is not None:
                    #print("MATCH")
                    #print(m.group(0))
                    #print(str(m.start(0)) + "_" + str(m.end(0)))
                    #print("COUNTER")
                    #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0)))
                    self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0)))
                    self.box.tag_config("header", font=self.customFontHeader, foreground = "blue")
                '''
                
                conversationbox.config(state=DISABLED)
                #self.box.yview_scroll(10000,"units")
                conversationbox.see(END)       
コード例 #39
0
class ChatGUI(Frame):
    
    def __init__(self, parent, conn):
        #Frame.__init__(self, parent, background="grey")   
         
        self.parent = parent
        self.conn = conn
        
        self.centerWindow()
        self.initUI()
    
    def initUI(self):
      
        self.lineCounter = 0
      
        # create a custom font
        self.customFontHeader = font.Font(family="Calibri", slant = "italic") #family="Helvetica", weight="bold", slant="italic")
        self.customFontMessage = font.Font(family="Calibri")
        
        self.parent.title("Python Chat") 
        
        frame = Frame(self.parent)
        frame.pack(fill=BOTH, expand=1, side=LEFT)
        
        self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=30, height=18, font=self.customFontMessage)
        self.box.insert(END, 'Welcome to Python Chat!')
        self.box.config(state=DISABLED)
        self.box.pack(expand="yes", fill=BOTH, side=TOP)
        
        self.textarea = Text(frame, width=30, height=5)
        #self.textarea.insert(END, "")
        self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu
        self.textarea.pack(expand="yes", fill=BOTH, side=TOP)

        
        okButton = Button(frame, text="Panic Button", activebackground="red", command=self.sendFile) 
        okButton.pack(expand="no", fill=BOTH, side=TOP)
        
        self.usersFrame = Frame(self.parent)
        self.usersFrame.pack(fill=BOTH, expand=1, side=RIGHT)
        
        self.userListbox = Listbox(self.usersFrame, width=3)
        self.userListbox.pack(fill=BOTH, expand=1)
            
        self.updateUsersFrame()
        
    def centerWindow(self):
      
        w = 600
        h = 475

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        
        x = (sw - w)/2
        y = (sh - h)/2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
     
    def gettext(self, e): #e sta per event, questo e' un listener
        text = self.textarea.get("1.0", END) # 1.0: row:columa -  END-2c rimuove l'ultimo carattere, una newline \r\n
        if "\n" in text:
            text = text.replace("\n", "")
        self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io
        self.sendToServer(text)
        
    def printConversation(self, message):
        self.box.config(state=NORMAL)
        self.box.insert(END,"\n" + message)
        self.lineCounter = self.lineCounter + 2
        
        #m = re.match("\[.*\] From .*\n", self.box.get("0.0", END))
        m = re.search("\[.*\].*:", message, re.MULTILINE)
        
        
        if m is not None:
            #print("MATCH")
            #print(m.group(0))
            #print(str(m.start(0)) + "_" + str(m.end(0)))
            #print("COUNTER")
            #print(str(self.lineCounter) + "." + str(m.start(0)+1) + "___" + str(self.lineCounter) + "." + str(m.end(0)))
            self.box.tag_add("header", str(self.lineCounter) + "." + str(m.start(0)), str(self.lineCounter) + "." + str(m.end(0)))
            self.box.tag_config("header", font=self.customFontHeader, foreground = "blue")
        
        
        self.box.config(state=DISABLED)
        #self.box.yview_scroll(10000,"units")
        self.box.see(END)

    
    def sendToServer(self, messageToSend):
        self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict'))
    
    def sendFile(self):
        #aprire una dialog di quelle predefinite (Sfoglia...)
        #capire come fare la send di un file sul socket...
        pass
    def updateUsersFrame(self):
        
        global connectedClients
    
        self.userListbox.delete(0, END)
                    
        self.userListbox.insert(END, "Connected users")
        for item in connectedClients:
            self.userListbox.insert(END, item)
コード例 #40
0
class SpinDelight(Frame):

    def __init__(self):
        Frame.__init__(self)
        self.master.geometry("1020x600+150+50")
        self.master.title("Spin Delight 1.0 - Copyright (c) Robin Thomas")
        self.master.resizable(0,0)
        self.grid()
        self.brwe = Button(self, text = "Browse", command = self.open_file, width = 10, relief = "groove")
        self.rtxt = Label(self, text="Input Text:")
        self.txt1 = ScrolledText(self, width = 50, height = 25)
        self.txt1.bind("<Control-Key-a>", self.select_all_txt1)
        self.txt1.bind("<Control-Key-A>", self.select_all_txt1)
        self.spin = Button(self, text = "Spin", command = self.spin_file, width = 10, relief = "groove")
        self.stxt = Label(self, text="Spun Text:")
        self.txt2 = ScrolledText(self, width = 50, height = 25)
        self.txt2.bind("<Control-Key-a>", self.select_all_txt2)
        self.txt2.bind("<Control-Key-A>", self.select_all_txt2)
        self.brwe.grid(row = 2, column = 2, pady = 15)
        self.rtxt.grid(row = 2, column = 0, padx = 25)
        self.txt1.grid(row = 3, column = 0, columnspan = 10, padx = 25)
        self.spin.grid(row = 3, column = 12)
        self.stxt.grid(row = 2, column = 13, padx = 25, pady = 5)
        self.txt2.grid(row = 3, column = 13, columnspan = 10, padx = 25)

    def select_all_txt1(self,event):
        self.txt1.tag_add(SEL, "1.0", END)
        self.txt1.mark_set(INSERT, "1.0")
        self.txt1.see(INSERT)
        return 'break'

    def select_all_txt2(self,event):
        self.txt2.tag_add(SEL, "1.0", END)
        self.txt2.mark_set(INSERT, "1.0")
        self.txt2.see(INSERT)
        return 'break'

    def open_file(self):
        fname = askopenfilename(filetypes=(("Text files", "*.txt"), ("All files", "*.*") ))
        if fname:
            try:
                self.txt1.delete(0.0, END)
                f = open(fname,'r')
                self.txt1.insert(INSERT,f.read())
            except:
                showerror("Open Source File", "Failed to read file\n'%s'" % fname)
    
    def spin_file(self):
        txt = self.txt1.get("1.0", END)
        self.txt2.delete(0.0, END)
        if len(txt):
            try:
                words = sub(r'([.,?])+', r' \1 ', sub(r'[^a-zA-Z0-9 .,?]+', ' ', txt)).split()
                w1 = words[0]
                z = [(words[j - 1], words[j]) for j in range(1, len(words))]
                values = self.generate_dict(z, w1)
                string = self.generate_sent(values)
                if len(string):
                    self.txt2.insert(INSERT, string)
                else:
                    showerror("Error", "Insufficient data to spin !!")
            except:
                showerror("Error", "Nothing to spin !!")

                    
    def generate_dict(self, x, w1):
        values = {'.': [w1]}
        for (wa, wb) in x:
            if wa in values:
                values[wa].append(wb)
            else:
                values[wa] = [wb]
        return values


    def generate_sent(self, values):
        w1 = '.'
        w2 = choice(values[w1])
        string = w2
        values[w1].remove(w2)
        while values:
            w1 = w2
            if len(values[w1]):
                w2 = choice(values[w1])
            else:
                del values[w1]
                w1 = '.'
                break
            if w2 in ('.', ',', '?'):
                string += w2
            else:
                string += " " + w2
            values[w1].remove(w2)
        return string
コード例 #41
0
class myPanel(tkinter.Tk):
    def __init__(self):
        tkinter.Tk.__init__(self, 'lsx')
        self.withdraw()  # 先withdraw隐藏再deiconify显示可使setCenter不会导致页面闪烁

        self.title('电话簿v1.05 (联系作者:QQ11313213)')  # TODO 是否有用

        self.keys_var = tkinter.StringVar()
        self.tex1 = ScrolledText(self)
        ent1 = tkinter.Entry(self, textvariable=self.keys_var, width=125)
        ent1.pack(padx=2,
                  pady=2,
                  fill=tkinter.constants.BOTH,
                  side=tkinter.constants.TOP)
        self.tex1.pack(padx=2,
                       pady=2,
                       fill=tkinter.constants.BOTH,
                       expand=True)

        self.menu = tkinter.Menu(self, tearoff=0)
        self.menu.add_command(label='复制', command=self.copyItem)
        self.menu.add_separator()
        self.menu.add_command(label='来源')
        self.menu.add_separator()
        self.menu.add_command(label='刷新', command=readContacts2)
        self.menu.add_command(label='前后文', command=self.location)
        self.menu.add_separator()
        self.menu.add_command(label='导入文件', command=ImportFiles)
        self.menu.add_command(label='新增和更改', command=UpdateFile)

        self.menu0 = tkinter.Menu(self, tearoff=0)
        self.menu0.add_command(label='刷新', command=readContacts2)
        self.menu0.add_separator()
        self.menu0.add_command(label='导入文件', command=ImportFiles)
        self.menu0.add_command(label='新增和更改', command=UpdateFile)
        self.menu0.add_separator()

        submenu = [tkinter.Menu(self, tearoff=0)]
        self.menu0.add_cascade(label='Designed by Lsx. ', menu=submenu[0])

        for key, value in [['Name', 'Li Shixian'], ['Mail', '*****@*****.**'],
                           ['Website', 'github.com/znsoooo/contacts'],
                           ['Wechat', 'Xian_2'], ['Donate', 'xxxx']]:
            submenu.append(tkinter.Menu(self, tearoff=0))
            submenu.append(tkinter.Menu(self, tearoff=0))
            submenu[-1].add_command(label=value)
            submenu[0].add_cascade(label=key, menu=submenu[-1])
        self.img_wechat = tkinter.PhotoImage(
            data=Image.img1)  # 没有self会导致显示图片为空白
        self.img_donate = tkinter.PhotoImage(data=Image.img2)
        submenu[8].entryconfig(0, image=self.img_wechat)
        submenu[10].entryconfig(0, image=self.img_donate)
        submenu[0].add_separator()
        submenu[0].add_command(label='All Rights Reserved.', command=bonus)

        setCenter(self)
        self.deiconify()

        ent1.focus()
        ent1.bind('<KeyRelease>', self.onKeyRelease)
        self.tex1.bind('<ButtonRelease-3>', self.onRightClick)

    def select(self, row):
        self.tex1.mark_set('insert', '%d.0' % row)
        self.tex1.tag_remove('sel', '0.0', 'end')
        self.tex1.tag_add('sel', '%d.0' % row, '%d.0' % (row + 1))

    def location(self, row=0):
        if not row:
            row = self.current_index + 1
        self.onKeyRelease(keys='')
        self.select(row)
        self.tex1.see('%d.0' % row)

    def copyItem(self):
        text = self.tex1.selection_get()
        self.clipboard_clear()
        self.clipboard_append(text[:-1])  # 去掉文末换行符

    def onRightClick(self, evt=0):
        self.tex1.focus()  # 当焦点在ent1中时
        self.current = int(self.tex1.index('current').split('.')[0])
        if len(self.index):
            self.current_index = self.index[self.current - 1]

            line_last = 0
            for line, file in file_list:
                if line > self.current_index:
                    break
                else:
                    line_last = line
            self.menu.entryconfig(2,
                                  label='来源: %s (line:%s)' %
                                  (file, self.current_index - line_last + 1))
            self.menu.entryconfig(
                2,
                command=lambda: os.popen('explorer /select, %s\\%s\\%s' %
                                         (os.getcwd(), DATA_FOLDER, file)))

            self.select(self.current)
            self.menu.post(evt.x_root, evt.y_root)
        else:
            self.menu0.post(evt.x_root, evt.y_root)

        return self.current

    def onKeyRelease(self, evt=0, keys=None):
        if keys is None:
            keys = self.keys_var.get()
        keys = keys.lower().split(' ')
        ss_new = []
        self.index = []
        for n, s in enumerate(ss):
            ok = True
            for key in keys:
                if key not in s[1]:
                    ok = False
            if ok:
                ss_new.append(s[0])
                self.index.append(n)  # TODO 提出搜索部分到独立的函数

        self.tex1.config(state='normal')
        self.tex1.delete('1.0', 'end')
        self.tex1.insert('1.0', '\n'.join(ss_new))
        self.tex1.config(state='disabled')  # 禁止编辑
        self.title('电话簿v1.05 (联系作者:QQ11313213) - %s结果' %
                   len(ss_new))  # title更改耗时短可以做到'同时'更改的效果

        return ss_new
コード例 #42
0
    # スレッドスタート
    th1.start()

    #画面の処理
    root = tk.Tk()
    root.title(conf.get('serversetting', 'title'))
    root.geometry(conf.get('serversetting', 'size'))
    root.protocol('WM_DELETE_WINDOW', on_closing)
    #root.protocol("WM_SAVE_YOURSELF", on_closing)
    #Label
    lb = tk.Label(text=conf.get('serversetting', 'labeltitle'))
    lb.pack()
    #TextBox(スクロール)
    tx = ScrolledText(root, width=100, height=35)
    tx.insert('1.0', "")
    tx.see('end')
    tx.pack()
    #チェックボタン 自動読み込みの要否
    btval = tk.BooleanVar()
    btval.set(True)
    bt_aut = tk.Checkbutton(root,
                            text=conf.get('serversetting', 'btauto'),
                            variable=btval)
    bt_aut.pack(side=tk.LEFT)
    #ボタン ログ削除
    bt_del = tk.Button(text=conf.get('serversetting', 'btdel'),
                       command=btEvent1,
                       width=10)
    bt_del.pack(side=tk.LEFT)
    #ボタン ログ読込
    bt_read = tk.Button(text=conf.get('serversetting', 'btread'),
コード例 #43
0
ファイル: ChatGUIClient.py プロジェクト: skimdz86/Utilities
class ChatGUI(Frame):
  
    def __init__(self, parent, conn):
        #Frame.__init__(self, parent, background="grey")   
         
        self.parent = parent
        self.conn = conn
        
        self.centerWindow()
        self.initUI()
    
    def initUI(self):
      
        #mettere qui tutta l'inizializzazione dei frame anche
        #direi 2 frame, uno left e uno right
      
        self.parent.title("Python Chat") 
        
        frame = Frame(self.parent)
        frame.pack(fill=BOTH, expand=1, side=LEFT)
        
        self.box = ScrolledText(frame, wrap=WORD, relief = GROOVE, width=1, height=20)
        self.box.insert(END, 'Welcome to Python Chat!')
        self.box.config(state=DISABLED)
        self.box.pack(expand="yes", fill=BOTH, side=TOP)
        
        self.textarea = Text(frame, width=1, height=5)
        #self.textarea.insert(END, "")
        self.textarea.bind("<KeyRelease-Return>", self.gettext) #Se metto on press, rimane una newline in piu
        self.textarea.pack(expand="yes", fill=BOTH, side=TOP)

        
        okButton = Button(frame, text="Attach file", activebackground="green", command=self.sendFile) 
        okButton.pack(expand="no", fill=BOTH, side=TOP)
        
        
        #per gestire invio con la newline --> http://userpages.umbc.edu/~dhood2/courses/cmsc433/spring2010/?section=Notes&topic=Python&notes=93
        
        #usersFrame = Frame(self.parent)
        #usersFrame.pack(fill=BOTH, expand=1, side=RIGHT)
    
    def centerWindow(self):
      
        w = 600
        h = 450

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()
        
        x = (sw - w)/2
        y = (sh - h)/2
        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y))
     
    def gettext(self, e): #e sta per event, questo e' un listener
        text = self.textarea.get("1.0", END + " - 2c") # 1.0: row:columa -  END-2c rimuove l'ultimo carattere, una newline \r\n
        self.textarea.delete("0.0", END) #NON VA: il problema e' che viene inviato il carattere di newline ma non incluso nell'area a causa della bind mi sa. Devo escluderlo io
        self.sendToServer(text)
        
    def printConversation(self, message):
        self.box.config(state=NORMAL)
        self.box.insert(END,"\n" + message)
        
        #aggiungo colorazione parte di testo --> troppo complesso per ora
        ''''m = re.search("", message)
        lastIndex = len(m.group(0))
        self.box.tag_add("header", m.start(), m.stop())
        self.box.tag_config("header", foreground="green")
        '''
        self.box.config(state=DISABLED)
        #self.box.yview_scroll(10000,"units")
        self.box.see(END)

    
    def sendToServer(self, messageToSend):
        self.conn.send(messageToSend.encode(encoding='utf_8', errors='strict'))
    
    def sendFile(self):
        #aprire una dialog di quelle predefinite (Sfoglia...)
        #capire come fare la send di un file sul socket...
        pass
コード例 #44
0
ファイル: onmyoji_win.py プロジェクト: AlanRuijia/onmyoji
class Application(Frame):
    def __init__(self, master=None):
        self.warning = '【封号防止】\n' + \
                       '请尽量在自己的日常刷魂时间使用\n' + \
                       '请不要长时间连续使用,任何使你看起来明显违背人类正常作息规律的行为,很容易会被鬼使黑盯上\n' + \
                       '当你离开了常在城市,请不要使用,这会被认为是找了代练\n' + \
                       '点到为止,贪婪是万恶之源\n'
        self.label = r'阴阳师-网易游戏'
        self.hwnd = None
        self.shell = None
        if not self.info_get():
            self.scaling = 1
            self.clear_time = 35
        self.fight = None
        self.timing_value = None

        # 控件初始化
        Frame.__init__(self, master)
        self.pack()
        self.frame1 = Frame(self)
        self.frame1.pack()
        self.frame2 = Frame(self)
        self.frame2.pack()

        self.label_scaling = Label(self.frame1)
        self.var_scaling = StringVar(self.frame1)
        self.entry_scaling = Entry(self.frame1)

        self.button_scaling_explain = Button(self.frame1)

        self.label_mode = Label(self.frame1)
        self.var_mode = StringVar(self.frame1)
        self.listbox_mode = ttk.Combobox(self.frame1)

        self.button_mode_explain = Button(self.frame1)

        self.label_member = Label(self.frame1)
        self.var_member = IntVar()
        self.radio1 = Radiobutton(self.frame1)
        self.radio2 = Radiobutton(self.frame1)

        self.label_clear_time = Label(self.frame1)
        self.var_clear_time = StringVar(self.frame1)
        self.entry_clear_time = Entry(self.frame1)

        self.button_clear_time_explain = Button(self.frame1)

        self.label_offer = Label(self.frame1)
        self.var_offer_mode = StringVar(self.frame1)
        self.listbox_offer_mode = ttk.Combobox(self.frame1)

        self.label_timing_mode = Label(self.frame1)
        self.var_timing_mode = StringVar(self.frame1)
        self.listbox_timing_mode = ttk.Combobox(self.frame1)

        self.var_timing_value = StringVar(self.frame1)
        self.entry_timing_value = Entry(self.frame1)

        self.entry_test = Entry(self.frame1)
        self.test_btn = Button(self.frame1)

        self.start_ctn = Button(self.frame2)
        self.stop_ctn = Button(self.frame2)

        self.info_box = ScrolledText(self.frame2)

        self.queue = Queue(maxsize=1)
        self._running = 1
        self.create_main()

    @staticmethod
    def check_hwnd(label):
        # 获取游戏窗口句柄
        hwnd = win32gui.FindWindow(None, label)
        if hwnd:
            return hwnd
        else:
            print('游戏没有运行')
            return False

    @staticmethod
    def init_window_place(root, x, y):
        screenwidth = root.winfo_screenwidth()
        screenheight = root.winfo_screenheight()
        root.resizable(False, False)
        root.update_idletasks()
        root.deiconify()
        width = root.winfo_width()
        height = root.winfo_height()
        size = '%dx%d+%d+%d' % (width, height, (screenwidth - width) / x,
                                (screenheight - height) / y)
        root.geometry(size)

    def jump_window(self):
        # 跳转到游戏窗口
        win32gui.SetForegroundWindow(self.hwnd)
        win32gui.PostMessage(self.hwnd, win32con.WM_SYSCOMMAND,
                             win32con.SC_RESTORE, 0)

    def get_scaling(self):
        var = self.entry_scaling.get()
        try:
            var = float(var)
        except ValueError:
            messagebox.showinfo(title='提示', message='缩放倍率只能为数字')
            return False
        if var > 2:
            messagebox.showinfo(title='提示', message='缩放倍率过高')
            return False
        return var

    def get_clear_time(self):
        var = self.var_clear_time.get()
        try:
            var = float(var)
        except ValueError:
            messagebox.showinfo(title='提示', message='平均通关时间只能为数字')
            return False
        if var <= 5:
            messagebox.showinfo(title='提示', message='平均通关时间不能小于5')
            return False
        return var

    def get_timimg(self):
        if self.listbox_timing_mode.get() == '无':
            return True
        var = self.var_timing_value.get()
        try:
            var = float(var)
        except ValueError:
            messagebox.showinfo(title='提示', message='预定结束只能填入数字')
            return False
        if var < 1:
            messagebox.showinfo(title='提示', message='数字过小,无法执行')
            return False
        return var

    @staticmethod
    def time_format(second):
        try:
            second = int(second)
        except ValueError:
            return second
        if second > 60:
            m, s = divmod(second, 60)
            h, m = divmod(m, 60)
            return ':'.join(
                (str(h).zfill(2), str(m).zfill(2), str(s).zfill(2)))
        else:
            return second

    def info_get(self):
        try:
            with shelve.open('mysetting.db') as data:
                setting_data = data['setting']
                self.scaling = setting_data['scaling']
                self.clear_time = setting_data['clear_time']
        except KeyError:
            return False
        return True

    def info_save(self):
        with shelve.open('mysetting.db') as data:
            setting_data = dict()
            setting_data['scaling'] = self.var_scaling.get()
            setting_data['clear_time'] = self.var_clear_time.get()
            data['setting'] = setting_data

    def turn_radio_on(self, *args):
        type(args)
        var = self.listbox_mode.get()
        if var == '司机':
            self.radio1.configure(state='active')
            self.radio2.configure(state='active')
        else:
            self.radio1.configure(state='disabled')
            self.radio2.configure(state='disabled')

    def turn_entry_on(self, *args):
        type(args)
        var = self.listbox_timing_mode.get()
        if var == '定时[分钟]' or var == '场数':
            self.entry_timing_value.configure(state='normal')
        else:
            self.entry_timing_value.configure(state='disabled')

    def fight_start(self):
        self.scaling = self.get_scaling()
        if not self.scaling:
            return False
        self.clear_time = self.get_clear_time()
        if not self.clear_time:
            return False
        self.timing_value = self.get_timimg()
        if not self.timing_value:
            return False
        self.info_save()

        # 获取游戏窗口句柄
        self.hwnd = self.check_hwnd(self.label)
        if not self.hwnd:
            messagebox.showinfo(title='提示', message='游戏没有运行')
            return False
        self.shell = win32com.client.Dispatch("WScript.Shell")
        # self.shell.SendKeys('%')

        self.jump_window()
        time.sleep(0.5)
        self.fight = GameController(self.hwnd, self.scaling)
        thread1 = threading.Thread(target=self.fight_thread,
                                   name='fight_thread')
        thread2 = threading.Thread(target=self.offer_thread,
                                   name='offer_thread')
        # 将线程状态、队列内容置为1
        self._running = 1
        if self.queue.empty():
            self.queue.put(1)
        else:
            self.queue.get()
            self.queue.put(1)
        self.start_ctn.configure(state='disabled')
        self.stop_ctn.configure(state='active')
        thread1.start()
        thread2.start()

    def fight_thread(self):
        self.jump_window()
        if not self.queue.empty():
            self.queue.get()
        self.info_box.mark_set('insert', END)
        self.info_box.insert('insert', str(self.warning) + '\n', 'RED')
        self.info_box.tag_config('RED', foreground='red')
        var = '[%s]挂机开始' % datetime.datetime.now().strftime("%H:%M:%S")
        self.info_box.mark_set('insert', END)
        self.info_box.insert('insert', str(var) + '\n')
        self.info_box.see(END)
        rounds = 0
        total_time = 0
        beginning_timg = time.clock()
        while True:
            if self._running == 1:
                fight_start_time = time.clock()
                self.fight.form_team_phase(self.listbox_mode.get(),
                                           self.var_member.get(), self.queue)
                self.fight.wait_fight_finish_phase(self.clear_time, self.queue)
                self.jump_window()
                self.fight.settle_phase(self.queue)
                if self._running == 1:
                    fight_end_time = time.clock()
                    fight_time = fight_end_time - fight_start_time
                    # time.sleep(0.5)
                    rounds = rounds + 1
                    total_time = total_time + fight_time
                    elapsed_time = fight_end_time - beginning_timg
                    var = '第 %s 场 耗时:%s 共计:%s' % \
                          (rounds, self.time_format(fight_time), self.time_format(elapsed_time))
                    self.info_box.mark_set('insert', END)
                    self.info_box.insert('insert', str(var) + '\n')
                    self.info_box.see(END)
                    # 检查是否到达预定结束场数或时间
                    if (self.listbox_timing_mode.get() == '场数' and rounds >= self.timing_value) or \
                       (self.listbox_timing_mode.get() == '定时[分钟]' and elapsed_time / 60 >= self.timing_value):
                        win32gui.PostMessage(self.hwnd, win32con.WM_CLOSE, 0,
                                             0)
                        self.fight_stop()
                        var = '已到达预定目标,游戏窗口已关闭。下线15分钟后buff自动关闭'
                        self.info_box.mark_set('insert', END)
                        self.info_box.insert('insert', str(var) + '\n')
                        self.info_box.see(END)
                    time.sleep(random.uniform(1, 2))
            elif self._running == 0:
                return

    def fight_stop(self):
        # 将线程状态、队列内容置为0
        self._running = 0
        self.queue.put(0)
        self.start_ctn.configure(state='active')
        self.stop_ctn.configure(state='disabled')
        var = '[%s]挂机结束。记得关御魂buff' % datetime.datetime.now().strftime(
            "%H:%M:%S")
        self.info_box.mark_set('insert', END)
        self.info_box.insert('insert', str(var) + '\n')
        self.info_box.see(END)

    def offer_thread(self):
        while True:
            if self._running == 1:
                self.fight.check_offer(self.listbox_offer_mode.get(),
                                       self.queue)
            elif self._running == 0:
                return

    @staticmethod
    def resource_path(relative_path):
        """ Get absolute path to resource, works for dev and for PyInstaller """
        base_path = getattr(sys, '_MEIPASS',
                            os.path.dirname(os.path.abspath(__file__)))
        return os.path.join(base_path, relative_path)

    def what_is_scaling_window(self):
        what_is_scaling = Toplevel(self)
        what_is_scaling.title('缩放倍率 - 不能自动获取,技术就是这么菜,不服憋着_(:3」∠)_')

        frame1 = Frame(what_is_scaling)
        frame1.pack()
        frame2 = Frame(what_is_scaling)
        frame2.pack()

        title = Label(frame1)
        title['text'] = '\n【 缩放倍率 】'
        title.pack()
        desc1 = Message(frame1)
        desc1['width'] = 600
        desc1['text'] = '\n缩放倍率是指Windows系统在不改变分辨率的情况下,将窗口和图标放大以达到更加舒适的显示效果的功能\n' + \
                        '\n在某些分辨率下,Windows会自动设置一个超过100%的倍率。请确定自己系统当前的缩放倍率设置,并填入缩放倍率一栏中\n' + \
                        '\n不正确的缩放倍率设置,会导致坐标计算不准\n' + \
                        '\n若设置的缩放倍率是100%,则填入1,若是125%,则填1.25,依次类推\n'
        desc1.pack()

        label_win10 = Label(frame2)
        label_win10['text'] = 'Windows 10'
        label_win10.grid(row=0, column=0)

        label_win7 = Label(frame2)
        label_win7['text'] = 'Windows 7'
        label_win7.grid(row=0, column=1)

        ipath = self.resource_path('image/win10.png')
        load = PLI_Image.open(ipath)
        load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size)))
        render = ImageTk.PhotoImage(load)
        img_win10 = Label(frame2, image=render)
        img_win10.image = render
        img_win10.grid(row=1, column=0)

        ipath = self.resource_path('image/win7.png')
        load = PLI_Image.open(ipath)
        load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size)))
        render = ImageTk.PhotoImage(load)
        img_win7 = Label(frame2, image=render)
        img_win7.image = render
        img_win7.grid(row=1, column=1)

        self.init_window_place(what_is_scaling, 1.3, 3)

    def when_click_start_window(self):
        when_click_start = Toplevel(self)
        when_click_start.title('模式说明')

        var = self.listbox_mode.get()
        if var == '单刷':
            title = Label(when_click_start)
            title['text'] = '\n【 单刷模式 】'
            title.pack()
            desc = Message(when_click_start)
            desc['text'] = '\n请把游戏调整至如图所示界面,再点START\n'
            desc['width'] = 300
            desc.pack()

            ipath = self.resource_path('image/single.png')
            load = PLI_Image.open(ipath)
            load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size)))
            render = ImageTk.PhotoImage(load)
            img = Label(when_click_start, image=render)
            img.image = render
            img.pack()
        elif var == '乘客':
            title = Label(when_click_start)
            title['text'] = '\n【 乘客模式 】'
            title.pack()
            desc = Message(when_click_start)
            desc['text'] = '\n建议接受了司机的默认邀请,再点START\n' + \
                           '因为我不会在战斗里帮你点开始...不服憋着\n_(:3」∠)_\n'
            desc['width'] = 300
            desc.pack()

            ipath = self.resource_path('image/passenger_accept.png')
            load = PLI_Image.open(ipath)
            load = load.resize(tuple(map(lambda x: int(x * 0.7), load.size)))
            render = ImageTk.PhotoImage(load)
            img = Label(when_click_start, image=render)
            img.image = render
            img.pack()
        elif var == '司机':
            title = Label(when_click_start)
            title['text'] = '\n【 司机模式 】'
            title.pack()
            desc = Message(when_click_start)
            desc['text'] = '\n建议对乘客发出默认邀请,回到组队界面再点START\n' + \
                           '因为自动发出邀请这个功能没写...不服憋着\n_(:3」∠)_\n'
            desc['width'] = 300
            desc.pack()

            ipath = self.resource_path('image/driver_invite.png')
            load = PLI_Image.open(ipath)
            load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size)))
            render = ImageTk.PhotoImage(load)
            img1 = Label(when_click_start, image=render)
            img1.image = render
            img1.pack()

            ipath = self.resource_path('image/driver_form.png')
            load = PLI_Image.open(ipath)
            load = load.resize(tuple(map(lambda x: int(x * 0.5), load.size)))
            render = ImageTk.PhotoImage(load)
            img2 = Label(when_click_start, image=render)
            img2.image = render
            img2.pack()

        self.init_window_place(when_click_start, 1.3, 3)

    def what_is_clear_time(self):
        what_is_clear = Toplevel(self)
        what_is_clear.title('平均通关时间说明')

        title = Label(what_is_clear)
        title['text'] = '\n【 平均通关时间 】'
        title.pack()
        desc = Message(what_is_clear)
        desc['text'] = '\n平均通关时间是指在游戏中,从按下开始战斗到进入结算奖励界面所经过的时间(秒)\n' + \
                       '\n程序会在经过指定的时间后,再开始检测游戏画面是否进入了结算界面\n' + \
                       '\n如果设置一个较短的时间也可以,不过设置一个合理的时间,能节省你CPU资源\n(其实也没占多少_(:3」∠)_\n'
        desc['width'] = 300
        desc.pack()
        self.init_window_place(what_is_clear, 1.3, 3)

    def create_main(self):
        self.label_scaling['text'] = '缩放倍率'
        self.var_scaling.set(self.scaling)
        self.entry_scaling['textvariable'] = self.var_scaling
        self.label_scaling.grid(row=0, column=0, sticky='E')
        self.entry_scaling.grid(row=0, column=1, sticky='W', columnspan=2)

        self.button_scaling_explain['text'] = '?'
        self.button_scaling_explain['command'] = self.what_is_scaling_window
        self.button_scaling_explain['relief'] = 'flat'
        self.button_scaling_explain.grid(row=0, column=2, sticky='E')

        self.label_mode['text'] = '模式'
        self.var_mode.set('单刷')
        self.listbox_mode['textvariable'] = self.var_mode
        self.listbox_mode['width'] = 10
        self.listbox_mode['values'] = ["单刷", "乘客", "司机"]
        self.listbox_mode.bind("<<ComboboxSelected>>", self.turn_radio_on)
        self.label_mode.grid(row=1, column=0, sticky='E')
        self.listbox_mode.grid(row=1, column=1, sticky='W')

        self.button_mode_explain['text'] = '?'
        self.button_mode_explain['command'] = self.when_click_start_window
        self.button_mode_explain['relief'] = 'flat'
        self.button_mode_explain.grid(row=1, column=2, sticky='W')

        self.var_member.set(2)
        self.label_member['text'] = '车队人数'
        self.label_member.grid(row=2, column=0, sticky='E')
        self.radio1['text'] = '2人'
        self.radio1['variable'] = self.var_member
        self.radio1['value'] = 2
        # self.radio1['command'] = self.test_val3
        self.radio1.grid(row=2, column=1, sticky='W')
        self.radio1.configure(state='disabled')

        self.radio2['text'] = '3人'
        self.radio2['variable'] = self.var_member
        self.radio2['value'] = 3
        # self.radio2['command'] = self.test_val3
        self.radio2.grid(row=2, column=2, sticky='W')
        self.radio2.configure(state='disabled')

        self.label_clear_time['text'] = '平均通关时间'
        self.var_clear_time.set(self.clear_time)
        self.entry_clear_time['textvariable'] = self.var_clear_time
        self.label_clear_time.grid(row=3, column=0, sticky='E')
        self.entry_clear_time.grid(row=3, column=1, sticky='W', columnspan=2)

        self.button_clear_time_explain['text'] = '?'
        self.button_clear_time_explain['command'] = self.what_is_clear_time
        self.button_clear_time_explain['relief'] = 'flat'
        self.button_clear_time_explain.grid(row=3, column=2, sticky='E')

        self.label_offer['text'] = '好友发来悬赏'
        self.var_offer_mode.set('接受')
        self.listbox_offer_mode['textvariable'] = self.var_offer_mode
        self.listbox_offer_mode['width'] = 10
        self.listbox_offer_mode['values'] = ["接受", "拒绝"]
        self.listbox_offer_mode.bind("<<ComboboxSelected>>",
                                     self.turn_radio_on)
        self.label_offer.grid(row=4, column=0, sticky='E')
        self.listbox_offer_mode.grid(row=4, column=1, sticky='W')

        self.label_timing_mode['text'] = '预定结束'
        self.var_timing_mode.set('无')
        self.listbox_timing_mode['textvariable'] = self.var_timing_mode
        self.listbox_timing_mode['width'] = 10
        self.listbox_timing_mode['values'] = ["无", "定时[分钟]", "场数"]
        self.listbox_timing_mode.bind("<<ComboboxSelected>>",
                                      self.turn_entry_on)
        self.label_timing_mode.grid(row=5, column=0, sticky='E')
        self.listbox_timing_mode.grid(row=5, column=1, sticky='W')

        self.var_timing_value.set('')
        self.entry_timing_value['textvariable'] = self.var_timing_value
        self.entry_timing_value['width'] = 5
        self.entry_timing_value.configure(state='disabled')
        self.entry_timing_value.grid(row=5, column=2, sticky='W')

        self.start_ctn['text'] = 'START'
        self.start_ctn['width'] = 10
        self.start_ctn['height'] = 2
        self.start_ctn['command'] = self.fight_start
        self.start_ctn['relief'] = 'groove'
        self.start_ctn.grid(row=0, column=0, sticky='E')

        self.stop_ctn['text'] = 'STOP'
        self.stop_ctn['width'] = 10
        self.stop_ctn['height'] = 2
        self.stop_ctn['command'] = self.fight_stop
        self.stop_ctn['relief'] = 'groove'
        self.stop_ctn.grid(row=0, column=1, sticky='W')
        self.stop_ctn.configure(state='disabled')

        self.info_box['width'] = 40
        self.info_box['height'] = 20
        self.info_box.grid(row=1, column=0, columnspan=2)
        self.info_box.see(END)
        var = '请授予此程序管理员权限运行,否则在游戏窗口内鼠标无法被控制'
        self.info_box.mark_set('insert', END)
        self.info_box.insert('insert', str(var) + '\n')
        self.info_box.see(END)
コード例 #45
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("进行标识被取消")
コード例 #46
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)