コード例 #1
0
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        #self.style = Style()
        #self.style.theme_use("clam")
        #self.pack(fill=BOTH, expand = 1)

        self.labelU = Label(self, text="U:")
        self.labelP = Label(self, text="P:")

        self.mailrecipient = 'GoldenSights'

        self.entryUsername = Entry(self)
        self.entryUsername.focus_set()
        self.entryUsername.bind('<Return>',
                                lambda event: self.entryPassword.focus_set())

        self.entryPassword = Entry(self)
        self.entryPassword.config(show='•')
        self.entryPassword.bind(
            '<Return>', lambda event: self.login(self.entryUsername.get(),
                                                 self.entryPassword.get()))

        self.newbutton = Button(
            self,
            text="Login",
            command=lambda: self.login(self.entryUsername.get(),
                                       self.entryPassword.get()))
        self.newbutton.bind(
            '<Return>', lambda event: self.login(self.entryUsername.get(),
                                                 self.entryPassword.get()))
        self.newbutton.config(width=6)
        self.quitbutton = Button(self,
                                 text="Quit",
                                 command=lambda: self.quit())
        self.quitbutton.config(width=6)

        self.labelU.grid(row=0, column=0, padx=0)
        self.entryUsername.grid(row=0, column=1)
        self.labelP.grid(row=1, column=0)
        self.entryPassword.grid(row=1, column=1, pady=4)
        self.newbutton.grid(row=2, column=1)
        self.quitbutton.grid(row=3, column=1, pady=4)

        self.labelErrorPointer = Label(self, text="◀")

        self.indicatorGreen = PhotoImage(file="indicatorGreen.gif")
        self.indicatorRed = PhotoImage(file="indicatorRed.gif")
        self.indicatorBlue = PhotoImage(file="indicatorBlue.gif")
        self.indicatorBlack = PhotoImage(file="indicatorBlack.gif")

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        w = 400
        h = 480
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y - 50))

    def login(self, username, password):
        print('U: ' + username)
        self.username = username
        if username == '' or not all(
                char in string.ascii_letters + string.digits + '_-'
                for char in username):
            print('Please enter a username')
            self.entryUsername.focus_set()
            self.labelErrorPointer.grid(row=0, column=2)
        elif password == '':
            print('Please enter a password')
            self.entryPassword.focus_set()
            self.labelErrorPointer.grid(row=1, column=2)

        else:
            self.labelErrorPointer.grid_forget()
            print('Attempting login for ' + username)
            try:
                self.USERAGENT = username + ' practices Tkinter+PRAW mixing with utility by /u/GoldenSights.'
                self.r = praw.Reddit(self.USERAGENT)
                #self.r.login(username, password)
                print('Success')
                self.labelU.grid_forget()
                self.labelP.grid_forget()
                self.entryUsername.grid_forget()
                self.entryPassword.grid_forget()
                self.newbutton.grid_forget()
                self.quitbutton.grid_forget()
                self.usernamelabel = Label(self,
                                           text=username + ', Sending to /u/' +
                                           self.mailrecipient)
                self.usernamelabel.grid(row=0, column=0, columnspan=8)
                self.quitbutton.grid(row=900, column=0)

                self.labellist = []
                self.entrylist = []
                self.verifylist = []
                self.misclist = []

                self.optionDiscuss = "Discussion Flair + Crossposting"
                self.optionRegister = "Register a new Candidate"

                self.prevmode = self.optionDiscuss
                self.curmode = self.optionDiscuss
                self.optionvar = tkinter.StringVar(self)
                self.optionvar.trace("w", self.permaloop)
                self.optionvar.set(self.optionDiscuss)
                self.option = OptionMenu(self, self.optionvar,
                                         self.optionDiscuss,
                                         self.optionRegister, "three", "four")
                self.newbutton.unbind("<Return>")
                self.entryUsername.unbind("<Return>")
                self.entryPassword.unbind("<Return>")
                self.option.grid(row=1, column=0, columnspan=8, pady=8)
                self.updategui(True)
            except praw.errors.InvalidUserPass:
                pass
                print('Invalid username or password')
                self.entryPassword.delete(0, 200)
                self.labelErrorPointer.grid(row=1, column=2)

    def permaloop(self, *args):
        self.curmode = self.optionvar.get()
        print('Was: ' + self.prevmode + ' | Now: ' + self.curmode)
        if self.curmode != self.prevmode:
            self.prevmode = self.curmode
            self.updategui(True)

    def updategui(self, *args):
        if args[0] == True:
            print('Cleaning GUI')
            for item in self.labellist:
                item.grid_forget()
            for item in self.entrylist:
                item.grid_forget()
            for item in self.verifylist:
                item.grid_forget()
            for item in self.misclist:
                item.grid_forget()
            self.labellist = []
            self.entrylist = []
            self.verifylist = []
            self.misclist = []

            if self.curmode == self.optionDiscuss:
                self.newrowindex = 4
                self.labelPermalink = Label(self, text="Thread Permalink:")
                self.entryPermalink = Entry(self)
                self.rowconfigure(2, weight=2)
                self.labelPermalink.grid(row=2, column=0)
                self.entryPermalink.grid(row=2, column=1)
                self.labelcrossposting = Label(self, text="Crosspost to:")
                self.labelcrossposting.grid(row=3,
                                            column=0,
                                            columnspan=2,
                                            sticky="w")

                for m in range(5):
                    self.redditlabel = Label(self, text="/r/")
                    self.redditlabel.grid(row=self.newrowindex,
                                          column=0,
                                          sticky="e")
                    self.labellist.append(self.redditlabel)

                    self.redditentry = Entry(self)
                    self.redditentry.grid(row=self.newrowindex, column=1)
                    self.entrylist.append(self.redditentry)

                    self.newrowindex += 1

                self.morerowbutton = Button(
                    self,
                    text="+row",
                    command=lambda: self.morerows('/r/', 0, 1, 20))
                self.morerowbutton.grid(row=898, column=0, columnspan=2)

                self.verifybutton = Button(
                    self, text="Verify", command=lambda: self.updategui(False))
                self.verifybutton.grid(row=899, column=0, columnspan=2)

                self.newrowindex += 2

                self.misclist.append(self.labelPermalink)
                self.misclist.append(self.labelcrossposting)
                self.misclist.append(self.entryPermalink)
                self.misclist.append(self.morerowbutton)
                self.misclist.append(self.verifybutton)

            if self.curmode == self.optionRegister:
                self.newrowindex = 6
                self.labelCanUsername = Label(
                    self, text="Candidate's Username:  /u/")
                self.entryCanUsername = Entry(self)
                self.labelCanRealname = Label(self,
                                              text="Candidate's Realname:")
                self.entryCanRealname = Entry(self)
                self.labelCanFlair = Label(self, text="Candidate's Flair:")
                self.entryCanFlair = Entry(self)
                self.entryMo = Spinbox(
                    self,
                    width=9,
                    values=('January', 'February', 'March', 'April', 'May',
                            'June', 'July', 'August', 'September', 'October',
                            'November', 'December'))
                self.entryDa = Spinbox(self, width=2, from_=1, to=31)
                self.entryYr = Spinbox(self, width=4, from_=2014, to=2500)
                self.labelHH = Label(self, text="Schedule time UTC:")
                self.entryHH = Spinbox(self, from_=0, to=23, width=2)
                self.entryMM = Spinbox(self, from_=0, to=59, width=2)
                self.entryYr.delete(0, 'end')
                self.entryYr.insert(0, 2014)

                self.morerowbutton = Button(
                    self,
                    text="+question",
                    command=lambda: self.morerows('Q:', 0, 1, 25))
                self.morerowbutton.grid(row=898, column=0, columnspan=8)

                self.verifybutton = Button(
                    self, text="Verify", command=lambda: self.updategui(False))
                self.verifybutton.grid(row=899, column=0, columnspan=8)

                self.misclist.append(self.labelCanUsername)
                self.misclist.append(self.labelCanRealname)
                self.misclist.append(self.entryCanUsername)
                self.misclist.append(self.entryCanRealname)
                self.misclist.append(self.labelHH)
                self.misclist.append(self.entryHH)
                self.misclist.append(self.entryMM)
                self.misclist.append(self.entryMo)
                self.misclist.append(self.entryDa)
                self.misclist.append(self.entryYr)
                self.misclist.append(self.morerowbutton)
                self.misclist.append(self.verifybutton)

                self.labelCanUsername.grid(row=2, column=0, sticky="e")
                self.labelCanRealname.grid(row=3, column=0, sticky="e")
                self.labelCanFlair.grid(row=4, column=0, sticky="e")
                self.entryCanUsername.grid(row=2, column=1, columnspan=3)
                self.entryCanRealname.grid(row=3, column=1, columnspan=3)
                self.entryCanFlair.grid(row=4, column=1, columnspan=3)
                self.entryMo.grid(row=5, column=1, sticky="e")
                self.entryDa.grid(row=5, column=2)
                self.entryYr.grid(row=5, column=3)
                self.labelHH.grid(row=5, column=0, sticky="se", pady=5)
                self.entryHH.grid(row=6, column=1, sticky="e")
                self.entryMM.grid(row=6, column=2, sticky="w")
        else:
            if self.curmode == self.optionDiscuss:

                verifies = []

                i = self.entryPermalink.get()
                if len(i) == 6:
                    pid = i
                else:
                    if 'www.reddit.com/r/' in i and '/comments/' in i:
                        pid = i.split('/comments/')[1].split('/')[0]
                    if 'http://redd.it/' in i:
                        pid = i.split('redd.it/')[1]

                for flag in self.verifylist:
                    flag.grid_forget()
                    self.verifylist.remove(flag)

                try:
                    print('Fetching Submission ' + pid)
                    self.r.get_info(thing_id="t3_" + pid).title + 'Check'
                    self.redditlabel = Label(self, image=self.indicatorGreen)
                    self.redditlabel.grid(row=2, column=2)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(True)
                    print('\tSuccess')
                except:
                    print(
                        'Failed. Make sure to include the http://. Copy and paste straight from your browser for best result'
                    )
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=2, column=2)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)

                for entry in self.entrylist:
                    i = entry.get()
                    if i != '':
                        print('Fetching /r/' + i)
                        if all(char in string.ascii_letters + string.digits +
                               '_-' for char in i):
                            try:
                                sub = self.r.get_subreddit(i, fetch=True)
                                self.redditlabel = Label(
                                    self, image=self.indicatorGreen)
                                self.redditlabel.grid(
                                    row=entry.grid_info()['row'], column=2)
                                self.verifylist.append(self.redditlabel)
                                verifies.append(True)
                                print('\tSuccess')
                            except:
                                self.redditlabel = Label(
                                    self, image=self.indicatorRed)
                                self.redditlabel.grid(
                                    row=entry.grid_info()['row'], column=2)
                                self.verifylist.append(self.redditlabel)
                                verifies.append(False)
                                print('\tFailed')
                            time.sleep(2)
                        else:
                            self.redditlabel = Label(self,
                                                     image=self.indicatorRed)
                            self.redditlabel.grid(row=entry.grid_info()['row'],
                                                  column=2)
                            self.verifylist.append(self.redditlabel)
                            verifies.append(False)
                            print('\tFailed')

                print(verifies)

            if self.curmode == self.optionRegister:

                verifies = []
                u = self.entryCanUsername.get()
                print('Fetching /u/' + u)
                if not all(char in string.ascii_letters + string.digits + '_-'
                           for char in u):
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=2, column=4)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)
                    print('\tBad characterage')
                else:
                    try:
                        u = self.r.get_redditor(u)
                        print(u)
                        self.redditlabel = Label(self,
                                                 image=self.indicatorGreen)
                        self.redditlabel.grid(row=2, column=4)
                        self.verifylist.append(self.redditlabel)
                        verifies.append(True)
                        print('\tSuccess')
                    except:
                        self.redditlabel = Label(self, image=self.indicatorRed)
                        self.redditlabel.grid(row=2, column=4)
                        self.verifylist.append(self.redditlabel)
                        verifies.append(False)
                        print('\tFailed')

                try:
                    print('Checking Time')
                    t = self.entryMo.get() + ' ' + self.entryDa.get(
                    ) + ' ' + self.entryYr.get() + ' ' + self.entryHH.get(
                    ) + ':' + self.entryMM.get()
                    plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M")
                    plandate = datetime.datetime.utcfromtimestamp(
                        plandate.timestamp())
                    print('\t' + str(plandate.timestamp()))

                    self.redditlabel = Label(self, image=self.indicatorGreen)
                    self.redditlabel.grid(row=5, column=3)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(True)
                except:
                    print('\tFailed')
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=5, column=3)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)

                print(verifies)

    def morerows(self, label, columnm, columnn, limit, *args):
        self.redditlabel = Label(self, text=label)
        self.redditlabel.grid(row=self.newrowindex, column=columnm, sticky="e")
        self.labellist.append(self.redditlabel)

        self.redditentry = Entry(self)
        self.redditentry.grid(row=self.newrowindex,
                              column=columnn,
                              columnspan=9)
        self.entrylist.append(self.redditentry)

        self.newrowindex += 1
        if self.newrowindex >= limit:
            self.morerowbutton.grid_forget()
        print(self.newrowindex)
コード例 #2
0
class GUI():
    def __init__(self):
        self.root = ThemedTk(theme="radiance")
        INIT_WIDTH, INIT_HEIGHT = self.root.winfo_screenwidth(
        ), self.root.winfo_screenheight()
        boldStyle = ttk.Style()
        boldStyle.configure("Bold.TButton", font=('Sans', '12', 'bold'))
        #icon_loc = os.path.join(os.getcwd(),ICON_NAME)
        #img = ImageTk.PhotoImage(master = self.root, file=icon_loc)
        #self.root.wm_iconbitmap(img)
        #self.root.ttk.call('wm', 'iconphoto', self.root._w, img)
        self.root.title("Form Labeller")
        self.root.maxsize(INIT_WIDTH, INIT_HEIGHT)
        self.supported_formats = SUPPORTED_FORMATS

        self.left_frame = Frame(self.root, width=BUTTON_WIDTH)
        self.top_frame1 = Frame(self.left_frame,
                                width=BUTTON_WIDTH,
                                height=int(INIT_HEIGHT / 2))
        self.top_frame = Frame(self.left_frame,
                               width=BUTTON_WIDTH,
                               height=INIT_HEIGHT - int(INIT_HEIGHT / 2))
        self.bottom_frame = Frame(self.root, width=INIT_WIDTH - BUTTON_WIDTH)

        self.load_image_directory_button = Button(self.top_frame1,
                                                  text='Open Folder',
                                                  command=self.load_directory,
                                                  width=int(BUTTON_WIDTH),
                                                  style="Bold.TButton")
        self.load_image_directory_button.grid(row=OPEN_FOLDER_ROW,
                                              columnspan=2,
                                              sticky=tk.W + tk.E)

        self.prev_img_button = Button(self.top_frame1,
                                      text='← Prev',
                                      command=self.previous_img,
                                      state=tk.DISABLED,
                                      width=int(BUTTON_WIDTH / 2),
                                      style="Bold.TButton")
        self.prev_img_button.grid(row=PREV_ROW, column=0, sticky=tk.W + tk.E)

        self.next_img_button = Button(self.top_frame1,
                                      text='Next → ',
                                      command=self.next_img,
                                      width=int(BUTTON_WIDTH / 2),
                                      style="Bold.TButton")
        self.next_img_button.grid(row=NEXT_COL, column=1, sticky=tk.W + tk.E)

        self.save_image_button = Button(self.top_frame1,
                                        text='Save ',
                                        command=self.saver,
                                        width=int(BUTTON_WIDTH),
                                        style="Bold.TButton")
        self.save_image_button.grid(row=SAVE_ROW,
                                    columnspan=2,
                                    sticky=tk.W + tk.E)

        self.delete_poly_button = Button(self.top_frame,
                                         text='Delete Selected',
                                         command=self.delete_selected,
                                         width=int(BUTTON_WIDTH),
                                         style="Bold.TButton")
        self.delete_poly_button.grid(row=DEL_SELECTED_ROW,
                                     columnspan=2,
                                     sticky=tk.W + tk.E)

        self.type_choices = TYPE_CHOICES
        self.variable = StringVar(self.top_frame)
        self.variable.set(self.type_choices[0])
        self.type_options = OptionMenu(self.top_frame,
                                       self.variable,
                                       *self.type_choices,
                                       style="Bold.TButton")
        self.type_options.config(width=int(BUTTON_WIDTH / 2))
        self.type_options.grid(row=DROP_DOWN_ROW, column=0)

        self.save_type_button = Button(self.top_frame,
                                       text='Save Type',
                                       command=self.save_type,
                                       width=int(BUTTON_WIDTH / 2),
                                       style="Bold.TButton")
        self.save_type_button.grid(row=SAVE_TYPE_ROW,
                                   column=1,
                                   sticky=tk.W + tk.E)

        self.deselect_all_button = Button(self.top_frame,
                                          text='Deselect All',
                                          command=self.deselect_all,
                                          width=BUTTON_WIDTH,
                                          style="Bold.TButton")
        self.deselect_all_button.grid(row=DESELECT_ALL_ROW,
                                      columnspan=2,
                                      sticky=tk.W + tk.E)

        self.select_all_button = Button(self.top_frame,
                                        text='Select All',
                                        command=self.select_all,
                                        width=BUTTON_WIDTH,
                                        style="Bold.TButton")
        self.select_all_button.grid(row=SELECT_ALL_ROW,
                                    columnspan=2,
                                    sticky=tk.W + tk.E)

        self.draw_poly_button = Button(self.top_frame,
                                       text='Draw Poly',
                                       command=self.draw_poly_func,
                                       width=BUTTON_WIDTH,
                                       style="Bold.TButton")
        self.draw_poly_button.grid(row=DRAW_POLY_ROW,
                                   columnspan=2,
                                   sticky=tk.W + tk.E)

        self.draw_rect_button = Button(self.top_frame,
                                       text='Draw Rectangle',
                                       command=self.draw_rect_func,
                                       width=BUTTON_WIDTH,
                                       style="Bold.TButton")
        self.draw_rect_button.grid(row=DRAW_RECT_ROW,
                                   columnspan=2,
                                   sticky=tk.W + tk.E)

        self.delete_all_button = Button(self.top_frame,
                                        text='Delete All',
                                        command=self.delete_all,
                                        width=BUTTON_WIDTH,
                                        style="Bold.TButton")

        self.save_poly_button = Button(self.top_frame,
                                       text='Save Poly',
                                       command=self.save_drawing,
                                       width=int(BUTTON_WIDTH / 2),
                                       style="Bold.TButton")

        self.discard_poly_button = Button(self.top_frame,
                                          text='Discard Poly',
                                          command=self.discard_drawing,
                                          width=int(BUTTON_WIDTH / 2),
                                          style="Bold.TButton")

        self.save_rect_button = Button(self.top_frame,
                                       text='Save Rect',
                                       command=self.save_drawing,
                                       width=int(BUTTON_WIDTH / 2),
                                       style="Bold.TButton")

        self.discard_rect_button = Button(self.top_frame,
                                          text='Discard Rect',
                                          command=self.discard_drawing,
                                          width=int(BUTTON_WIDTH / 2),
                                          style="Bold.TButton")

        self.show_type_button = Button(self.top_frame,
                                       text='Show Type',
                                       command=self.show_type,
                                       width=int(BUTTON_WIDTH / 2),
                                       style="Bold.TButton")
        self.show_type_button.grid(row=SHOW_TYPE_ROW,
                                   column=0,
                                   columnspan=1,
                                   sticky=tk.W + tk.E)

        self.hide_type_button = Button(self.top_frame,
                                       text='Hide Type',
                                       command=self.hide_type,
                                       width=int(BUTTON_WIDTH / 2),
                                       style="Bold.TButton")
        self.hide_type_button.grid(row=HIDE_TYPE_ROW,
                                   columnspan=1,
                                   column=1,
                                   sticky=tk.W + tk.E)

        self.make_tight_button = Button(self.top_frame,
                                        text='Make Tight',
                                        command=self.make_tight,
                                        width=int(BUTTON_WIDTH / 2),
                                        style="Bold.TButton")
        self.make_tight_button.grid(row=MAKE_TIGHT_ROW,
                                    columnspan=2,
                                    column=0,
                                    sticky=tk.W + tk.E)

        self.threshold_scale = Scale(self.top_frame,
                                     from_=0,
                                     to=255,
                                     orient=HORIZONTAL,
                                     width=int(BUTTON_WIDTH / 2),
                                     label="Binary Threshold")
        self.threshold_scale.set(128)
        self.threshold_scale.grid(row=THRESHOLD_ROW,
                                  columnspan=2,
                                  column=0,
                                  sticky=tk.W + tk.E)

        self.tight_save_button = Button(self.top_frame,
                                        text='Accept Tight',
                                        command=self.save_tight)

        self.tight_discard_button = Button(self.top_frame,
                                           text='Discard Tight',
                                           command=self.discard_tight)

        self.canvas = Canvas(self.bottom_frame,
                             width=INIT_WIDTH - BUTTON_WIDTH,
                             height=INIT_HEIGHT,
                             borderwidth=1)
        self.image_name = None
        #self.image_path = os.path.join('imgs','img1.jpg')
        self.image_dir = None
        self.images_in_dir = None
        self.curr_idx = None
        self.img_cnv = None
        #self.img_cnv = ImageOnCanvas(self.root,self.canvas,self.image_path)
        self.drawing_obj = None
        self.tight_box_obj = None

        self.left_frame.pack(side=tk.LEFT)
        self.top_frame1.pack(side=tk.TOP)
        self.top_frame.pack(side=tk.BOTTOM)
        self.bottom_frame.pack(side=tk.LEFT)
        self.canvas.pack()
        self.hide_buttons()
        self.load_image_directory_button.config(state="normal")

    def save_tight(self):
        self.tight_box_obj.save_tight_box()
        self.tight_save_button.grid_forget()
        self.tight_discard_button.grid_forget()
        self.make_tight_button.grid(row=MAKE_TIGHT_ROW,
                                    columnspan=2,
                                    sticky=tk.W + tk.E)
        self.show_buttons()
        self.tight_box_obj = None

    def discard_tight(self):
        self.tight_box_obj.discard_tight_box()
        self.tight_save_button.grid_forget()
        self.tight_discard_button.grid_forget()
        self.make_tight_button.grid(row=MAKE_TIGHT_ROW,
                                    columnspan=2,
                                    sticky=tk.W + tk.E)
        self.show_buttons()
        self.tight_box_obj = None

    def show_type(self):
        for poly in self.img_cnv.polygons:
            if poly.select_poly:
                poly.show_type()

    def hide_type(self):
        for poly in self.img_cnv.polygons:
            poly.unshow_type()

    def hide_buttons(self):
        self.load_image_directory_button.config(state=tk.DISABLED)
        self.save_image_button.config(state=tk.DISABLED)
        self.delete_poly_button.config(state=tk.DISABLED)
        self.save_type_button.config(state=tk.DISABLED)
        self.deselect_all_button.config(state=tk.DISABLED)
        self.select_all_button.config(state=tk.DISABLED)
        self.delete_all_button.config(state=tk.DISABLED)
        self.show_type_button.config(state=tk.DISABLED)
        self.hide_type_button.config(state=tk.DISABLED)
        self.make_tight_button.config(state=tk.DISABLED)

    def show_buttons(self):
        self.load_image_directory_button.config(state="normal")
        self.save_image_button.config(state="normal")
        self.delete_poly_button.config(state="normal")
        self.save_type_button.config(state="normal")
        self.deselect_all_button.config(state="normal")
        self.select_all_button.config(state="normal")
        self.delete_all_button.config(state="normal")
        self.show_type_button.config(state="normal")
        self.hide_type_button.config(state="normal")
        self.draw_poly_button.config(state="normal")
        self.draw_rect_button.config(state="normal")
        self.make_tight_button.config(state="normal")

    def select_all(self):
        for poly in self.img_cnv.polygons:
            poly.select_polygon()

    def deselect_all(self):
        self.hide_type()
        for poly in self.img_cnv.polygons:
            poly.deselect_poly()

    def delete_all(self):
        result = messagebox.askyesno("Confirm Delete All",
                                     "Delete All Annotations?")
        if not result:
            return
        self.select_all()
        self.delete_selected()
        #self.img_cnv.polygons_mutex.acquire()
        #for poly in self.img_cnv.polygons:
        #    poly.delete_self()
        #self.img_cnv.polygons_mutex.release()

    def save_type(self):
        selected_option = self.variable.get()
        self.img_cnv.polygons_mutex.acquire()
        for poly in self.img_cnv.polygons:
            if poly.select_poly == True:
                if selected_option == "None":
                    poly.poly_type = None
                else:
                    poly.poly_type = selected_option
                #poly.unshow_type()
                #poly.show_type()
        self.img_cnv.polygons_mutex.release()
        self.variable.set(self.type_choices[0])
        #self.deselect_all()

    def load_new_img(self):
        self.canvas.delete('all')
        self.img_cnv = None
        path = os.path.join(self.image_dir, self.image_name)
        self.img_cnv = ImageOnCanvas(self.root, self.canvas, path)
        logger("LOADED: " + self.img_cnv.image_path)

    def load_directory(self):
        while True:
            selection = filedialog.askdirectory()
            if selection == () or selection == '':
                return
            self.root.directory = selection
            self.image_dir = self.root.directory
            file_names = os.listdir(self.image_dir)
            self.images_in_dir = []
            self.curr_idx = None
            self.image_name = None
            for name in file_names:
                if name.split('.')[-1] in self.supported_formats:
                    self.images_in_dir.append(name)
            if len(self.images_in_dir) == 0:
                self.pop_up("No supported images in the selected directory")
            else:
                break
        self.show_buttons()
        self.next_img()

    def pop_up(self, text):
        top = Toplevel()
        top.title("ERROR")
        msg = Message(top, text=text)
        msg.pack()
        button = Button(top, text="Dismiss", command=top.destroy)
        button.pack()

    def next_img(self):
        if self.curr_idx == None:
            self.curr_idx = -1
        self.curr_idx = self.curr_idx + 1
        if self.curr_idx >= len(self.images_in_dir):
            self.pop_up("Done with Images in this directory")
            self.curr_idx = self.curr_idx - 1
            return
        if self.curr_idx > 0:
            self.prev_img_button.config(state="normal")
        self.image_name = self.images_in_dir[self.curr_idx]
        self.load_new_img()
        self.root.title("Form Labeller - " + self.image_name + "(" +
                        str(self.curr_idx + 1) + "/" +
                        str(len(self.images_in_dir)) + ")")

    def previous_img(self):
        if self.curr_idx == 1:
            self.curr_idx = -1
            self.prev_img_button.config(state=tk.DISABLED)
        else:
            self.curr_idx = self.curr_idx - 2
        self.next_img()

    def delete_selected(self):
        to_be_deleted = []
        for i, poly in enumerate(self.img_cnv.polygons):
            if poly.select_poly == True:
                poly.delete_self()
                to_be_deleted.append(i)
        j = 0
        for idx in to_be_deleted:
            self.img_cnv.polygons.pop(idx - j)
            self.img_cnv.bbs.pop(idx - j)
            self.img_cnv.poly_type.pop(idx - j)
            j = j + 1

    def start_gui(self):
        self.root.mainloop()

    def saver(self):
        logger("Saving: " + self.img_cnv.image_path)
        self.save_image_button.config(state=tk.DISABLED)
        self.img_cnv.save_json(self.root.directory)
        self.save_image_button.config(state="normal")

    def draw_poly_func(self):
        self.deselect_all()
        self.img_cnv.drawing_polygon = True
        self.draw_poly_button.grid_forget()
        self.save_poly_button.grid(row=DRAW_POLY_ROW,
                                   column=0,
                                   sticky=tk.W + tk.E)
        self.discard_poly_button.grid(row=DRAW_POLY_ROW,
                                      column=1,
                                      sticky=tk.W + tk.E)
        self.hide_buttons()
        self.draw_rect_button.config(state=tk.DISABLED)
        self.drawing_obj = DrawPoly(self.bottom_frame, self.canvas,
                                    self.img_cnv, RADIUS)

    def draw_rect_func(self):
        self.deselect_all()
        self.img_cnv.drawing_polygon = True
        self.draw_rect_button.grid_forget()
        self.save_rect_button.grid(row=DRAW_RECT_ROW,
                                   column=0,
                                   sticky=tk.W + tk.E)
        self.discard_rect_button.grid(row=DRAW_RECT_ROW,
                                      column=1,
                                      sticky=tk.W + tk.E)
        self.hide_buttons()
        self.draw_poly_button.config(state=tk.DISABLED)
        self.drawing_obj = DrawRect(self.bottom_frame, self.canvas,
                                    self.img_cnv, RADIUS)

    def save_drawing(self):
        self.show_buttons()
        self.img_cnv.drawing_polygon = False
        new_poly_pts = self.drawing_obj.pt_coords
        print("Trying to save polygon with pts:", str(new_poly_pts))
        for pt in self.drawing_obj.points:
            self.canvas.delete(pt)
        if self.img_cnv.scale_factor != None:
            for i in range(len(new_poly_pts)):
                for j in range(2):
                    new_poly_pts[i][
                        j] = new_poly_pts[i][j] / self.img_cnv.scale_factor
        self.img_cnv.add_poly(new_poly_pts)
        #self.img_cnv.bbs.append(new_poly_pts)
        #self.img_cnv.draw_bbs([self.img_cnv.bbs[-1]])
        #debug (1, str(type(self.drawing_obj)))
        if isinstance(self.drawing_obj, DrawRect):
            self.save_rect_button.grid_forget()
            self.discard_rect_button.grid_forget()
            self.draw_rect_button.grid(row=DRAW_RECT_ROW,
                                       columnspan=2,
                                       sticky=tk.W + tk.E)
        elif isinstance(self.drawing_obj, DrawPoly):
            self.save_poly_button.grid_forget()
            self.discard_poly_button.grid_forget()
            self.draw_poly_button.grid(row=DRAW_POLY_ROW,
                                       columnspan=2,
                                       sticky=tk.W + tk.E)
        self.drawing_obj.delete_self()
        self.drawing_obj = None

    def discard_drawing(self):
        self.show_buttons()
        self.img_cnv.drawing_polygon = False
        #for pt in self.drawing_obj.points:
        #    self.canvas.delete(pt)
        self.drawing_obj.delete_self()
        if isinstance(self.drawing_obj, DrawRect):
            self.save_rect_button.grid_forget()
            self.discard_rect_button.grid_forget()
            self.draw_rect_button.grid(row=DRAW_RECT_ROW,
                                       columnspan=2,
                                       sticky=tk.W + tk.E)
        elif isinstance(self.drawing_obj, DrawPoly):
            self.save_poly_button.grid_forget()
            self.discard_poly_button.grid_forget()
            self.draw_poly_button.grid(row=DRAW_POLY_ROW,
                                       columnspan=2,
                                       sticky=tk.W + tk.E)
        self.drawing_obj = None

    def make_tight(self):
        self.hide_buttons()
        self.tight_box_obj = TightBox(self.root, self.img_cnv,
                                      self.threshold_scale.get())
        self.tight_box_obj.tight_box()
        self.make_tight_button.grid_forget()
        self.tight_save_button.grid(row=MAKE_TIGHT_ROW,
                                    column=0,
                                    columnspan=1,
                                    sticky=tk.W + tk.E)
        self.tight_discard_button.grid(row=MAKE_TIGHT_ROW,
                                       column=1,
                                       columnspan=1,
                                       sticky=tk.W + tk.E)
コード例 #3
0
class DebugXlsTab(XlsTab):
    def __init__(self, basis):
        super().__init__(basis)
        self.colCombiner = ColumnCombiner(self)
        self.colDeleter = ColumnDeleter(self)
        self.replacerInSpSh = ReplacerInSpSh(self)
        self.path = ''
        self.flag = False

        self.btnSave = Button(
            self.frmFile, command=self.saveFile, text='Сохранить')
        self.btnClose = Button(
            self.frmFile, command=self.closeFile, text='Закрыть')
        [w.grid(row=0, column=i, sticky='w', **self.grd.pdSt)
            for i, w in enumerate((
                self.btnOpen, self.btnSave, self.btnClose, self.lblPath))]

        lblCheckArea = Label(
            self.frmOptions, text='Область проверки:')
        lblCheckType = Label(
            self.frmOptions, text='Тип проверки:')
        lblColumn = Label(
            self.frmOptions, text='Колонка: ')
        lblSymbRange = Label(
            self.frmOptions, text='Фрагмент строк: ')
        self.lblLimit = Label(
            self.frmOptions, text='Мин. совпадений: ')
        lblIgnNum = Label(
            self.frmOptions, text='Игнорировать числа: ')
        lblIgnWrd = Label(
            self.frmOptions, text='Игнорировать сочетания: ')
        self.cmbCheckArea = Combobox(
            values=(
                'Колонка электронной таблицы',
                'Колонка ЭТ и наименования в БД',
                'Колонка ЭТ и изготовители в БД'),
            **self.argOptionReadonly)
        self.cmbCheckType = Combobox(
            values=(
                'Сравнение по словам',
                'Поиск слов в строке',
                'По-символьное сравнение'),
            **self.argOptionReadonly)
        self.cmbColumn = Combobox(**self.argOptionReadonly)
        self.entSymbStart = Entry(**self.argOptionInteger)
        self.entSymbFinish = Entry(**self.argOptionInteger)
        self.entLimit = Entry(**self.argOptionInteger)
        self.cmbIgnNum = Combobox(
            values=('Да', 'Нет'), **self.argOptionReadonly)

        frmIgnWrd = Frame(self.frmOptions)
        frmIgnWrd.grid_columnconfigure(0, weight=1)
        self.txtIgnWrd = Text(frmIgnWrd, width=35, height=5, wrap=WORD)
        scrIgnWrd = Scrollbar(frmIgnWrd)
        scrIgnWrd['command'] = self.txtIgnWrd.yview
        self.txtIgnWrd['yscrollcommand'] = scrIgnWrd.set
        self.txtIgnWrd.grid(row=0, column=0, sticky='w, e')
        scrIgnWrd.grid(row=0, column=1, sticky='n, s')

        self.btnCheck = Button(
            self.frmOptions,
            text='Начать проверку',
            command=self.check)
        self.btnShow = Button(
            self.frmOptions,
            text='Вернуться к просмотру таблицы',
            command=self.selectData)

        [w.grid(row=i, **self.grd.cl0_sp3_pdSt_stWE) for i, w in enumerate(
            (lblCheckArea, self.cmbCheckArea, lblCheckType, self.cmbCheckType),
            start=2)]
        [w.grid(row=i, **self.grd.cl0_pdSt_stW) for i, w in enumerate((
            lblColumn, lblSymbRange, self.lblLimit, lblIgnNum), start=6)]
        self.cmbColumn.grid(row=6, **self.grd.cl1_sp2_pdSt_stWE)
        self.entSymbStart.grid(row=7, sticky='w, e', **self.grd.cl1_pdSt)
        self.entSymbFinish.grid(
            row=7, column=2, sticky='w, e', **self.grd.pdSt)
        self.entLimit.grid(row=8, **self.grd.cl1_sp2_pdSt_stWE)
        self.cmbIgnNum.grid(row=9, **self.grd.cl1_sp2_pdSt_stWE)
        [w.grid(row=i, **self.grd.cl0_sp3_pdSt_stWE) for i, w in enumerate((
            lblIgnWrd, frmIgnWrd, self.btnCheck), start=10)]

        self.cmbCheckType.bind('<<ComboboxSelected>>', self.selectCheckType)

        self.frmEdit = Frame(self.frmView)
        self.frmEdit.grid_columnconfigure(0, weight=1)
        self.frmEdit.grid_columnconfigure(2, weight=1)
        self.btnUniteCols = Button(
            self.frmEdit,
            text='Объединить колонки по шаблону',
            command=self.colCombiner.fillAndShow)
        self.btnDelCol = Button(
            self.frmEdit,
            text='Удалить колонку',
            command=self.colDeleter.fillAndShow)
        self.btnDelRow = Button(
            self.frmEdit, text='Удалить строку', command=self.deleteRow)
        self.btnReplaceInSpSh = Button(
            self.frmEdit,
            text='Заменить выбранные варианты в электронной таблице',
            command=self.replacerInSpSh.fillAndShow)
        self.btnReplaceFromDB = Button(
            self.frmEdit,
            text='Заменить выбранный вариант в ЭТ на вариант из БД',
            command=self.replaceFromDB)

        self.frmEdit.grid(row=2, sticky='n, e, s, w', **self.grd.cl0_pdSt)
        self.frmTab.pack()

    def saveFile(self):
        self.path = asksaveasfilename(
            defaultextension='.xls',
            filetypes=[('Microsoft Excel 97/2003', '.xls')])
        if self.path:
            book = Workbook(encoding='cp1251')
            sheets = []
            for sheetID in range(len(self.xlsData)):
                sheets.append(book.add_sheet('Sheet' + str(sheetID)))
                lenRows = len(self.xlsData[sheetID])
                for rowID in range(lenRows):
                    lenCols = len(self.xlsData[sheetID][rowID])
                    for colID in range(lenCols):
                        sheets[sheetID].write(
                            r=rowID,
                            c=colID,
                            label=self.xlsData[sheetID][rowID][colID])
            book.save(self.path)
            book, sheets = None, None
            collect()

    def selectCheckType(self, event):
        if self.cmbCheckType.get() == 'По-символьное сравнение':
            self.lblLimit['text'] = 'Макс. отличий: '
        else:
            self.lblLimit['text'] = 'Мин. совпадений: '

    def selectData(self, event=None):
        self.resetOptions()
        self.resetView()
        self.sheetID = self.trn.getNatMnsOrZero(self.cmbSheet.get())
        if self.xlsData and len(self.xlsData[self.sheetID]):
            self.getScope()
            self.tv.heading('#0', text='Строка')
            self.tv.column('#0', minwidth=50, stretch=True, width=75)
            self.tv['columns'] = [
                colname(colID) for colID in range(
                    self.colStart, self.colFinish + 1)]
            for rowID in range(self.rowStart, self.rowFinish + 1):
                tag = str(rowID)
                self.tv.insert(parent='', index='end', iid=tag, text=rowID + 1)
                for valueID, colID in enumerate(range(self.colStart, self.colFinish + 1)):
                    colName = colname(colID)
                    self.tv.heading(colName, text=colName)
                    self.tv.column(colName, minwidth=50, stretch=True, width=150)
                    cell = self.xlsData[self.sheetID][rowID][colID]
                    self.tv.set(tag, valueID, cell)
            self.cmbColumn['values'] = [
                colname(colID) for colID in range(
                    self.colStart, self.colFinish + 1)]
            [b.grid(row=0, column=i, **self.grd.pdSt) for i, b in enumerate((
                self.btnUniteCols, self.btnDelCol, self.btnDelRow))]

    def combineColumns(self):
        idColA = self.colCombiner.idColA
        idColB = self.colCombiner.idColB
        strBfr = self.colCombiner.strBefore
        strMdl = self.colCombiner.strMiddle
        strAft = self.colCombiner.strAfter
        if idColA != idColB:
            for row in self.xlsData[self.sheetID]:
                strColA, strColB = str(row[idColA]), str(row.pop(idColB))
                row[idColA] = '%s%s%s%s%s' % (
                    strBfr, strColA, strMdl, strColB, strAft)
            self.colFinish -= 1
            self.selectData()
            self.colCombiner.hide()
            self.colCombiner.clear()

    def deleteColumn(self):
        idColumn = self.getColID(self.colDeleter.cmbColumn.get())
        if idColumn >= 0:
            for row in self.xlsData[self.sheetID]:
                row.pop(idColumn)
            self.selectData()
            self.colDeleter.hide()
            self.colDeleter.clear()

    def deleteRow(self):
        if self.tv.selection():
            slcTag = self.tv.selection()[0]
            for rowID in range(self.rowStart, self.rowFinish + 1):
                if rowID == int(slcTag):
                    self.xlsData[self.sheetID].pop(rowID)
                    break
            self.tv.delete(slcTag)

    def check(self):
        def coincidenceFlag(count, limit):
            if count >= limit and count >= 1:
                return(True)
            else:
                return(False)

        def distanceFlag(count, limit):
            if count <= limit:
                return(True)
            else:
                return(False)

        if self.flag is False and self.path:
            self.flag = True
            self.btnCheck['text'] = 'Прервать проверку'
            checkArea = self.cmbCheckArea.get()
            checkType = self.cmbCheckType.get()
            self.checkColumn = self.getColID(self.cmbColumn.get())
            self.symbStart = self.trn.getNatMnsOrZero(self.entSymbStart.get())
            self.symbFinish = self.trn.getNatOrNone(self.entSymbFinish.get())
            self.ignNum = self.trn.getBoolean(self.cmbIgnNum.get())
            self.ignWrd = self.trn.getWrdList(self.txtIgnWrd.get('1.0', END))
            self.limit = self.trn.getNatOrZero(self.entLimit.get())
            '''Отсев повторных'''
            self.columnSpSh = []
            length = len(self.xlsData[self.sheetID][self.rowStart:self.rowFinish])
            strLen = str(length)
            self.prgProgress['maximum'] = length
            for index, row in enumerate(self.xlsData[self.sheetID][self.rowStart:self.rowFinish]):
                if row[self.checkColumn] not in self.columnSpSh:
                    self.columnSpSh.append(row[self.checkColumn])
                self.progress('Отсев повторяющихся строк', index, strLen)
            self.prgProgress['value'] = 0
            self.resetView()
            '''Настройка таблицы'''
            self.tv['columns'] = ['value_A', 'value_B']
            self.tv.column('#0', anchor='e', minwidth=75, stretch=True, width=100)
            self.tv.column('value_A', minwidth=150, stretch=True, width=300)
            self.tv.column('value_B', minwidth=150, stretch=True, width=300)            
            if checkArea == 'Колонка электронной таблицы' or '':
                self.tv.heading('value_A', text='Значение 1')
                self.tv.heading('value_B', text='Значение 2')
            else:
                self.tv.heading('value_A', text='Значение ЭТ')
                self.tv.heading('value_B', text='Значение БД')
            if checkType == 'По-символьное сравнение':
                self.tv.heading('#0', text='Отличий')
            else:
                self.tv.heading('#0', text='Совпадений')
            '''Проверка'''
            result, length = [], len(self.columnSpSh)
            strLen, index = str(length), 0
            self.prgProgress['maximum'] = length
            checkArg = {
                'limit': self.limit,
                'result': result,
                'length': length,
                'strLen': strLen,
                'index': index}
            if checkArea == 'Колонка электронной таблицы' or '':
                self.btnReplaceFromDB.grid_forget()
                if checkType == 'По-символьное сравнение':
                    result = self.checkInSpSh(
                        function=self.getDistance,
                        checkCount=distanceFlag,
                        **checkArg)
                elif checkType == 'Поиск слов в строке':
                    result = self.checkInSpSh(
                        function=self.getCoincidenceWS,
                        checkCount=coincidenceFlag,
                        **checkArg)
                else:
                    result = self.checkInSpSh(
                        function=self.getCoincidenceWW,
                        checkCount=coincidenceFlag,
                        **checkArg)
            else:
                self.btnReplaceInSpSh.grid_forget()
                self.columnDB = []
                if checkArea == 'Колонка ЭТ и наименования в БД':
                    for rec in self.db.data['item_list']:
                        self.columnDB.append(rec['name'])
                elif checkArea == 'Колонка ЭТ и изготовители в БД':
                    for rec in self.db.data['manufacturer_list']:
                        self.columnDB.append(rec['name'])
                if checkType == 'По-символьное сравнение':
                    result = self.checkInDtBs(
                        function=self.getDistance,
                        checkCount=self.distanceFlag,
                        **checkArg)
                elif checkType == 'Поиск слов в строке':
                    result = self.checkInDtBs(
                        function=self.getCoincidenceWS,
                        checkCount=self.coincidenceFlag,
                        **checkArg)
                else:
                    result = self.checkInDtBs(
                        function=self.getCoincidenceWW,
                        checkCount=self.coincidenceFlag,
                        **checkArg)
            '''Сортировка результата'''
            if result:
                if checkType == 'По-символьное сравнение':
                    result.sort(key=lambda e: e[0])
                else:
                    result.sort(key=lambda e: e[0], reverse=True)
            '''Вывод'''
            length = len(result)
            strLen, index = str(length), 0
            self.prgProgress['maximum'] = length
            while self.flag is True and index < length:
                self.tv.insert(
                    '', index,
                    iid=str(index),
                    text=result[index][0],
                    value=[result[index][1], result[index][2]])
                index += 1
                self.progress('Вывод строк', index, strLen)
            self.btnShow.grid(row=13, **self.grd.cl0_sp3_pdSt_stWE)
            '''Кнопка замены'''
            if checkArea == 'Колонка электронной таблицы' or '':
                self.btnReplaceInSpSh.grid(row=0, **self.grd.cl1_pdSt)
            else:
                self.btnReplaceFromDB.grid(row=0, **self.grd.cl1_pdSt)
            '''Проверка прерывания'''
            if self.flag is True:
                self.progress('Проверка завершена', index, strLen)
                self.btnCheck['text'] = 'Начать проверку'
                self.flag = False
            else:
                self.lblProgress['text'] = 'Проверка прервана.'
            collect()
        else:
            self.flag = False
            self.btnCheck['text'] = 'Начать проверку'

    def checkInSpSh(self, function, checkCount, limit, result, length, strLen, index):
        while self.flag is True and index < length:
            cellA = self.columnSpSh[index]
            for cellB in self.columnSpSh[index:length]:
                self.checkTemplate(cellA, cellB, function, checkCount, limit, result)
            index += 1
            self.progress('Сравнение строк', index, strLen)
        self.prgProgress['value'] = 0
        return(result)

    def checkInDtBs(self, function, checkCount, limit, result, length, strLen, index):
        while self.flag is True and index < length:
            cellA = self.columnSpSh[index]
            for cellB in self.columnDB:
                self.checkTemplate(cellA, cellB, function, checkCount, limit, result)
            index += 1
            self.progress('Сравнение строк', index, strLen)
        self.prgProgress['value'] = 0
        return(result)

    def checkTemplate(self, cellA, cellB, function, checkCount, limit, result):
        str1, str2 = str(cellA), str(cellB)
        if self.ignNum is True:
            str1, str2 = self.deleteNumbers(str1), self.deleteNumbers(str2)
        if str1 != str2:
            if self.ignWrd:
                str1, str2 = self.replaceWord(str1), self.replaceWord(str2)
            if self.symbStart != 0 or self.symbFinish is not None:
                str1 = str1[self.symbStart:self.symbFinish]
                str2 = str2[self.symbStart:self.symbFinish]
            count = function(str1, str2)
            var1, var2 = [count, cellA, cellB], [count, cellB, cellA]
            if (checkCount(count, limit) and
                var1 not in result and
                    var2 not in result):
                result.append(var1)

    def deleteNumbers(self, string):
        symbolList, index = list(string), 0
        while index < len(symbolList):
            if symbolList[index].isdigit():
                symbolList.pop(index)
            else:
                index += 1
        return(''.join(symbolList))

    def replaceWord(self, string):
        string = string.lower()
        for word in self.ignWrd:
            word = word.lower()
            while string.find(word) != -1:
                string = string.replace(word, '')
        return(string)

    def getCoincidenceWW(self, s1, s2):
        wordListA = self.trn.getWrdList(s1)
        wordListB = self.trn.getWrdList(s2)
        count = 0
        for word in wordListA:
            if len(word) >= 3 and word in wordListB:
                count += 1
        return(count)

    def getCoincidenceWS(self, s1, s2):
        wordList, count = self.trn.getWrdList(s1), 0
        for word in wordList:
            if len(word) >= 3 and word in s2:
                count += 1
        return(count)

    def getDistance(self, s1, s2):
        d, lenstr1, lenstr2 = {}, len(s1), len(s2)
        for i in range(-1, lenstr1 + 1):
            d[(i, -1)] = i + 1
        for j in range(-1, lenstr2 + 1):
            d[(-1, j)] = j + 1
        for i in range(lenstr1):
            for j in range(lenstr2):
                if s1[i] == s2[j]:
                    cost = 0
                else:
                    cost = 1
                d[(i, j)] = min(
                    d[(i - 1, j)] + 1,
                    d[(i, j - 1)] + 1,
                    d[(i - 1, j - 1)] + cost)
                if i and j and s1[i] == s2[j - 1] and s1[i - 1] == s2[j]:
                    d[(i, j)] = min(d[(i, j)], d[i - 2, j - 2] + cost)
        return(d[lenstr1 - 1, lenstr2 - 1])

    def replaceInSpSh(self):
        varA = self.replacerInSpSh.lblVarA['text']
        varB = self.replacerInSpSh.lblVarB['text']
        varC = self.replacerInSpSh.txtVarC.get(1.0, END)
        varC = varC.replace('\n', ' ')
        varC = varC.strip()
        for row in self.xlsData[self.sheetID][self.rowStart:self.rowFinish]:
            if row[self.checkColumn] == varA or row[self.checkColumn] == varB:
                row[self.checkColumn] = varC
        tags = self.tv.get_children()
        for tag in tags:
            values = self.tv.item(tag)['values']
            if values[0] == varA or values[0] == varB:
                self.tv.set(tag, 0, varC)
                self.tv.item(tag, text='?')
            if values[1] == varA or values[1] == varB:
                self.tv.set(tag, 1, varC)
                self.tv.item(tag, text='?')
        self.replacerInSpSh.hide()
        self.replacerInSpSh.clear()

    def replaceFromDB(self):
        slcTag = self.tv.selection()[0]
        values = self.tv.item(slcTag)['values']
        varSS = values[0]
        varDB = values[1]
        for row in self.xlsData[self.sheetID][self.rowStart:self.rowFinish]:
            if row[self.checkColumn] == varSS:
                row[self.checkColumn] = varDB
        tags = self.tv.get_children()
        for tag in tags:
            values = self.tv.item(tag)['values']
            if values[0] == varSS:
                self.tv.set(tag, 0, varDB)
                self.tv.item(tag)['text'] = '?'

    def resetOptions(self):
        self.cmbColumn.delete(0, END)
        [btn.grid_forget() for btn in [
            self.btnShow, self.btnReplaceInSpSh, self.btnReplaceFromDB]]
        self.lblProgress['text'] = ''
        self.prgProgress['value'] = 0

    def resetView(self):
        for rec in self.tv.get_children():
            self.tv.delete(rec)
        self.tv['columns'] = []
        self.tv.heading('#0', text='')
        self.tv.column('#0', stretch=True, width=self.tv.winfo_reqwidth() - 2)
        [btn.grid_forget() for btn in [
            self.btnUniteCols, self.btnDelCol, self.btnDelRow]]
コード例 #4
0
ファイル: client.py プロジェクト: KittyMcSnuggles/reddit
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        #self.style = Style()
        #self.style.theme_use("clam")
        #self.pack(fill=BOTH, expand = 1)

        self.labelU = Label(self, text="U:")
        self.labelP = Label(self, text="P:")

        self.mailrecipient = 'GoldenSights'
        
        self.entryUsername = Entry(self)
        self.entryUsername.focus_set()
        self.entryUsername.bind('<Return>', lambda event: self.entryPassword.focus_set())

        self.entryPassword = Entry(self)
        self.entryPassword.config(show='•')
        self.entryPassword.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get()))

        self.newbutton = Button(self, text="Login", command= lambda: self.login(self.entryUsername.get(), self.entryPassword.get()))
        self.newbutton.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get()))
        self.newbutton.config(width=6)
        self.quitbutton = Button(self, text="Quit", command= lambda: self.quit())
        self.quitbutton.config(width=6)
    
        self.labelU.grid(row=0, column=0,padx=0)
        self.entryUsername.grid(row=0, column=1)
        self.labelP.grid(row=1, column=0)
        self.entryPassword.grid(row=1, column=1, pady=4)
        self.newbutton.grid(row=2, column=1)
        self.quitbutton.grid(row=3, column=1, pady=4)

        self.labelErrorPointer = Label(self, text="◀")

        self.indicatorGreen = PhotoImage(file="indicatorGreen.gif")
        self.indicatorRed = PhotoImage(file="indicatorRed.gif")
        self.indicatorBlue = PhotoImage(file="indicatorBlue.gif")
        self.indicatorBlack = PhotoImage(file="indicatorBlack.gif")
        

        
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()


        w=400
        h=480
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50))
        

    def login(self, username, password):
        print('U: ' + username)
        self.username = username
        if username == '' or not all(char in string.ascii_letters+string.digits+'_-' for char in username):
            print('Please enter a username')
            self.entryUsername.focus_set()
            self.labelErrorPointer.grid(row=0, column=2)
        elif password == '':
            print('Please enter a password')
            self.entryPassword.focus_set()
            self.labelErrorPointer.grid(row=1, column=2)
            
        else:
            self.labelErrorPointer.grid_forget()
            print('Attempting login for ' + username)
            try:
                self.USERAGENT = username + ' practices Tkinter+PRAW mixing with utility by /u/GoldenSights.'
                self.r = praw.Reddit(self.USERAGENT)
                #self.r.login(username, password)
                print('Success')
                self.labelU.grid_forget()
                self.labelP.grid_forget()
                self.entryUsername.grid_forget()
                self.entryPassword.grid_forget()
                self.newbutton.grid_forget()
                self.quitbutton.grid_forget()
                self.usernamelabel = Label(self, text=username + ', Sending to /u/' + self.mailrecipient)
                self.usernamelabel.grid(row=0, column=0, columnspan=8)
                self.quitbutton.grid(row=900, column=0)


                self.labellist = []
                self.entrylist = []
                self.verifylist = []
                self.misclist = []
                
                self.optionDiscuss = "Discussion Flair + Crossposting"
                self.optionRegister = "Register a new Candidate"

                self.prevmode = self.optionDiscuss
                self.curmode = self.optionDiscuss
                self.optionvar = tkinter.StringVar(self)
                self.optionvar.trace("w",self.permaloop)
                self.optionvar.set(self.optionDiscuss)
                self.option = OptionMenu(self, self.optionvar, self.optionDiscuss, self.optionRegister, "three", "four")
                self.newbutton.unbind("<Return>")
                self.entryUsername.unbind("<Return>")
                self.entryPassword.unbind("<Return>")
                self.option.grid(row=1,column=0,columnspan=8,pady=8)
                self.updategui(True)
            except praw.errors.InvalidUserPass:
                pass
                print('Invalid username or password')
                self.entryPassword.delete(0,200)
                self.labelErrorPointer.grid(row=1, column=2)

    def permaloop(self, *args):
        self.curmode = self.optionvar.get()
        print('Was: ' + self.prevmode + ' | Now: ' + self.curmode)
        if self.curmode != self.prevmode:
            self.prevmode = self.curmode
            self.updategui(True)

    def updategui(self, *args):
        if args[0] == True:
            print('Cleaning GUI')
            for item in self.labellist:
                item.grid_forget()
            for item in self.entrylist:
                item.grid_forget()
            for item in self.verifylist:
                item.grid_forget()
            for item in self.misclist:
                item.grid_forget()
            self.labellist = []
            self.entrylist = []
            self.verifylist = []
            self.misclist = []


            if self.curmode == self.optionDiscuss:
                self.newrowindex = 4
                self.labelPermalink = Label(self, text="Thread Permalink:")
                self.entryPermalink = Entry(self)
                self.rowconfigure(2,weight=2)
                self.labelPermalink.grid(row=2,column=0)
                self.entryPermalink.grid(row=2,column=1)
                self.labelcrossposting = Label(self,text="Crosspost to:")
                self.labelcrossposting.grid(row=3,column=0,columnspan=2,sticky="w")

                for m in range(5):
                    self.redditlabel = Label(self,text="/r/")
                    self.redditlabel.grid(row=self.newrowindex,column=0, sticky="e")
                    self.labellist.append(self.redditlabel)

                    self.redditentry = Entry(self)
                    self.redditentry.grid(row=self.newrowindex,column=1)
                    self.entrylist.append(self.redditentry)

                    self.newrowindex +=1

                self.morerowbutton = Button(self,text="+row",command=lambda: self.morerows('/r/', 0, 1, 20))
                self.morerowbutton.grid(row=898,column=0,columnspan=2)

                self.verifybutton = Button(self,text="Verify",command= lambda: self.updategui(False))
                self.verifybutton.grid(row=899,column=0,columnspan=2)

                self.newrowindex += 2

                self.misclist.append(self.labelPermalink)
                self.misclist.append(self.labelcrossposting)
                self.misclist.append(self.entryPermalink)
                self.misclist.append(self.morerowbutton)
                self.misclist.append(self.verifybutton)

            if self.curmode == self.optionRegister:
                self.newrowindex = 6
                self.labelCanUsername = Label(self, text="Candidate's Username:  /u/")
                self.entryCanUsername = Entry(self)
                self.labelCanRealname = Label(self, text="Candidate's Realname:")
                self.entryCanRealname = Entry(self)
                self.labelCanFlair = Label(self, text="Candidate's Flair:")
                self.entryCanFlair = Entry(self)
                self.entryMo = Spinbox(self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'))
                self.entryDa = Spinbox(self, width=2, from_=1, to=31)
                self.entryYr = Spinbox(self, width=4, from_=2014, to=2500)
                self.labelHH = Label(self, text="Schedule time UTC:")
                self.entryHH = Spinbox(self, from_=0, to=23, width=2)
                self.entryMM = Spinbox(self, from_=0, to=59, width=2)
                self.entryYr.delete(0,'end')
                self.entryYr.insert(0,2014)

                self.morerowbutton = Button(self,text="+question",command=lambda: self.morerows('Q:', 0, 1, 25))
                self.morerowbutton.grid(row=898,column=0,columnspan=8)

                self.verifybutton = Button(self,text="Verify",command= lambda: self.updategui(False))
                self.verifybutton.grid(row=899,column=0,columnspan=8)

                self.misclist.append(self.labelCanUsername)
                self.misclist.append(self.labelCanRealname)
                self.misclist.append(self.entryCanUsername)
                self.misclist.append(self.entryCanRealname)
                self.misclist.append(self.labelHH)
                self.misclist.append(self.entryHH)
                self.misclist.append(self.entryMM)
                self.misclist.append(self.entryMo)
                self.misclist.append(self.entryDa)
                self.misclist.append(self.entryYr)

                self.labelCanUsername.grid(row=2, column=0, sticky="e")
                self.labelCanRealname.grid(row=3, column=0, sticky="e")
                self.entryCanUsername.grid(row=2, column=1, columnspan=3)
                self.entryCanRealname.grid(row=3, column=1, columnspan=3)
                self.entryMo.grid(row=4, column=1,sticky="e")
                self.entryDa.grid(row=4, column=2)
                self.entryYr.grid(row=4, column=3)
                self.labelHH.grid(row=4, column=0, sticky="se", pady=5)
                self.entryHH.grid(row=5, column=1, sticky="e")
                self.entryMM.grid(row=5, column=2, sticky="w")
        else:
            if self.curmode == self.optionDiscuss:

                verifies = []

                i = self.entryPermalink.get()
                if len(i) == 6:
                    pid = i
                else:
                    if 'www.reddit.com/r/' in i and '/comments/' in i:
                        pid = i.split('/comments/')[1].split('/')[0]
                    if 'http://redd.it/' in i:
                        pid = i.split('redd.it/')[1]

                for flag in self.verifylist:
                    flag.grid_forget()
                    self.verifylist.remove(flag)

                try:
                    print('Fetching Submission ' + pid)
                    self.r.get_info(thing_id="t3_" + pid).title + 'Check'
                    self.redditlabel = Label(self, image=self.indicatorGreen)
                    self.redditlabel.grid(row=2,column=2)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(True)
                    print('\tSuccess')
                except:
                    print('Failed. Make sure to include the http://. Copy and paste straight from your browser for best result')
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=2,column=2)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)

                for entry in self.entrylist:
                    i = entry.get()
                    if i != '':
                        print('Fetching /r/' + i)
                        if all(char in string.ascii_letters+string.digits+'_-' for char in i):
                            try:
                                sub = self.r.get_subreddit(i,fetch=True)
                                self.redditlabel = Label(self, image=self.indicatorGreen)
                                self.redditlabel.grid(row=entry.grid_info()['row'],column=2)
                                self.verifylist.append(self.redditlabel)
                                verifies.append(True)
                                print('\tSuccess')
                            except:
                                self.redditlabel = Label(self, image=self.indicatorRed)
                                self.redditlabel.grid(row=entry.grid_info()['row'],column=2)
                                self.verifylist.append(self.redditlabel)
                                verifies.append(False)
                                print('\tFailed')
                            time.sleep(2)
                        else:
                            self.redditlabel = Label(self, image=self.indicatorRed)
                            self.redditlabel.grid(row=entry.grid_info()['row'],column=2)
                            self.verifylist.append(self.redditlabel)
                            verifies.append(False)
                            print('\tFailed')

                print(verifies)


            if self.curmode == self.optionRegister:

                verifies = []
                u=self.entryCanUsername.get()
                print('Fetching /u/' + u)
                if not all(char in string.ascii_letters+string.digits+'_-' for char in u):
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=2, column=4)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)
                    print('\tBad characterage')
                else:
                    try:
                        u = self.r.get_redditor(u)
                        print(u)
                        self.redditlabel = Label(self, image=self.indicatorGreen)
                        self.redditlabel.grid(row=2,column=4)
                        self.verifylist.append(self.redditlabel)
                        verifies.append(True)
                        print('\tSuccess')
                    except:
                        self.redditlabel = Label(self, image=self.indicatorRed)
                        self.redditlabel.grid(row=2,column=4)
                        self.verifylist.append(self.redditlabel)
                        verifies.append(False)
                        print('\tFailed')

                try:
                    print('Checking Time')
                    t = self.entryMo.get() + ' ' + self.entryDa.get() + ' ' + self.entryYr.get() + ' ' + self.entryHH.get() + ':' + self.entryMM.get()
                    plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M")
                    plandate = datetime.datetime.utcfromtimestamp(plandate.timestamp())
                    print('\t' + str(plandate.timestamp()))

                    self.redditlabel = Label(self, image=self.indicatorGreen)
                    self.redditlabel.grid(row=5,column=3)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(True)
                except:
                    print('\tFailed')
                    self.redditlabel = Label(self, image=self.indicatorRed)
                    self.redditlabel.grid(row=5,column=3)
                    self.verifylist.append(self.redditlabel)
                    verifies.append(False)

                print(verifies)


    def morerows(self, label, columnm, columnn, limit, *args):
        self.redditlabel = Label(self,text=label)
        self.redditlabel.grid(row=self.newrowindex,column=columnm, sticky="e")
        self.labellist.append(self.redditlabel)

        self.redditentry = Entry(self)
        self.redditentry.grid(row=self.newrowindex,column=columnn, columnspan=8)
        self.entrylist.append(self.redditentry)

        self.newrowindex += 1
        if self.newrowindex >= limit:
            self.morerowbutton.grid_forget()
        print(self.newrowindex)
コード例 #5
0
ファイル: RetailPage.py プロジェクト: DasAnish/FinalYearProj
class retailPage(Frame):
    ''' the main page that actually branches into 2 seperate frames for buying and selling
        this frame provides the use with the
'''
    def __init__(self, parent, main, **kw):
        Frame.__init__(self, parent, **kw)
        self.main = main
        self.Head = Label(font=MED_FONT)

        self.retail_back_b = Button(text='BACK', command=self.back_fb)
        self.stock_name = StringVar()
        self.stock_name_ = ''
        self.stock_name_c = Combobox(textvariable=self.stock_name)
        self.stock_name_l = Label(text='Stock name: ')
        self.amount = Entry()
        self.amount_l = Label(text='Number of stocks :')

        self.check_avail_b = Button(text='Check')
        self.cost_l = Label(text='Cost: ')
        self.cost = Label()
        self.buy_stock_b = Button(text='BUY Stock')
        self.sellp_l = Label(text='Current Selling Price: ')
        self.profit_l = Label(text='PROFIT/LOSS')
        self.sell_stock_b = Button(text='SELL Stock')
        self.page = None

    def showItems(self, main):
        self.Head.grid(column=0, row=0, columnspan=2)
        self.Head.configure(text='logged in as %s' % main.present_user)
        if self.page == 'b':
            self.buy()
        elif self.page == 's':
            self.sell()

    def hideItems(self, main):
        self.Head.grid_forget()

    def buy(self):
        '''This function creates the buy window
'''
        self.retail_back_b.grid(column=1, row=5)
        self.retail_back_b.config(command=self.back_fb)
        self.stock_name_l.grid(column=0, row=1)
        self.stock_name_c.grid(column=1, row=1)
        self.stock_name_c.config(values=self.main.shares_dict.keys())
        self.amount_l.grid(column=0, row=2)
        self.amount.grid(column=1, row=2)
        self.check_avail_b.config(command=self.check_avail_buy)
        self.check_avail_b.grid(column=0, row=3)
        self.cost_l.grid(column=0, row=4, columnspan=2)
        self.buy_stock_b.config(command=self.buy_stock,
                                text='Buy Stock',
                                state='disabled')
        self.buy_stock_b.grid(column=0, row=5)

    def sell(self):
        '''This function creats the sell window'''
        self.retail_back_b.grid(column=1, row=6)
        self.retail_back_b.config(command=self.back_fs)
        self.check_avail_b.config(command=self.check_avail_sell)
        self.stock_name_l.grid(column=0, row=1)
        self.stock_name_c.grid(column=1, row=1)
        self.stock_name_c.config(values=self.main.shares_dict.keys())
        self.amount_l.grid(column=0, row=2)
        self.amount.grid(column=1, row=2)
        self.check_avail_b.grid(column=0, row=3)
        self.sellp_l.grid(column=0, row=4, columnspan=2)
        self.profit_l.grid(column=0, row=5, columnspan=2)
        self.sell_stock_b.config(command=self.sell_stock,
                                 state='disabled',
                                 text='Check')
        self.sell_stock_b.grid(column=0, row=6)

    def back_fb(self):
        '''Back from buy i.e. removes all the items needed to make buy'''
        self.retail_back_b.grid_forget()
        self.Head.grid(column=0, row=0, columnspan=2)
        self.stock_name_l.grid_forget()
        self.stock_name_c.grid_forget()
        self.amount_l.grid_forget()
        self.amount.grid_forget()
        self.check_avail_b.grid_forget()
        self.cost_l.grid_forget()
        self.buy_stock_b.grid_forget()
        self.buy_stock_b.config(state='disabled')

        self.main.show_frame(VIEW_STOCK, RETAIL_PAGE)
        self.stock_name.set('')
        self.amount.delete(0, END)

    def back_fs(self):
        ''' Back from sell i.e. removes all the items needed to make it sell window'''
        self.Head.grid(column=0, row=0, columnspan=2)
        self.retail_back_b.grid_forget()
        self.check_avail_b.grid_forget()
        self.stock_name_l.grid_forget()
        self.stock_name_c.grid_forget()
        self.amount_l.grid_forget()
        self.amount.grid_forget()
        self.sellp_l.grid_forget()
        self.profit_l.grid_forget()
        self.sell_stock_b.grid_forget()

        self.main.show_frame(VIEW_STOCK, RETAIL_PAGE)
        self.stock_name.set('')
        self.amount.delete(0, END)
        self.check_avail_b.grid_forget()

    def check_avail_buy(self):
        ''' Performs a check whether the number of shares requisted are available or not and then check whether the
            person has the required amounts of fund or not for the transaction to go through'''
        name = self.stock_name.get()
        l2 = self.main.accounts[self.main.present_user]

        if name in self.main.shares_dict.keys():
            li = self.main.shares_dict[name]
        else:
            self.stock_name.delete(0, END)
            showinfo(meassage='Enter a Valid Stock name')

        available_num = int(li['tot_amount']) - int(li['tot_sold'])
        req = int(self.amount.get())
        cost = req * int(li['cost'])

        if req < 0:
            showinfo(message='Enter a Valid amount')
        elif req > available_num:
            showinfo(message='Enter an amount less than ' + str(available_num))
        elif cost > int(l2['balance']):
            showinfo(message='You have only %s in you account' % l2['balance'])
        else:
            self.cost_l.config(text='Cost: \t' + li['cost'] + '*' + str(req) +
                               '=' + str(cost))
            self.buy_stock_b.config(state='normal')

    def check_avail_sell(self):
        ''' Performs a check whether the user has enough stocks to sell'''
        name = self.stock_name.get()
        if name in self.main.shares_dict.keys():
            li = self.main.shares_dict[name]
        else:
            self.stock_name.delete(0, END)
            showinfo(message='Enter a Valid Stock name')
        req = int(self.amount.get())
        if req < 0:
            showinfo(message='Please Enter a Valid amount')
            self.amount.delete(0, END)
        li = self.main.p_user_dict
        ok = False
        for i in li:
            if name == i['name']:
                ok = True
                buff = i

        if req > int(buff['tot_owned']):
            showinfo(message='You dont have that many stocks try less than ' +
                     buff['tot_owned'])
            self.amount.delete(0, END)
        cost = self.main.shares_dict[name]['cost']
        tot_cost = req * int(cost)
        try:
            spent = req * float(buff['money_spent']) / int(buff['tot_owned'])
        except:
            spent = 0
        pol = tot_cost - spent

        if pol >= 0:
            self.profit_l.config()
        elif pol < 0:
            self.profit_l.config()
        if req <= int(buff['tot_owned']):
            self.sellp_l.config(text='Current Selling Price: \t' + cost)
            self.profit_l.config(text="PROFIT-LOSS: \t" + str(pol))
            self.sell_stock_b.config(command=self.sell_stock,
                                     text='Sell Stock')
            showinfo(message=
                     'Everthing is ok, \nClicking Sell will execute the trade')
            self.sell_stock_b.config(state='normal')

    def buy_stock(self):
        '''Finally Executes the transaction and asks the user for conformation one last time'''
        name = self.stock_name.get()
        li = self.main.shares_dict[name]

        for i in range(len(self.main.p_user_dict)):
            if name == self.main.p_user_dict[i]['name']:
                index = i
        req = int(self.amount.get())
        tot_cost = req * int(li['cost'])
        self.main.shares_dict[name]['tot_sold'] = str(
            int(self.main.shares_dict[name]['tot_sold']) + req)
        self.main.p_user_dict[index]['tot_owned'] = str(
            int(self.main.p_user_dict[index]['tot_owned']) + req)
        self.main.p_user_dict[index]['money_spent'] = str(
            int(self.main.p_user_dict[index]['money_spent']) + tot_cost)
        self.main.users_dict[
            self.main.present_user][index] = self.main.p_user_dict[index]
        balance = int(self.main.accounts[self.main.present_user]['balance'])
        self.main.accounts[self.main.present_user]['balance'] = str(balance -
                                                                    tot_cost)
        self.cost_l.config(text='Cost: ')

        showinfo(
            message='You have just bought %s of the stock %s at the price %s' %
            (str(req), name, str(tot_cost)))
        self.stock_name.set('')
        self.main.show_frame(VIEW_STOCK, RETAIL_PAGE)
        self.back_fb()

    def sell_stock(self):
        '''Asks the user for conformation and then completes the transaction
        of selling, at this point the profit field is
        also updated'''
        name = self.stock_name.get()
        req = int(self.amount.get())

        li = self.main.p_user_dict
        for i in range(len(li)):
            if name == li[i]['name']:
                ok = True
                buff = i

        tot_cost = req * int(self.main.shares_dict[name]['cost'])
        try:
            spent = req * float(
                self.main.p_user_dict[buff]['money_spent']) / int(
                    self.main.p_user_dict[buff]['tot_owned'])
        except ZeroDivisionError:
            spent = 0
        self.main.shares_dict[name]['tot_sold'] = str(
            int(self.main.shares_dict[name]['tot_sold']) - req)
        self.main.p_user_dict[buff]['tot_owned'] = str(
            int(self.main.p_user_dict[buff]['tot_owned']) - req)
        pol = tot_cost - spent
        diff = int(self.main.p_user_dict[buff]['money_spent']) - tot_cost
        self.main.p_user_dict[buff]['money_spent'] = str(
            diff) if diff > 0 else '0'
        self.main.users_dict[self.main.present_user] = self.main.p_user_dict
        profit = int(self.main.accounts[self.main.present_user]['profit'])
        self.main.accounts[self.main.present_user]['profit'] = str(
            int(profit + pol))
        balance = int(self.main.accounts[self.main.present_user]['balance'])
        self.main.accounts[self.main.present_user]['balance'] = str(balance +
                                                                    tot_cost)
        self.retail_back_b.grid_forget()
        self.profit_l.config(text='PROFIT/LOSS: ')
        self.sellp_l.config(text='Current selling price: ')
        self.main.show_frame(VIEW_STOCK, RETAIL_PAGE)
        self.back_fs()
コード例 #6
0
ファイル: LoginPage.py プロジェクト: DasAnish/FinalYearProj
class loginPage(Frame):
    ''' This is a frame class and thus it implements Frame,
        it also contains the required showItems and hideItems function which I believe are present in each frame class
        tomake things a bit simpler
'''
    def __init__(self, parent, main, **kw):
        Frame.__init__(self, parent, **kw)
        self.main = main
        self.label_head = Label(text='Welcome to the Stock Exchange',
                                font=LARGE_FONT)
        self.l_user = Label(text='Username')
        self.user = Entry()
        self.l_pass = Label(text='Password')
        self.password = Entry(show='*')
        self.login_back_b = Button(text='Login',
                                   command=lambda: self.login_check())
        self.sign_up_b = Button(
            text='Sign Up',
            command=lambda: self.main.show_frame(SIGN_UP_PAGE, LOGIN_PAGE))
        self.view_stock_b = Button(
            text='View Stock',
            command=lambda: self.main.show_frame(VIEW_STOCK, LOGIN_PAGE))
        self.main.bind('<Return>', self.keyPress)

    def showItems(self, main):
        self.label_head.grid(column=0, row=0, columnspan=2)
        self.l_user.grid(column=0, row=1)
        self.user.grid(column=1, row=1)
        self.l_pass.grid(column=0, row=2)
        self.password.grid(column=1, row=2)
        self.login_back_b.grid(column=0, row=3, columnspan=2)
        self.sign_up_b.grid(column=0, row=4)
        self.view_stock_b.grid(column=1, row=4)

    def hideItems(self, main):
        self.label_head.grid_forget()
        self.l_user.grid_forget()
        self.user.grid_forget()
        self.l_pass.grid_forget()
        self.password.grid_forget()
        self.login_back_b.grid_forget()
        self.sign_up_b.grid_forget()
        self.view_stock_b.grid_forget()

    def keyPress(self, event):
        ''' this is the binding fucntion for any keyPress event
'''
        if event.keysym == 'Return':
            self.login_check()

    def login_check(self):
        ''' This function checks whether a given user is registered on the system or not
            then continues to chech whether they have entered the correct password.
            it also creates messagesboxes to give the proper error message to the user
'''
        main = self.main
        user = str(self.user.get())
        password = bytes(str(self.password.get()), 'utf-8')
        main.login = False
        check1 = user in main.pass_dict
        check3 = user == 'admin' and password == 'admin'
        if check1:
            check2 = main.pass_dict[user] == password
        if check1 and check2:
            main.login = True
        else:
            main.login = False
        if check3:
            main.login = True
            main.admin = True
            main.show_frame(ADMIN_PAGE, LOGIN_PAGE)
        if main.login:
            if not check3:
                main.present_user, main.p_user_dict = user, main.users_dict[
                    user]
                main.show_frame(VIEW_STOCK, LOGIN_PAGE)
            self.password.delete(0, END)
            self.user.delete(0, END)
        else:
            self.password.delete(0, END)
            showinfo(message='Incorrect Username or Password entered')
コード例 #7
0
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        #self.style = Style()
        #self.style.theme_use("clam")
        #self.pack(fill=BOTH, expand = 1)

        self.quitbutton = Button(self,
                                 text="Quit",
                                 command=lambda: self.quit())

        self.quitbutton.grid(row=3, column=1, pady=4)

        self.labelErrorPointer = Label(self, text="◀")

        self.labellist = []
        self.entrylist = []
        self.verifylist = []
        self.misclist = []

        self.optionCreate = "Create"
        self.optionUpcoming = "Upcoming"
        self.optionPast = "Past"

        self.prevmode = self.optionCreate
        self.curmode = self.optionCreate
        self.optionvar = tkinter.StringVar(self)
        self.optionvar.trace("w", self.permaloop)
        self.optionvar.set(self.optionCreate)
        self.option = OptionMenu(self, self.optionvar, self.optionCreate,
                                 self.optionUpcoming, self.optionPast)

        self.optionpostmodevar = tkinter.StringVar(self)
        self.optionpostmodevar.trace("w", self.permaloop)
        self.optionpostmodevar.set('url')
        self.optionpostmode = OptionMenu(self, self.optionpostmodevar, 'url',
                                         'text')

        self.labelText = Label(self, text='Selftext:')
        self.entryText = Text(self)
        self.labelURL = Label(self, text='URL:')
        self.entryURL = Entry(self)
        self.entryURL.configure(width=60)

        self.sql = sqlite3.connect('sql.db')
        print('Loaded SQL Database')
        self.cur = self.sql.cursor()

        self.cur.execute(
            'CREATE TABLE IF NOT EXISTS upcoming(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT)'
        )
        self.cur.execute(
            'CREATE TABLE IF NOT EXISTS past(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT, POSTLINK TEXT)'
        )
        self.cur.execute(
            'CREATE TABLE IF NOT EXISTS internal(NAME TEXT, ID INT)')
        print('Loaded Completed table')
        self.cur.execute('SELECT * FROM internal')
        f = self.cur.fetchone()
        if not f:
            print('Database is new. Adding ID counter')
            self.cur.execute('INSERT INTO internal VALUES(?, ?)',
                             ['counter', 1])
            self.idcounter = 1
        else:
            self.idcounter = f[1]
            print('Current ID counter: ' + str(self.idcounter))

        self.sql.commit()

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        w = 853
        h = 480
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y - 50))

        self.login()

    def login(self):

        try:
            self.quitbutton.grid_forget()
            self.quitbutton.grid(row=9000, column=0, columnspan=20)

            self.option.grid(row=1, column=0, columnspan=80, pady=8)

            self.updategui(fullclean=True)
        except praw.errors.InvalidUserPass:
            pass
            print('Invalid username or password')
            self.entryPassword.delete(0, 200)
            self.labelErrorPointer.grid(row=1, column=2)

    def permaloop(self, *args):
        self.curmode = self.optionvar.get()
        print('Was: ' + self.prevmode + ' | Now: ' + self.curmode)
        if self.curmode != self.prevmode:
            self.prevmode = self.curmode
            self.updategui(fullclean=True)
        else:
            self.updategui(False)

    def getTime(self, bool):
        timeNow = datetime.datetime.now(datetime.timezone.utc)
        timeUnix = timeNow.timestamp()
        if bool == False:
            return timeNow
        else:
            return timeUnix

    def addentrytobase(self,
                       subreddit,
                       title,
                       url="",
                       body="",
                       mode="",
                       ptime=""):
        curtime = round(self.getTime(True))
        try:
            t = self.entryMo.get() + ' ' + self.entryDa.get(
            ) + ' ' + self.entryYr.get() + ' ' + self.entryHH.get(
            ) + ':' + self.entryMM.get()
            plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M")
            plandate = plandate.timestamp()
        except ValueError:
            print('Invalid Day')
            return False

        if mode == 'url':
            url = self.entryURL.get()
            body = ""
            if 'http://' not in url and 'https://' not in url:
                print('Please enter a proper URL')
                return False
        if mode == 'text':
            body = self.entryText.get("1.0", "end")
            url = ""

        if plandate < curtime:
            print('Please enter a time in the future')
            return False

        if not all(char in string.ascii_letters + string.digits + '_-'
                   for char in subreddit):
            print('Subreddit contains invalid characters')
            return False

        if len(subreddit) == 0:
            print('You must enter a subreddit')
            return False

        if len(title) == 0:
            print('You must enter a title')
            return False
        if len(title) > 300:
            print('Title is too long. ' + str(len(title)) + '/300 char max')
            return False
        if len(body) > 15000:
            print('Body is too long. ' + str(len(body)) + '/15,000 char max')

        print('Timestamp:', plandate)
        self.cur.execute(
            'INSERT INTO upcoming VALUES(?, ?, ?, ?, ?, ?)',
            [self.idcounter, subreddit,
             int(plandate), title, url, body])
        self.idcounter += 1
        self.cur.execute('UPDATE internal SET ID=? WHERE NAME=?',
                         [self.idcounter, 'counter'])
        self.sql.commit()
        print('\nPost Saved!')
        print(self.idcounter, subreddit, self.timestamptoday(int(plandate)))
        print(title)
        print(url, body)
        print()
        self.entryText.delete("1.0", "end")
        self.entryURL.delete(0, 'end')
        self.entryTitle.delete(0, 'end')
        #self.updategui(halfclean=True)

    def timestamptoday(self, timestamp):
        d = datetime.datetime.fromtimestamp(timestamp)
        info = datetime.datetime.strftime(d, "%b %d %H:%M")
        return info

    def dropentryfrombase(self, ID):
        if '-' not in ID:
            try:
                ID = int(ID)
                l = [ID]
            except ValueError:
                print('You must enter a number')
                return
        else:
            if ID.count('-') == 1:
                try:
                    ID = ID.replace(' ', '')
                    ID = ID.split('-')
                    ID[0] = int(ID[0])
                    ID[1] = int(ID[1])
                    if ID[1] > ID[0]:
                        l = list(range(ID[0], ID[1] + 1))
                    else:
                        return
                except ValueError:
                    return

        for item in l:
            item = str(item)
            print('Dropping Item ' + item + ' from Upcoming')
            self.cur.execute('DELETE FROM upcoming WHERE ID=?', [item])
            self.sql.commit()
        self.updategui(fullclean=True)

    def printbasetofile(self, db):
        filea = open(db + '.txt', 'w')
        if db == 'past':
            self.cur.execute('SELECT * FROM past')
        if db == 'upcoming':
            self.cur.execute('SELECT * FROM upcoming')
        f = self.cur.fetchall()
        print('Printed ' + db + ' unimpeded to file')
        for item in f:
            i = list(item)
            i[2] = self.timestamptoday(i[2])
            i.remove('')

            print(str(i)[1:-1], file=filea)
        filea.close()

    def updategui(self, halfclean=False, fullclean=False):

        if self.curmode == self.optionCreate:
            try:
                print(self.optionpostmodevar.get())

                if self.optionpostmodevar.get() == 'url':
                    self.entryText.delete("1.0", 'end')
                    self.labelText.grid_forget()
                    self.entryText.grid_forget()

                    self.labelURL.grid(row=8, column=0, columnspan=30)
                    self.entryURL.grid(row=9, column=0, columnspan=12, pady=10)

                if self.optionpostmodevar.get() == 'text':
                    self.entryURL.delete(0, 'end')
                    self.labelURL.grid_forget()
                    self.entryURL.grid_forget()

                    self.labelText.grid(row=8, column=0, columnspan=30)
                    self.entryText.configure(width=40, height=8)
                    self.entryText.grid(row=9, column=0, columnspan=12)
            except AttributeError:
                pass

        if fullclean == True:
            print('Cleaning GUI')
            for item in self.labellist:
                item.grid_forget()
            for item in self.entrylist:
                item.grid_forget()
            for item in self.verifylist:
                item.grid_forget()
            for item in self.misclist:
                item.grid_forget()
            self.labellist = []
            self.entrylist = []
            self.verifylist = []
            self.misclist = []

            if self.curmode == self.optionCreate:
                self.newrowindex = 6
                self.labelSubreddit = Label(self, text="Subreddit:    /r/")
                self.labelTitle = Label(self, text="Post title:  ")
                self.entrySubreddit = Entry(self)
                self.entryTitle = Entry(self)

                self.labelHH = Label(self,
                                     text="Schedule time (Local timezone):")
                nowlist = datetime.datetime.strftime(datetime.datetime.now(),
                                                     "%B %d %Y %H %M").split()

                self.entryMo = Spinbox(self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', \
                    'August', 'September', 'October', 'November', 'December'))
                self.entryMo.delete(0, 'end')
                self.entryMo.insert(0, nowlist[0])

                self.entryDa = Spinbox(self, width=2, from_=1, to=31)
                self.entryDa.delete(0, 'end')
                self.entryDa.insert(0, nowlist[1])

                self.entryYr = Spinbox(self, width=4, from_=2014, to=2500)
                self.entryYr.delete(0, 'end')
                self.entryYr.insert(0, nowlist[2])

                self.entryHH = Spinbox(self, from_=0, to=23, width=2)
                self.entryHH.delete(0, 'end')
                self.entryHH.insert(0, nowlist[3])

                self.entryMM = Spinbox(self, from_=0, to=59, width=2)
                self.entryMM.delete(0, 'end')
                self.entryMM.insert(0, nowlist[4])

                self.buttonAddentry = Button(self, text='Save', command=lambda: self.addentrytobase(self.entrySubreddit.get(), self.entryTitle.get(),\
                    mode=self.optionpostmodevar.get()))

                self.misclist.append(self.labelSubreddit)
                self.misclist.append(self.entrySubreddit)
                self.misclist.append(self.labelHH)
                self.misclist.append(self.entryHH)
                self.misclist.append(self.entryMM)
                self.misclist.append(self.entryMo)
                self.misclist.append(self.entryDa)
                self.misclist.append(self.entryYr)
                self.misclist.append(self.labelTitle)
                self.misclist.append(self.entryTitle)
                self.misclist.append(self.buttonAddentry)
                self.misclist.append(self.optionpostmode)
                self.misclist.append(self.labelText)
                self.misclist.append(self.entryText)
                self.misclist.append(self.labelURL)
                self.misclist.append(self.entryURL)

                self.labelSubreddit.grid(row=2, column=0, sticky="e")
                self.labelTitle.grid(row=3, column=0, sticky="e")
                self.entrySubreddit.grid(row=2,
                                         column=1,
                                         columnspan=3,
                                         sticky="w")
                self.entryTitle.grid(row=3, column=1, columnspan=3, sticky="w")
                self.entryMo.grid(row=4, column=1, sticky="e")
                self.entryDa.grid(row=4, column=2)
                self.entryYr.grid(row=4, column=3)
                self.labelHH.grid(row=4, column=0, sticky="se", pady=5)
                self.entryHH.grid(row=5, column=1, sticky="e")
                self.entryMM.grid(row=5, column=2, sticky="w")
                self.optionpostmode.grid(row=6,
                                         column=0,
                                         columnspan=20,
                                         pady=10)
                self.buttonAddentry.grid(row=200, column=0, columnspan=20)

            if self.curmode == self.optionUpcoming:
                self.cur.execute('SELECT * FROM upcoming')
                dobutton = True

            if self.curmode == self.optionPast:
                self.cur.execute('SELECT * FROM past')
                dobutton = False

            if self.curmode == self.optionPast or self.curmode == self.optionUpcoming:

                self.listboxId = Listbox(self)
                self.listboxId.configure(width=118,
                                         height=20,
                                         font=("Courier 8"))
                self.misclist.append(self.listboxId)

                self.listboxScroller = Scrollbar(self,
                                                 orient='horizontal',
                                                 command=self.listboxId.xview)
                self.listboxScroller.grid(row=4, column=0, columnspan=900)
                self.listboxId.grid(row=3, column=0, columnspan=10)

                self.listboxId.configure(
                    xscrollcommand=self.listboxScroller.set)
                self.misclist.append(self.listboxScroller)

                self.buttonPrinter = Button(self, text="Print to .txt file")
                if self.curmode == self.optionPast:
                    self.buttonPrinter.configure(
                        command=lambda: self.printbasetofile('past'))
                if self.curmode == self.optionUpcoming:
                    self.buttonPrinter.configure(
                        command=lambda: self.printbasetofile('upcoming'))

                self.buttonPrinter.grid(row=6, column=0, columnspan=90)
                self.misclist.append(self.buttonPrinter)

                if dobutton == True:
                    self.entryDelete = Entry(self)
                    self.buttonDelete = Button(
                        self,
                        text="Delete Item: ",
                        command=lambda: self.dropentryfrombase(self.entryDelete
                                                               .get()))
                    self.buttonDelete.grid(row=5, column=0, sticky='e')
                    self.entryDelete.grid(row=5, column=1, sticky='w')
                    self.misclist.append(self.entryDelete)
                    self.misclist.append(self.buttonDelete)

                fetched = self.cur.fetchall()
                for item in fetched:

                    info = self.timestamptoday(item[2])

                    if item[4] == '':
                        infx = item[5]
                    if item[5] == '':
                        infx = item[4]
                    if self.curmode == self.optionPast:
                        infy = '.' + item[6]
                    else:
                        infy = ''

                    self.listboxId.insert('end', \
                        item[0] + '.'*(6 - len(item[0])) \
                        + item[1][:10] + '.'*(12 - len(item[1][:10])) \
                        + info + '.'*(15 - len(info[:14])) \
                        + item[3][:18] + '.'*(20 - len(item[3][:14])) \
                        + infx[:45] + '.'*(47-len(infx[:45])) \
                        + infy)

    def morerows(self, label, columnm, columnn, limit, *args):
        self.redditlabel = Label(self, text=label)
        self.redditlabel.grid(row=self.newrowindex, column=columnm, sticky="e")
        self.labellist.append(self.redditlabel)

        self.redditentry = Entry(self)
        self.redditentry.grid(row=self.newrowindex,
                              column=columnn,
                              columnspan=9)
        self.entrylist.append(self.redditentry)

        self.newrowindex += 1
        if self.newrowindex >= limit:
            self.morerowbutton.grid_forget()
        print(self.newrowindex)
コード例 #8
0
ファイル: ViewStock.py プロジェクト: DasAnish/FinalYearProj
class viewStock(Frame):
    '''The Frame that is kind of a logged in view and contains buttons
        to move to sell, buy or log out. At the same time it
        it also shows what stocks one has along with their profit and more'''
    def __init__(self, parent, main, **kw):
        Frame.__init__(self, parent, **kw)
        self.view_f_text = Text(width=30)
        self.main = main
        self.view_scroll = Scrollbar(orient = VERTICAL, command=self.view_f_text.yview)
        self.view_f_text.config(yscrollcommand = self.view_scroll.set)
        self.label_head = Label(text='Stocks available', font = MED_FONT)
        self.back_b = Button(text='Login and Buy', command = self.back )
        self.buy_b = Button(text='BUY', command = self.buy)
        self.sell_b = Button(text='SELL', command = self.sell)
    def buy(self):
        '''the call back if we click on buy and takes us to the buy window'''
        self.main.frames[RETAIL_PAGE].page = 'b'
        self.main.show_frame(RETAIL_PAGE, VIEW_STOCK)
    def sell(self):
        '''the call back if we click on sell and it takes us to the sell window'''
        self.main.frames[RETAIL_PAGE].page = 's'
        self.main.show_frame(RETAIL_PAGE, VIEW_STOCK)
    def back(self):
        '''this is kind of the '''
        self.main.show_frame(LOGIN_PAGE, VIEW_STOCK)
        self.main.login = False
        self.main.admin = False
    def showItems(self, main):
        if main.login:
            self.back_b.config(text='Log Out')
            self.label_head.config(text='Logged in as %s'%self.main.present_user)
            self.buy_b.grid(column=0, row=2, columnspan=2)
            self.sell_b.grid(column=0, row=3, columnspan=2)
        else:
            self.back_b.config(text='Login and Buy')
            self.label_head.configure(text='View Stock')

        self.label_head.grid(column=0, row=0, columnspan=2)
        self.view_f_text.grid(column=0, row=1, sticky='nsew')
        self.view_scroll.grid(column=2, row=1)
        self.back_b.grid(column=0, row=4, columnspan=2)
        self.view_stock()
    def hideItems(self, main):
        self.label_head.grid_forget()
        self.view_f_text.grid_forget()
        self.view_scroll.grid_forget()
        self.back_b.grid_forget()

        if main.login:
            self.buy_b.grid_forget()
            self.sell_b.grid_forget()
    def view_stock(self):
        self.view_f_text.config(state='normal')
        self.view_f_text.delete('1.0', 'end')

        if self.main.login and not self.main.admin:
            l2 = self.main.accounts[self.main.present_user]
            txt_1 = 'Balance: ' + l2['balance'] + '\n' + 'Profit: ' + l2['profit'] + '\n'*2 + '*'*20 + '\n'
            self.view_f_text.insert('end',txt_1)
        key = self.main.shares_dict.keys()

        if not self.main.login:
            for name in key:
                li = self.main.shares_dict[name]
                txt_b1 = 'Name: '
                self.view_f_text.insert('end',txt_b1)
                self.view_f_text.insert('end',name+'\n')
                txt_b2 = 'Cost Price: '
                self.view_f_text.insert('end',txt_b2)
                self.view_f_text.insert('end',li['cost']+'\n')
                available_num = int(li['tot_amount']) - int(li['tot_sold'])
                txt_b3 = 'Available amount: '
                self.view_f_text.insert('end',txt_b3)
                self.view_f_text.insert('end',str(available_num)+'\n')
                txt_b4 = '*'*20
                self.view_f_text.insert('end','\n'+txt_b4+'\n\n')
        self.view_scroll.grid(column=1, row=0, rowspan=2, sticky='nswe')

        if self.main.login:
            for name in key:
                li = self.main.shares_dict[name]
                txt_b1 = 'Name: '
                self.view_f_text.insert('end',txt_b1)
                self.view_f_text.insert('end',name+'\n')
                txt_b2 = 'Cost Price: '
                self.view_f_text.insert('end',txt_b2)
                self.view_f_text.insert('end',li['cost']+'\n')
                available_num = int(li['tot_amount']) - int(li['tot_sold'])
                txt_b3 = 'Available amount: '
                self.view_f_text.insert('end',txt_b3)
                self.view_f_text.insert('end',str(available_num)+'\n')
                lis =  self.main.p_user_dict
                for i in lis:
                    if i['name'] == name:
                        lis = i
                        break
                txt1 = 'Stocks owned: '+lis['tot_owned']+'\n' if not lis['tot_owned'] == '0' else ''
                self.view_f_text.insert('end', txt1)
                txt2 = 'Money spent: '+ lis['money_spent']+'\n' if not lis['tot_owned'] == '0' else ''
                self.view_f_text.insert('end', txt2)
                txt_b4 = '*'*20
                self.view_f_text.insert('end','\n'+txt_b4+'\n\n')
            self.view_f_text.config(state='disabled')
        else:
            self.view_f_text.config(state='disabled')
コード例 #9
0
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        self.style = Style()
        self.style.theme_use("clam")
        self.pack(fill=BOTH, expand=1)

        self.labelU = Label(self, text="U:")
        self.labelP = Label(self, text="P:")

        self.entryUsername = Entry(self)
        self.entryUsername.config(relief='flat')
        self.entryUsername.focus_set()
        self.entryUsername.bind('<Return>',
                                lambda event: self.entryPassword.focus_set())

        self.entryPassword = Entry(self)
        self.entryPassword.config(relief='flat', show='•')
        self.entryPassword.bind(
            '<Return>', lambda event: self.login(self.entryUsername.get(),
                                                 self.entryPassword.get()))

        self.newbutton = Button(
            self,
            text="Login",
            command=lambda: self.login(self.entryUsername.get(),
                                       self.entryPassword.get()))
        self.newbutton.bind(
            '<Return>', lambda event: self.login(self.entryUsername.get(),
                                                 self.entryPassword.get()))
        self.newbutton.config(width=6)
        self.quitbutton = Button(self,
                                 text="Quit",
                                 command=lambda: self.quit())
        self.quitbutton.config(width=6)

        self.mailIconRed = PhotoImage(file="mail.gif")
        self.labelRed = Label(self, image=self.mailIconRed)
        self.mailIconGray = PhotoImage(file="mail2.gif")
        self.labelGray = Label(self, image=self.mailIconGray)
        self.labelKarma = Label(self, text='•')

        self.labelU.grid(row=0, column=0)
        self.entryUsername.grid(row=0, column=1)
        self.labelP.grid(row=1, column=0)
        self.entryPassword.grid(row=1, column=1, pady=4)
        self.newbutton.grid(row=2, column=1)
        self.quitbutton.grid(row=3, column=1, pady=4)
        '''
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        w=150
        h=112
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50))
        '''

    def login(self, username, password):
        #print('U: ' + username)
        self.username = username
        if username == '':
            #print('Please enter a username')
            self.entryUsername.focus_set()
        elif password == '':
            #print('Please enter a password')
            self.entryPassword.set_focus()

        if username != '' and password != '':
            #print('Attempting login for ' + username)
            try:
                self.USERAGENT = username + ' scans his inbox for new mail.'
                self.r = praw.Reddit(self.USERAGENT)
                #self.r.config._ssl_url = None
                self.r.login(username, password)
                #print('You have logged in as ' + username)
                self.labelU.grid_forget()
                self.labelP.grid_forget()
                self.entryUsername.grid_forget()
                self.entryPassword.grid_forget()
                self.newbutton.grid_forget()
                self.quitbutton.grid_forget()
                self.usernamelabel = Label(self, text=username)
                self.usernamelabel.grid(row=0, column=0, pady=10, padx=30)
                self.quitbutton.grid(row=1, column=0)
                self.labelKarma.grid(row=3, column=0)
                self.playedSound = 'false'
                self.loop()
            except praw.errors.InvalidUserPass:
                pass
                #print('Invalid username or password')

    def loop(self):
        while True:
            try:
                #print('Starting new search')
                hasmail = 'false'
                for msg in self.r.get_unread(limit=None):
                    hasmail = 'true'

                if hasmail == 'true':
                    #print("You've got mail!")
                    if self.playedSound == 'false':
                        winsound.PlaySound('pop.wav', winsound.SND_FILENAME)
                    self.playedSound = 'true'
                    self.labelGray.grid_forget()
                    self.labelRed.grid(row=2, column=0)
                if hasmail == 'false':
                    self.playedSound = 'false'
                    #print('No mail!')
                    self.labelRed.grid_forget()
                    self.labelGray.grid(row=2, column=0)
                self.user = self.r.get_redditor(self.username)
                lkarma = str(self.user.link_karma)
                ckarma = str(self.user.comment_karma)
                lkarma = self.karmaRound(lkarma)
                ckarma = self.karmaRound(ckarma)
                karmastring = lkarma + ' • ' + ckarma
                self.labelKarma.config(text=karmastring)
                time.sleep(10)
            except Exception:
                time.sleep(10)

    def karmaRound(self, karma):
        if len(karma) > 4 and len(karma) < 7:
            tstring = karma[:-3]
            tstring2 = karma[-3:]
            karma = tstring + '.' + tstring2[:2] + 'K'
            return karma
        if len(karma) > 6:
            tstring = karma[:-6]
            tstring2 = karma[-6:]
            karma = tstring + '.' + tstring2[:2] + 'M'
            return karma
        else:
            return karma
コード例 #10
0
ファイル: scheduleclient.py プロジェクト: Vindora/reddit
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        # self.style = Style()
        # self.style.theme_use("clam")
        # self.pack(fill=BOTH, expand = 1)

        self.quitbutton = Button(self, text="Quit", command=lambda: self.quit())

        self.quitbutton.grid(row=3, column=1, pady=4)

        self.labelErrorPointer = Label(self, text="◀")

        self.labellist = []
        self.entrylist = []
        self.verifylist = []
        self.misclist = []

        self.optionCreate = "Create"
        self.optionUpcoming = "Upcoming"
        self.optionPast = "Past"

        self.prevmode = self.optionCreate
        self.curmode = self.optionCreate
        self.optionvar = tkinter.StringVar(self)
        self.optionvar.trace("w", self.permaloop)
        self.optionvar.set(self.optionCreate)
        self.option = OptionMenu(self, self.optionvar, self.optionCreate, self.optionUpcoming, self.optionPast)

        self.optionpostmodevar = tkinter.StringVar(self)
        self.optionpostmodevar.trace("w", self.permaloop)
        self.optionpostmodevar.set("url")
        self.optionpostmode = OptionMenu(self, self.optionpostmodevar, "url", "text")

        self.labelText = Label(self, text="Selftext:")
        self.entryText = Text(self)
        self.labelURL = Label(self, text="URL:")
        self.entryURL = Entry(self)
        self.entryURL.configure(width=60)

        self.sql = sqlite3.connect("sql.db")
        print("Loaded SQL Database")
        self.cur = self.sql.cursor()

        self.cur.execute(
            "CREATE TABLE IF NOT EXISTS upcoming(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT)"
        )
        self.cur.execute(
            "CREATE TABLE IF NOT EXISTS past(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT, POSTLINK TEXT)"
        )
        self.cur.execute("CREATE TABLE IF NOT EXISTS internal(NAME TEXT, ID INT)")
        print("Loaded Completed table")
        self.cur.execute("SELECT * FROM internal")
        f = self.cur.fetchone()
        if not f:
            print("Database is new. Adding ID counter")
            self.cur.execute("INSERT INTO internal VALUES(?, ?)", ["counter", 1])
            self.idcounter = 1
        else:
            self.idcounter = f[1]
            print("Current ID counter: " + str(self.idcounter))

        self.sql.commit()

        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        w = 853
        h = 480
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry("%dx%d+%d+%d" % (w, h, x, y - 50))

        self.login()

    def login(self):

        try:
            self.quitbutton.grid_forget()
            self.quitbutton.grid(row=9000, column=0, columnspan=20)

            self.option.grid(row=1, column=0, columnspan=8, pady=8)

            self.updategui(fullclean=True)
        except praw.errors.InvalidUserPass:
            pass
            print("Invalid username or password")
            self.entryPassword.delete(0, 200)
            self.labelErrorPointer.grid(row=1, column=2)

    def permaloop(self, *args):
        self.curmode = self.optionvar.get()
        print("Was: " + self.prevmode + " | Now: " + self.curmode)
        if self.curmode != self.prevmode:
            self.prevmode = self.curmode
            self.updategui(fullclean=True)
        else:
            self.updategui(False)

    def getTime(self, bool):
        timeNow = datetime.datetime.now(datetime.timezone.utc)
        timeUnix = timeNow.timestamp()
        if bool == False:
            return timeNow
        else:
            return timeUnix

    def addentrytobase(self, subreddit, title, url="", body="", mode="", ptime=""):
        curtime = round(self.getTime(True))
        try:
            t = (
                self.entryMo.get()
                + " "
                + self.entryDa.get()
                + " "
                + self.entryYr.get()
                + " "
                + self.entryHH.get()
                + ":"
                + self.entryMM.get()
            )
            plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M")
            plandate = plandate.timestamp()
        except ValueError:
            print("Invalid Day")
            return False

        if mode == "url":
            url = self.entryURL.get()
            body = ""
            if "http://" not in url and "https://" not in url:
                print("Please enter a proper URL")
                return False
        if mode == "text":
            body = self.entryText.get("1.0", "end")
            url = ""

        if plandate < curtime:
            print("Please enter a time in the future")
            return False

        if not all(char in string.ascii_letters + string.digits + "_-" for char in subreddit):
            print("Subreddit contains invalid characters")
            return False

        if len(subreddit) == 0:
            print("You must enter a subreddit")
            return False

        if len(title) == 0:
            print("You must enter a title")
            return False
        if len(title) > 300:
            print("Title is too long. " + str(len(title)) + "/300 char max")
            return False
        if len(body) > 15000:
            print("Body is too long. " + str(len(body)) + "/15,000 char max")

        print("Timestamp:", plandate)
        self.cur.execute(
            "INSERT INTO upcoming VALUES(?, ?, ?, ?, ?, ?)",
            [self.idcounter, subreddit, int(plandate), title, url, body],
        )
        self.idcounter += 1
        self.cur.execute("UPDATE internal SET ID=? WHERE NAME=?", [self.idcounter, "counter"])
        self.sql.commit()
        print("Post Saved!")
        self.entryText.delete("1.0", "end")
        self.entryURL.delete(0, "end")
        self.entryTitle.delete(0, "end")
        # self.updategui(halfclean=True)

    def dropentryfrombase(self, ID):
        try:
            ID = int(ID)
        except ValueError:
            print("You must enter a number")
            return
        print("Dropping Item " + str(ID) + " from Upcoming")
        self.cur.execute("DELETE FROM upcoming WHERE ID=?", [ID])
        self.sql.commit()
        self.updategui(fullclean=True)

    def printbasetofile(self, db):
        filea = open(db + ".txt", "w")
        if db == "past":
            self.cur.execute("SELECT * FROM past")
        if db == "upcoming":
            self.cur.execute("SELECT * FROM upcoming")
        f = self.cur.fetchall()
        print("Printed " + db + " unimpeded to file")
        for item in f:
            i = list(item)
            d = datetime.datetime.fromtimestamp(i[2])
            i[2] = datetime.datetime.strftime(d, "%b %d %H:%M")
            i.remove("")

            print(str(i)[1:-1], file=filea)
        filea.close()

    def updategui(self, halfclean=False, fullclean=False):

        if self.curmode == self.optionCreate:
            try:
                print(self.optionpostmodevar.get())

                if self.optionpostmodevar.get() == "url":
                    self.entryText.delete("1.0", "end")
                    self.labelText.grid_forget()
                    self.entryText.grid_forget()

                    self.labelURL.grid(row=8, column=0, columnspan=30)
                    self.entryURL.grid(row=9, column=0, columnspan=12, pady=10)

                if self.optionpostmodevar.get() == "text":
                    self.entryURL.delete(0, "end")
                    self.labelURL.grid_forget()
                    self.entryURL.grid_forget()

                    self.labelText.grid(row=8, column=0, columnspan=30)
                    self.entryText.configure(width=40, height=8)
                    self.entryText.grid(row=9, column=0, columnspan=12)
            except AttributeError:
                pass

        if fullclean == True:
            print("Cleaning GUI")
            for item in self.labellist:
                item.grid_forget()
            for item in self.entrylist:
                item.grid_forget()
            for item in self.verifylist:
                item.grid_forget()
            for item in self.misclist:
                item.grid_forget()
            self.labellist = []
            self.entrylist = []
            self.verifylist = []
            self.misclist = []

            if self.curmode == self.optionCreate:
                self.newrowindex = 6
                self.labelSubreddit = Label(self, text="Subreddit:    /r/")
                self.labelTitle = Label(self, text="Post title:  ")
                self.entrySubreddit = Entry(self)
                self.entryTitle = Entry(self)

                self.labelHH = Label(self, text="Schedule time (Local timezone):")
                nowlist = datetime.datetime.strftime(datetime.datetime.now(), "%B %d %Y %H %M").split()

                self.entryMo = Spinbox(
                    self,
                    width=9,
                    values=(
                        "January",
                        "February",
                        "March",
                        "April",
                        "May",
                        "June",
                        "July",
                        "August",
                        "September",
                        "October",
                        "November",
                        "December",
                    ),
                )
                self.entryMo.delete(0, "end")
                self.entryMo.insert(0, nowlist[0])

                self.entryDa = Spinbox(self, width=2, from_=1, to=31)
                self.entryDa.delete(0, "end")
                self.entryDa.insert(0, nowlist[1])

                self.entryYr = Spinbox(self, width=4, from_=2014, to=2500)
                self.entryYr.delete(0, "end")
                self.entryYr.insert(0, nowlist[2])

                self.entryHH = Spinbox(self, from_=0, to=23, width=2)
                self.entryHH.delete(0, "end")
                self.entryHH.insert(0, nowlist[3])

                self.entryMM = Spinbox(self, from_=0, to=59, width=2)
                self.entryMM.delete(0, "end")
                self.entryMM.insert(0, nowlist[4])

                self.buttonAddentry = Button(
                    self,
                    text="Save",
                    command=lambda: self.addentrytobase(
                        self.entrySubreddit.get(), self.entryTitle.get(), mode=self.optionpostmodevar.get()
                    ),
                )

                self.misclist.append(self.labelSubreddit)
                self.misclist.append(self.entrySubreddit)
                self.misclist.append(self.labelHH)
                self.misclist.append(self.entryHH)
                self.misclist.append(self.entryMM)
                self.misclist.append(self.entryMo)
                self.misclist.append(self.entryDa)
                self.misclist.append(self.entryYr)
                self.misclist.append(self.labelTitle)
                self.misclist.append(self.entryTitle)
                self.misclist.append(self.buttonAddentry)
                self.misclist.append(self.optionpostmode)
                self.misclist.append(self.labelText)
                self.misclist.append(self.entryText)
                self.misclist.append(self.labelURL)
                self.misclist.append(self.entryURL)

                self.labelSubreddit.grid(row=2, column=0, sticky="e")
                self.labelTitle.grid(row=3, column=0, sticky="e")
                self.entrySubreddit.grid(row=2, column=1, columnspan=3, sticky="w")
                self.entryTitle.grid(row=3, column=1, columnspan=3, sticky="w")
                self.entryMo.grid(row=4, column=1, sticky="e")
                self.entryDa.grid(row=4, column=2)
                self.entryYr.grid(row=4, column=3)
                self.labelHH.grid(row=4, column=0, sticky="se", pady=5)
                self.entryHH.grid(row=5, column=1, sticky="e")
                self.entryMM.grid(row=5, column=2, sticky="w")
                self.optionpostmode.grid(row=6, column=0, columnspan=20, pady=10)
                self.buttonAddentry.grid(row=200, column=0, columnspan=20)

            if self.curmode == self.optionUpcoming:
                self.cur.execute("SELECT * FROM upcoming")
                dobutton = True

            if self.curmode == self.optionPast:
                self.cur.execute("SELECT * FROM past")
                dobutton = False

            if self.curmode == self.optionPast or self.curmode == self.optionUpcoming:

                self.listboxId = Listbox(self)
                self.listboxId.configure(width=118, height=20, font=("Courier 8"))
                self.misclist.append(self.listboxId)

                self.listboxScroller = Scrollbar(self, orient="horizontal", command=self.listboxId.xview)
                self.listboxScroller.grid(row=4, column=0, columnspan=900)
                self.listboxId.grid(row=3, column=0, columnspan=10)

                self.listboxId.configure(xscrollcommand=self.listboxScroller.set)
                self.misclist.append(self.listboxScroller)

                self.buttonPrinter = Button(self, text="Print to .txt file")
                if self.curmode == self.optionPast:
                    self.buttonPrinter.configure(command=lambda: self.printbasetofile("past"))
                if self.curmode == self.optionUpcoming:
                    self.buttonPrinter.configure(command=lambda: self.printbasetofile("upcoming"))

                self.buttonPrinter.grid(row=6, column=0, columnspan=90)
                self.misclist.append(self.buttonPrinter)

                if dobutton == True:
                    self.entryDelete = Entry(self)
                    self.buttonDelete = Button(
                        self, text="Delete Item: ", command=lambda: self.dropentryfrombase(self.entryDelete.get())
                    )
                    self.buttonDelete.grid(row=5, column=0, sticky="e")
                    self.entryDelete.grid(row=5, column=1, sticky="w")
                    self.misclist.append(self.entryDelete)
                    self.misclist.append(self.buttonDelete)

                fetched = self.cur.fetchall()
                for item in fetched:
                    d = datetime.datetime.fromtimestamp(item[2])
                    info = datetime.datetime.strftime(d, "%b %d %H:%M")

                    if item[4] == "":
                        infx = item[5]
                    if item[5] == "":
                        infx = item[4]
                    if self.curmode == self.optionPast:
                        infy = "." + item[6]
                    else:
                        infy = ""

                    self.listboxId.insert(
                        "end",
                        item[0]
                        + "." * (6 - len(item[0]))
                        + item[1][:10]
                        + "." * (12 - len(item[1][:10]))
                        + info
                        + "." * (15 - len(info[:14]))
                        + item[3][:18]
                        + "." * (20 - len(item[3][:14]))
                        + infx[:45]
                        + "." * (47 - len(infx[:45]))
                        + infy,
                    )

    def morerows(self, label, columnm, columnn, limit, *args):
        self.redditlabel = Label(self, text=label)
        self.redditlabel.grid(row=self.newrowindex, column=columnm, sticky="e")
        self.labellist.append(self.redditlabel)

        self.redditentry = Entry(self)
        self.redditentry.grid(row=self.newrowindex, column=columnn, columnspan=9)
        self.entrylist.append(self.redditentry)

        self.newrowindex += 1
        if self.newrowindex >= limit:
            self.morerowbutton.grid_forget()
        print(self.newrowindex)
コード例 #11
0
ファイル: SignUpPage.py プロジェクト: DasAnish/FinalYearProj
class signUpPage(Frame):
    ''' The user is taken to this Frame if they choose to sign up
        this class implements the Frame Class in Tkinter and contains the
        required functions that will allow it to work well in this project
'''
    def __init__(self, parent, main, **kw):
        Frame.__init__(self, parent, **kw)
        self.main = main
        self.label_head = Label(text='Sign Up Page', font=MED_FONT)
        self.l_user = Label(text='Username')
        self.user = Entry(text='must have atleast 5 chars')
        self.l_pass = Label(text='Password')
        self.l_pass2 = Label(text='re-enter')
        self.password = Entry(show='*')
        self.password2 = Entry(show='*')
        self.sign_up_b = Button(text='Sign Up',
                                command=lambda: self.sign_up(main))
        self.back_b = Button(
            text='Back',
            command=lambda: self.main.show_frame(LOGIN_PAGE, SIGN_UP_PAGE))
        self.age = BooleanVar()
        self.age_c = Checkbutton(text='Are you above 16 years of age',
                                 variable=self.age,
                                 onvalue=True,
                                 offvalue=False)
        self.balance = BooleanVar()
        self.balance_c = Checkbutton(
            text='Do you have 10000 rupees in \nyour bank account',
            variable=self.balance,
            onvalue=True,
            offvalue=False)

    def showItems(self, main):
        self.label_head.grid(column=0, row=0, columnspan=2)
        self.l_user.grid(column=0, row=1)
        self.user.grid(column=1, row=1)
        self.l_pass.grid(column=0, row=2)
        self.l_pass2.grid(column=0, row=3)
        self.password.grid(column=1, row=2)
        self.password2.grid(column=1, row=3)
        self.age_c.grid(column=0, columnspan=2, row=4)
        self.balance_c.grid(column=0, columnspan=2, row=5)
        self.sign_up_b.grid(column=0, row=6, columnspan=2)
        self.back_b.grid(column=0, row=7, columnspan=2)

    def hideItems(self, main):
        self.label_head.grid_forget()
        self.l_user.grid_forget()
        self.user.grid_forget()
        self.l_pass.grid_forget()
        self.l_pass2.grid_forget()
        self.password.grid_forget()
        self.password2.grid_forget()
        self.sign_up_b.grid_forget()
        self.back_b.grid_forget()
        self.age_c.grid_forget()
        self.balance_c.grid_forget()

    def sign_up(self, main):
        ''' Similar to the login check function it does the necessary checks to make sure that a person actually is
            above 18 (not really) and has the required amount of money to open an account on this platform
            also it creates pop ups when ever an exceptional circumstance is reached
'''
        password1 = self.password.get()
        password2 = self.password2.get()
        username = self.user.get()
        bool1 = username not in main.users_dict.keys()
        bool2 = (password1 == password2)
        bool3 = len(password1) >= 5
        bool4 = username == 'admin'
        bool5 = self.age.get()
        bool6 = self.balance.get()

        if not bool1:
            num = str(randint(100, 999))
            showinfo(message='Username already exists, try: ' + username + num)
            self.password.delete(0, END)
            self.password2.delete(0, END)
        elif not bool2:
            showinfo(message='Passwords dont match')
            self.password.delete(0, END)
            self.password2.delete(0, END)
        elif not bool3:
            showinfo(message='Password must be more than 5 characters')
            self.password.delete(0, END)
            self.password2.delete(0, END)
        elif bool4:
            showinfo(message='Please don\'t use that username it is reserved')
        elif not bool5:
            showinfo(message='You must be 16 years or older to join')
        elif not bool6:
            showinfo(message='You need to have 10000 to create an account')

        else:
            buff = []
            for name in main.shares_dict.keys():
                temp = {}
                temp['name'] = name
                temp['tot_owned'] = '0'
                temp['money_spent'] = '0'
                buff.append(temp)
            self.main.users_dict[username] = buff
            self.main.pass_dict[username] = bytes(password1, 'utf-8')
            k = getData.key()
            self.main.pass_dict2[username] = encode(bytes(password1, 'utf-8'))
            self.main.accounts[username] = {
                'balance': str(10**4),
                'profit': '0'
            }
            self.main.present_user = username
            self.main.p_user_dict = self.main.users_dict[username]
            self.main.login = True
            self.main.show_frame(VIEW_STOCK, SIGN_UP_PAGE)
            self.password.delete(0, END)
            self.password2.delete(0, END)
            self.user.delete(0, END)
コード例 #12
0
class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        self.style = Style()
        self.style.theme_use("clam")
        self.pack(fill=BOTH, expand = 1)

        self.labelU = Label(self, text="U:")
        self.labelP = Label(self, text="P:")
        
        self.entryUsername = Entry(self)
        self.entryUsername.config(relief='flat')
        self.entryUsername.focus_set()
        self.entryUsername.bind('<Return>', lambda event: self.entryPassword.focus_set())

        self.entryPassword = Entry(self)
        self.entryPassword.config(relief='flat', show='•')
        self.entryPassword.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get()))

        self.newbutton = Button(self, text="Login", command= lambda: self.login(self.entryUsername.get(), self.entryPassword.get()))
        self.newbutton.bind('<Return>', lambda event: self.login(self.entryUsername.get(), self.entryPassword.get()))
        self.newbutton.config(width=6)
        self.quitbutton = Button(self, text="Quit", command= lambda: self.quit())
        self.quitbutton.config(width=6)
        
        self.mailIconRed = PhotoImage(file="mail.gif")
        self.labelRed = Label(self, image=self.mailIconRed)
        self.mailIconGray = PhotoImage(file="mail2.gif")
        self.labelGray = Label(self, image=self.mailIconGray)
        self.labelKarma = Label(self, text = '•')

        self.labelU.grid(row=0, column=0)
        self.entryUsername.grid(row=0, column=1)
        self.labelP.grid(row=1, column=0)
        self.entryPassword.grid(row=1, column=1, pady=4)
        self.newbutton.grid(row=2, column=1)
        self.quitbutton.grid(row=3, column=1, pady=4)
        

        '''
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()

        w=150
        h=112
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50))
        '''


    def login(self, username, password):
        #print('U: ' + username)
        self.username = username
        if username == '':
            #print('Please enter a username')
            self.entryUsername.focus_set()
        elif password == '':
            #print('Please enter a password')
            self.entryPassword.set_focus()
            
        if username != '' and password != '':
            #print('Attempting login for ' + username)
            try:
                self.USERAGENT = username + ' scans his inbox for new mail.'
                self.r = praw.Reddit(self.USERAGENT)
                #self.r.config._ssl_url = None
                self.r.login(username, password)
                #print('You have logged in as ' + username)
                self.labelU.grid_forget()
                self.labelP.grid_forget()
                self.entryUsername.grid_forget()
                self.entryPassword.grid_forget()
                self.newbutton.grid_forget()
                self.quitbutton.grid_forget()
                self.usernamelabel = Label(self, text=username)
                self.usernamelabel.grid(row=0, column=0, pady = 10, padx = 30)
                self.quitbutton.grid(row=1, column=0)
                self.labelKarma.grid(row = 3, column = 0)
                self.playedSound = 'false'
                self.loop()
            except praw.errors.InvalidUserPass:
                pass
                #print('Invalid username or password')

    def loop(self):
        while True:
            try:
                #print('Starting new search')
                hasmail = 'false'
                for msg in self.r.get_unread(limit=None):
                    hasmail = 'true'
                
                if hasmail == 'true':
                    #print("You've got mail!")
                    if self.playedSound == 'false':
                        winsound.PlaySound('pop.wav', winsound.SND_FILENAME)
                    self.playedSound = 'true'
                    self.labelGray.grid_forget()
                    self.labelRed.grid(row=2, column=0)
                if hasmail == 'false':
                    self.playedSound = 'false'
                    #print('No mail!')
                    self.labelRed.grid_forget()
                    self.labelGray.grid(row=2, column=0)
                self.user = self.r.get_redditor(self.username)
                lkarma = str(self.user.link_karma)
                ckarma = str(self.user.comment_karma)
                lkarma = self.karmaRound(lkarma)
                ckarma = self.karmaRound(ckarma)
                karmastring = lkarma + ' • ' + ckarma
                self.labelKarma.config(text = karmastring)
                time.sleep(10)
            except Exception:
                time.sleep(10)


    def karmaRound(self, karma):
        if len(karma) > 4 and len(karma) < 7:
            tstring = karma[:-3]
            tstring2 = karma[-3:]
            karma = tstring + '.' + tstring2[:2] + 'K'
            return karma
        if len(karma) > 6:
            tstring = karma[:-6]
            tstring2 = karma[-6:]
            karma = tstring + '.' + tstring2[:2] + 'M'
            return karma
        else:
            return karma
コード例 #13
0
ファイル: scheduleclient.py プロジェクト: A-J-/reddit
class Example(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.parent = parent
        self.initUI()

    def initUI(self):
        self.parent.title("")
        #self.style = Style()
        #self.style.theme_use("clam")
        #self.pack(fill=BOTH, expand = 1)


        self.quitbutton = Button(self, text="Quit", command= lambda: self.quit())

        self.quitbutton.grid(row=3, column=1, pady=4)

        self.labelErrorPointer = Label(self, text="◀")

        self.labellist = []
        self.entrylist = []
        self.verifylist = []
        self.misclist = []
                
        self.optionCreate = "Create"
        self.optionUpcoming = "Upcoming"
        self.optionPast = "Past"

        self.prevmode = self.optionCreate
        self.curmode = self.optionCreate
        self.optionvar = tkinter.StringVar(self)
        self.optionvar.trace("w",self.permaloop)
        self.optionvar.set(self.optionCreate)
        self.option = OptionMenu(self, self.optionvar, self.optionCreate, self.optionUpcoming, self.optionPast)

        self.optionpostmodevar = tkinter.StringVar(self)
        self.optionpostmodevar.trace("w",self.permaloop)
        self.optionpostmodevar.set('url')
        self.optionpostmode = OptionMenu(self, self.optionpostmodevar, 'url', 'text')

        self.labelText = Label(self, text='Selftext:')
        self.entryText = Text(self)
        self.labelURL = Label(self, text='URL:')
        self.entryURL = Entry(self)
        self.entryURL.configure(width=60)  

        self.sql = sqlite3.connect('sql.db')
        print('Loaded SQL Database')
        self.cur = self.sql.cursor()

        self.cur.execute('CREATE TABLE IF NOT EXISTS upcoming(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT)')
        self.cur.execute('CREATE TABLE IF NOT EXISTS past(ID TEXT, SUBREDDIT TEXT, TIME INT, TITLE TEXT, URL TEXT, BODY TEXT, POSTLINK TEXT)')
        self.cur.execute('CREATE TABLE IF NOT EXISTS internal(NAME TEXT, ID INT)')
        print('Loaded Completed table')
        self.cur.execute('SELECT * FROM internal')
        f = self.cur.fetchone()
        if not f:
            print('Database is new. Adding ID counter')
            self.cur.execute('INSERT INTO internal VALUES(?, ?)', ['counter', 1])
            self.idcounter = 1
        else:
            self.idcounter = f[1]
            print('Current ID counter: ' + str(self.idcounter))

        self.sql.commit()
        

        
        sw = self.parent.winfo_screenwidth()
        sh = self.parent.winfo_screenheight()


        w=853
        h=480
        x = (sw - w) / 2
        y = (sh - h) / 2

        self.parent.geometry('%dx%d+%d+%d' % (w, h, x, y-50))

        self.login()
        

    def login(self):

        try:
            self.quitbutton.grid_forget()
            self.quitbutton.grid(row=9000, column=0, columnspan=20)          

            self.option.grid(row=1,column=0,columnspan=80,pady=8)

            self.updategui(fullclean=True)
        except praw.errors.InvalidUserPass:
            pass
            print('Invalid username or password')
            self.entryPassword.delete(0,200)
            self.labelErrorPointer.grid(row=1, column=2)

    def permaloop(self, *args):
        self.curmode = self.optionvar.get()
        print('Was: ' + self.prevmode + ' | Now: ' + self.curmode)
        if self.curmode != self.prevmode:
            self.prevmode = self.curmode
            self.updategui(fullclean=True)
        else:
            self.updategui(False)

    def getTime(self, bool):
        timeNow = datetime.datetime.now(datetime.timezone.utc)
        timeUnix = timeNow.timestamp()
        if bool is False:
            return timeNow
        else:
            return timeUnix

    def addentrytobase(self, subreddit, title, url="", body="", mode="", ptime=""):
        curtime = round(self.getTime(True))
        try:
            t = self.entryMo.get() + ' ' + self.entryDa.get() + ' ' + self.entryYr.get() + ' ' + self.entryHH.get() + ':' + self.entryMM.get()
            plandate = datetime.datetime.strptime(t, "%B %d %Y %H:%M")
            plandate = plandate.timestamp()
        except ValueError:
            print('Invalid Day')
            return False

        if mode == 'url':
            url = self.entryURL.get()
            body = ""
            if 'http://' not in url and 'https://' not in url:
                print('Please enter a proper URL')
                return False
        if mode == 'text':
            body = self.entryText.get("1.0", "end")
            url = ""

        if plandate < curtime:
            print('Please enter a time in the future')
            return False

        if not all(char in string.ascii_letters+string.digits+'_-' for char in subreddit):
            print('Subreddit contains invalid characters')
            return False

        if len(subreddit) == 0:
            print('You must enter a subreddit')
            return False

        if len(title) == 0:
            print('You must enter a title')
            return False
        if len(title) > 300:
            print('Title is too long. ' + str(len(title)) + '/300 char max')
            return False
        if len(body) > 15000:
            print('Body is too long. ' + str(len(body)) + '/15,000 char max')

        print('Timestamp:', plandate)
        self.cur.execute('INSERT INTO upcoming VALUES(?, ?, ?, ?, ?, ?)', [self.idcounter, subreddit, int(plandate), title, url, body])
        self.idcounter += 1
        self.cur.execute('UPDATE internal SET ID=? WHERE NAME=?', [self.idcounter, 'counter'])
        self.sql.commit()
        print('\nPost Saved!')
        print(self.idcounter, subreddit, self.timestamptoday(int(plandate)))
        print(title)
        print(url, body)
        print()
        self.entryText.delete("1.0", "end")
        self.entryURL.delete(0, 'end')
        self.entryTitle.delete(0, 'end')
        #self.updategui(halfclean=True)

    def timestamptoday(self, timestamp):
        d = datetime.datetime.fromtimestamp(timestamp)
        info = datetime.datetime.strftime(d, "%b %d %H:%M")
        return info


    def dropentryfrombase(self, ID):
        if '-' not in ID:
            try:
                ID = int(ID)
                l = [ID]
            except ValueError:
                print('You must enter a number')
                return
        else:
            if ID.count('-') == 1:
                try:
                    ID = ID.replace(' ', '')
                    ID = ID.split('-')
                    ID[0] = int(ID[0])
                    ID[1] = int(ID[1])
                    if ID[1] > ID[0]:
                        l = list(range(ID[0], ID[1]+1))
                    else:
                        return
                except ValueError:
                    return

        for item in l:
            item = str(item)
            print('Dropping Item ' + item + ' from Upcoming')
            self.cur.execute('DELETE FROM upcoming WHERE ID=?', [item])
            self.sql.commit()
        self.updategui(fullclean=True)

    def printbasetofile(self, db):
        filea = open(db + '.txt', 'w')
        if db == 'past':
            self.cur.execute('SELECT * FROM past')
        if db == 'upcoming':
            self.cur.execute('SELECT * FROM upcoming')
        f = self.cur.fetchall()
        print('Printed ' + db + ' unimpeded to file')
        for item in f:
            i = list(item)
            i[2] = self.timestamptoday(i[2])
            i.remove('')

            print(str(i)[1:-1], file=filea)
        filea.close()

        


    def updategui(self, halfclean=False, fullclean=False):

        if self.curmode == self.optionCreate:
            try:
                print(self.optionpostmodevar.get())

                if self.optionpostmodevar.get() == 'url':
                    self.entryText.delete("1.0", 'end')
                    self.labelText.grid_forget()
                    self.entryText.grid_forget()
    
                    self.labelURL.grid(row=8, column=0, columnspan=30)
                    self.entryURL.grid(row=9, column=0, columnspan=12, pady=10)
    
                if self.optionpostmodevar.get() == 'text':
                    self.entryURL.delete(0, 'end')
                    self.labelURL.grid_forget()
                    self.entryURL.grid_forget()
    
                    self.labelText.grid(row=8, column=0, columnspan=30)
                    self.entryText.configure(width=40, height=8)
                    self.entryText.grid(row=9, column=0, columnspan=12)
            except AttributeError:
                pass

        if fullclean is True:
            print('Cleaning GUI')
            for item in self.labellist:
                item.grid_forget()
            for item in self.entrylist:
                item.grid_forget()
            for item in self.verifylist:
                item.grid_forget()
            for item in self.misclist:
                item.grid_forget()
            self.labellist = []
            self.entrylist = []
            self.verifylist = []
            self.misclist = []

            if self.curmode == self.optionCreate:
                self.newrowindex = 6
                self.labelSubreddit = Label(self, text="Subreddit:    /r/")
                self.labelTitle = Label(self, text="Post title:  ")
                self.entrySubreddit = Entry(self)
                self.entryTitle = Entry(self)


                self.labelHH = Label(self, text="Schedule time (Local timezone):")
                nowlist = datetime.datetime.strftime(datetime.datetime.now(), "%B %d %Y %H %M").split()

                self.entryMo = Spinbox(self, width=9, values=('January', 'February', 'March', 'April', 'May', 'June', 'July', \
                    'August', 'September', 'October', 'November', 'December'))
                self.entryMo.delete(0,'end')
                self.entryMo.insert(0, nowlist[0])


                self.entryDa = Spinbox(self, width=2, from_=1, to=31)
                self.entryDa.delete(0,'end')
                self.entryDa.insert(0, nowlist[1])

                self.entryYr = Spinbox(self, width=4, from_=2014, to=2500)
                self.entryYr.delete(0,'end')
                self.entryYr.insert(0, nowlist[2])

                self.entryHH = Spinbox(self, from_=0, to=23, width=2)
                self.entryHH.delete(0,'end')
                self.entryHH.insert(0, nowlist[3])

                self.entryMM = Spinbox(self, from_=0, to=59, width=2)
                self.entryMM.delete(0,'end')
                self.entryMM.insert(0, nowlist[4])

                self.buttonAddentry = Button(self, text='Save', command=lambda: self.addentrytobase(self.entrySubreddit.get(), self.entryTitle.get(),\
                    mode=self.optionpostmodevar.get()))


                self.misclist.append(self.labelSubreddit)
                self.misclist.append(self.entrySubreddit)
                self.misclist.append(self.labelHH)
                self.misclist.append(self.entryHH)
                self.misclist.append(self.entryMM)
                self.misclist.append(self.entryMo)
                self.misclist.append(self.entryDa)
                self.misclist.append(self.entryYr)
                self.misclist.append(self.labelTitle)
                self.misclist.append(self.entryTitle)
                self.misclist.append(self.buttonAddentry)
                self.misclist.append(self.optionpostmode)
                self.misclist.append(self.labelText)
                self.misclist.append(self.entryText)
                self.misclist.append(self.labelURL)
                self.misclist.append(self.entryURL)

                self.labelSubreddit.grid(row=2, column=0, sticky="e")
                self.labelTitle.grid(row=3, column=0, sticky="e")
                self.entrySubreddit.grid(row=2, column=1, columnspan=3, sticky="w")
                self.entryTitle.grid(row=3, column=1, columnspan=3, sticky="w")
                self.entryMo.grid(row=4, column=1,sticky="e")
                self.entryDa.grid(row=4, column=2)
                self.entryYr.grid(row=4, column=3)
                self.labelHH.grid(row=4, column=0, sticky="se", pady=5)
                self.entryHH.grid(row=5, column=1, sticky="e")
                self.entryMM.grid(row=5, column=2, sticky="w")
                self.optionpostmode.grid(row=6, column=0, columnspan=20, pady=10)
                self.buttonAddentry.grid(row=200, column=0, columnspan=20)

            if self.curmode == self.optionUpcoming:
                self.cur.execute('SELECT * FROM upcoming')
                dobutton = True

            if self.curmode == self.optionPast:
                self.cur.execute('SELECT * FROM past')
                dobutton = False

            if self.curmode == self.optionPast or self.curmode == self.optionUpcoming:

                
                self.listboxId = Listbox(self)
                self.listboxId.configure(width=118, height=20, font=("Courier 8"))
                self.misclist.append(self.listboxId)

                self.listboxScroller = Scrollbar(self, orient='horizontal', command=self.listboxId.xview)
                self.listboxScroller.grid(row=4, column=0, columnspan=900)
                self.listboxId.grid(row=3, column=0, columnspan=10)

                self.listboxId.configure(xscrollcommand=self.listboxScroller.set)
                self.misclist.append(self.listboxScroller)

                self.buttonPrinter = Button(self, text="Print to .txt file")
                if self.curmode == self.optionPast:
                    self.buttonPrinter.configure(command=lambda: self.printbasetofile('past'))
                if self.curmode == self.optionUpcoming:
                    self.buttonPrinter.configure(command=lambda: self.printbasetofile('upcoming'))   

                self.buttonPrinter.grid(row = 6, column=0, columnspan=90)
                self.misclist.append(self.buttonPrinter)

                if dobutton is True:
                    self.entryDelete = Entry(self)
                    self.buttonDelete = Button(self, text="Delete Item: ", command=lambda: self.dropentryfrombase(self.entryDelete.get()))
                    self.buttonDelete.grid(row=5, column=0, sticky='e')
                    self.entryDelete.grid(row=5, column=1, sticky='w')
                    self.misclist.append(self.entryDelete)
                    self.misclist.append(self.buttonDelete)


                fetched = self.cur.fetchall()
                for item in fetched:

                    info = self.timestamptoday(item[2])

                    if item[4] == '':
                        infx = item[5]
                    if item[5] == '':
                        infx = item[4]
                    if self.curmode == self.optionPast:
                        infy = '.' + item[6]
                    else:
                        infy = ''

                    self.listboxId.insert('end', \
                        item[0] + '.'*(6 - len(item[0])) \
                        + item[1][:10] + '.'*(12 - len(item[1][:10])) \
                        + info + '.'*(15 - len(info[:14])) \
                        + item[3][:18] + '.'*(20 - len(item[3][:14])) \
                        + infx[:45] + '.'*(47-len(infx[:45])) \
                        + infy)

                    
                



    def morerows(self, label, columnm, columnn, limit, *args):
        self.redditlabel = Label(self,text=label)
        self.redditlabel.grid(row=self.newrowindex,column=columnm, sticky="e")
        self.labellist.append(self.redditlabel)

        self.redditentry = Entry(self)
        self.redditentry.grid(row=self.newrowindex,column=columnn, columnspan=9)
        self.entrylist.append(self.redditentry)

        self.newrowindex += 1
        if self.newrowindex >= limit:
            self.morerowbutton.grid_forget()
        print(self.newrowindex)
コード例 #14
0
class adminPage(Frame):
    def __init__(self, parent, main, **kw):
        Frame.__init__(self, parent, **kw)
        self.main = main
        self.label_head = Label(text='Admin Page', font=MED_FONT)
        self.adm_stock_l = Label(text='Stock Name: ')
        self.adm_stock = StringVar()
        self.adm_stock_c = Combobox(textvariable=self.adm_stock)
        self.adm_ncost_l = Label(text='New Cost of Stock: ')
        self.adm_namount_l = Label(text='New number of stocks added: ')
        self.adm_namount = Entry()
        self.adm_ncost = Entry()
        self.adm_update_b = Button(text='UPDATE', command=self.update)
        self.back_b = Button(text='Log Out', command=self.back)
        self.view_f_text = Text(height=20, width=30)
        self.view_scroll = Scrollbar(orient=VERTICAL,
                                     command=self.view_f_text.yview)
        self.view_f_text.config(yscrollcommand=self.view_scroll.set)
        self.new_stock = False

    def back(self):
        self.main.show_frame(LOGIN_PAGE, ADMIN_PAGE)
        self.main.login = False
        self.main.admin = False

    def showItems(self, main):
        self.label_head.grid(column=0, row=0, columnspan=3)
        self.adm_stock_l.grid(column=0, row=1)
        self.adm_stock_c.grid(column=1, row=1)
        self.adm_stock_c.config(values=main.shares_dict.keys())
        self.adm_ncost_l.grid(column=0, row=2)
        self.adm_ncost.grid(column=1, row=2)
        self.adm_namount_l.grid(column=0, row=3)
        self.adm_namount.grid(column=1, row=3)
        self.adm_update_b.grid(column=0, row=4)
        self.back_b.grid(column=1, row=4)
        self.view_stock()
        self.view_f_text.grid(column=0, row=5, sticky='nsew', columnspan=2)
        self.view_scroll.grid(column=2, row=5, sticky='ns')

    def hideItems(self, main):
        self.label_head.grid_forget()
        self.adm_stock_l.grid_forget()
        self.adm_stock_c.grid_forget()
        self.adm_ncost_l.grid_forget()
        self.adm_ncost.grid_forget()
        self.adm_namount_l.grid_forget()
        self.adm_namount.grid_forget()
        self.adm_update_b.grid_forget()
        self.back_b.grid_forget()
        self.view_f_text.grid_forget()
        self.view_scroll.grid_forget()

    def update(self):
        stock_name = self.adm_stock.get()
        ncost = int(self.adm_ncost.get())
        namount = self.adm_namount.get()
        if ncost < 0:
            showinfo(message='Enter valid cost, Please check data')
            self.adm_ncost.delete(0, END)
        elif namount == '':
            namount = '0'
        elif int(namount) < 0:
            showinfo(message='Enter valid amount, Please check data')
            self.adm_namount.delete(0, END)

        elif stock_name not in self.main.shares_dict:
            if not self.new_stock:
                showinfo(
                    message=
                    'Are you sure you want to add this new stock \n Check the details once again'
                )
                self.new_stock = True
            else:
                self.main.shares_dict[stock_name] = {}
                self.main.shares_dict[stock_name]['cost'] = str(ncost)
                self.main.shares_dict[stock_name]['tot_amount'] = namount
                self.main.shares_dict[stock_name]['name'] = stock_name
                self.main.shares_dict[stock_name]['tot_sold'] = '0'
                self.new_stock = False
                buff = {
                    'tot_owned': '0',
                    'name': stock_name,
                    'money_spent': '0'
                }
                for name in self.main.users_dict:
                    self.main.users_dict[name].append(buff)
                self.adm_namount.delete(0, END)
                self.adm_ncost.delete(0, END)
                self.view_stock()
                self.adm_stock.set('')

        else:
            self.main.shares_dict[stock_name]['cost'] = str(ncost)
            tot_amount = int(self.main.shares_dict[stock_name]['tot_amount'])
            self.main.shares_dict[stock_name]['tot_amount'] = str(tot_amount +
                                                                  int(namount))
            self.adm_namount.delete(0, END)
            self.adm_ncost.delete(0, END)
            self.view_stock()

    def view_stock(self):
        self.view_f_text.config(state='normal')
        self.view_f_text.delete('1.0', 'end')
        key = self.main.shares_dict.keys()
        for name in key:
            li = self.main.shares_dict[name]
            txt_b1 = ' ' * 10 + 'Name: '
            self.view_f_text.insert('end', txt_b1)
            self.view_f_text.insert('end', name + '\n')
            txt_b2 = ' ' * 10 + 'Cost Price: '
            self.view_f_text.insert('end', txt_b2)
            self.view_f_text.insert('end', li['cost'] + '\n')
            available_num = int(li['tot_amount']) - int(li['tot_sold'])
            txt_b3 = ' ' * 10 + 'Available amount: '
            self.view_f_text.insert('end', txt_b3)
            self.view_f_text.insert('end', str(available_num) + '\n')
            txt_b4 = ' ' * 10 + '*' * 20
            self.view_f_text.insert('end', '\n' + txt_b4 + '\n\n')
        self.view_f_text.config(state='disabled')
コード例 #15
0
class SplitsView(Frame):
    """
    """
    def __init__(self, root, controller):
        super().__init__(root)

        self.controller = controller

        self._create()
        self._arrange()

    def _create(self):
        self.title_label = Label(self, text="--")
        self.split_button = Button(self,
                                   text="Split",
                                   command=self.controller.split_callback)
        self.skip_split_button = Button(
            self,
            text="Skip Split",
            command=self.controller.skip_split_callback)

        self.name_header = Label(self, text="Name".ljust(20))
        self.difference_header = Label(self, text="| Diff".ljust(8))
        self.best_header = Label(self, text="| Best Run".ljust(11))

        self.segment_area = Frame(self)
        self.segments = []

        self.open_button = Button(self,
                                  text="Open Split",
                                  command=self.controller.open_callback)
        self.new_button = Button(self,
                                 text="New Split",
                                 command=self.controller.new_callback)

    def _arrange(self):
        self.title_label.grid(row=0, column=0, columnspan=3)
        self.split_button.grid(row=1, column=0, columnspan=2)
        self.skip_split_button.grid(row=1, column=2, columnspan=2)

        self.name_header.grid(row=2, column=0)
        self.difference_header.grid(row=2, column=1)
        self.best_header.grid(row=2, column=2)

        self.segment_area.grid(row=3, column=0, columnspan=3)
        for segment in self.segments:
            segment.pack()

    def update(self, title, segments_data):
        self.title_label["text"] = title
        for widget in self.segment_area.winfo_children():
            widget.destroy()

        self.segments = [
            self.SegmentFrame(self.segment_area, segment)
            for segment in segments_data
        ]
        for segment in self.segments:
            segment.pack()

    def show_open_splitfile_buttons(self):
        if not self.open_button.winfo_ismapped():
            self.open_button.grid(row=4, column=0)
            self.new_button.grid(row=4, column=2)

    def hide_open_splitfile_buttons(self):
        if self.open_button.winfo_ismapped():
            self.open_button.grid_forget()
            self.new_button.grid_forget()

    class SegmentFrame(Frame):
        """
        """
        def __init__(self, root, segment_data):
            super().__init__(root)

            self._create(segment_data)
            self._arrange()

        def _create(self, segment_data):
            self.label = Label(self, text=segment_data.label.ljust(20))
            self.best_time_label = Label(self,
                                         text=Stopwatch.ms_to_time_str(
                                             segment_data.best_time).ljust(11))
            self.difference_label = Label(self, text="--".ljust(8))

        def _arrange(self):
            self.label.grid(row=0, column=0)
            self.difference_label.grid(row=0, column=1)
            self.best_time_label.grid(row=0, column=2)

        def update_segment_time(self, diff):
            self.difference_label["text"] = diff.ljust(8)