Ejemplo n.º 1
0
class DCGreenLanternWidget(Frame):
    """
    Green Lantern logo from DC comics
    (yeah yeah, i'm shitty artist, i know)
    """
    green = "#07A007"
    outline = "#FFFFFF"
    unpowered = '#C0C0C0'

    def __init__(self, parent, initial_state):
        Frame.__init__(self, parent)
        self.pack(fill=BOTH, expand=1)

        self.canvas = Canvas(self, cnf={'background': BACKGROUND_COLOR})

        # outer circle
        kw = {'outline': self.outline, 'fill': self.green}
        base = 30 * SCALE
        d = 190 * SCALE
        s = 10 * SCALE
        outer_circle = ((base, base, base + d - s, base + d),
                        (base + s, base + s, base + d - s - s, base + d - s))
        self.canvas.create_oval(*outer_circle[0], **kw)

        kw['fill'] = BACKGROUND_COLOR
        self.canvas.create_oval(*outer_circle[1], **kw)

        # inner circle
        kw = {'outline': self.outline, 'fill': self.green}
        base = 70 * SCALE
        d = 100 * SCALE
        s = 14 * SCALE
        outer_circle = ((base, base + s, base + d, base + d),
                        (base + s, base + s + s, base + d - s, base + d - s))
        self.canvas.create_oval(*outer_circle[0], **kw)

        kw['fill'] = initial_state[1] if initial_state[0] else self.unpowered
        self.item = self.canvas.create_oval(*outer_circle[1], **kw)

        # top bar
        self.canvas.create_rectangle(base,
                                     base,
                                     base + d,
                                     base + s,
                                     outline=self.green,
                                     fill=self.green)

        # bottom bar
        self.canvas.create_rectangle(base,
                                     base + d,
                                     base + d,
                                     base + d + s,
                                     outline=self.green,
                                     fill=self.green)
        self.canvas.pack(fill=BOTH, expand=1)

    def change_color(self, color):
        self.canvas.itemconfig(self.item, outline=color, fill=color)
Ejemplo n.º 2
0
class TkFrame(Frame):
    BORDER = 5
    LED_SIZE = 20

    def __init__(self, parent, controller):
        Frame.__init__(self, parent)
        self.CONTROLLER = controller

        # Setup the layout method
        self.pack(fill=BOTH, expand=1)

        # Add a canvas
        self.canvas = Canvas(self)
        self.canvas.pack(fill=BOTH, expand=1)

        # Setup the correct geometry
        total_width = 2*self.BORDER + self.CONTROLLER.WIDTH*self.LED_SIZE
        total_height = 2*self.BORDER + self.CONTROLLER.HEIGHT*self.LED_SIZE
        parent.geometry('{w}x{h}+300+300'.format(
            w=total_width,
            h=total_height
        ))

        # Add all the LEDs
        def make_led(x, y):
            y_top = self.BORDER + y*self.LED_SIZE
            x_left = self.BORDER + x*self.LED_SIZE
            return self.canvas.create_oval(
                x_left, y_top,
                x_left + self.LED_SIZE, y_top + self.LED_SIZE,
                outline='white',
                fill='white',
                width=1
            )

        self.LEDS = [
            [
                make_led(x, y)
                for y in xrange(self.CONTROLLER.HEIGHT)
            ]
            for x in xrange(self.CONTROLLER.WIDTH)
        ]

    def update(self):
        # Update all the LEDs
        for y in xrange(self.CONTROLLER.HEIGHT):
            for x in xrange(self.CONTROLLER.WIDTH):
                colour = self.CONTROLLER.get_rgba_xy(x, y)
                self.canvas.itemconfig(
                    self.LEDS[x][y],
                    fill=rgba_to_hex(*colour),
                )
Ejemplo n.º 3
0
class StartFrame(Frame):
    """Class which controls start screen of spelling aid"""
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        #Create UI elements
        self.start_canvas = Canvas(self, width=600, height=250, bg="#FFFFFF")
        self.start_canvas.pack()

        buttonStart = Button(self, text="Start", width=10,
                                  command=self.start)
        buttonEdit = Button(self, text="Edit Lists",
                            command=self.parent.show_editor)
        self.list_menu_var = StringVar(self)
        self.list_menu_var.set("Random List")
        self.start_canvas.create_window(300, 200, window=buttonStart)
        self.menu = self.start_canvas.create_window(300, 150)
        self.start_canvas.create_window(520, 230, window=buttonEdit)
        self.start_canvas.create_text(300, 100, font=("Helvetica", 25),
                                      text="Select a list:")
        self.update_list()
        self.update()


    def start(self):
        """Start the game with the selected list"""
        self.parent.start_game(self.selected_list)

    def update(self, event=None):
        """Change the current list to match selection"""
        list_name = self.list_menu_var.get()
        for word_list in self.parent.list_list:
            if word_list.name == list_name:
                self.selected_list = word_list

    def update_list(self):
        """Refreshes the list of lists"""
        list_menu = OptionMenu(self, self.list_menu_var,
                               *self.parent.list_list, command=self.update)
        list_menu.configure(width=30)
        self.start_canvas.itemconfig(self.menu, window=list_menu)
        
        
    def welcomeMessage(self):
        """Show the welcome message"""
        self.start_canvas.create_text((10, 10), anchor=NW, text="Welcome, %s."
                                      %(self.parent.user.username),
                                      font=("Helvetica", 15))
Ejemplo n.º 4
0
class DrawGrid(Frame):
    def __init__(self, parent, langton_ant):
        Frame.__init__(self, parent)
        self.parent = parent
        self.pack(fill=BOTH, expand=1)

        self.title = self.parent.title()

        self.rows = 101
        self.columns = 82
        self.cell_width = 6
        self.cell_height = 6

        self.canvas = Canvas(self, width=self.cell_width * self.columns, height=self.cell_height * self.rows,
                             borderwidth=0, highlightthickness=0)
        self.canvas.pack(side="top", fill="both", expand="true")

        self.rect = {}
        for column in range(self.columns):
            for row in range(self.rows):
                x1 = column * self.cell_width
                y1 = row * self.cell_height
                x2 = x1 + self.cell_width
                y2 = y1 + self.cell_height
                self.rect[row, column] = self.canvas.create_rectangle(x1, y1, x2, y2, fill="white", tags="rect",
                                                                      outline="gray")

        self.langton_ant = langton_ant
        self.draw_result(300)

    def draw_result(self, delay, step=0):
        """
        draw the grid and refresh
        """
        self.parent.title(self.title+" step: " + str(step))
        self.canvas.itemconfig("rect", fill="white")

        data = np.matrix(self.langton_ant.grid)
        nonzero_idx = data.nonzero()
        # dealing living cells (non zero matrix)
        for row,col in zip(nonzero_idx[0], nonzero_idx[1]):
            item_id = self.rect[row, col]
            self.canvas.itemconfig(item_id, fill="black")

        print_out_file(len(nonzero_idx[0]), "w" if step==0 else "a")
        self.langton_ant.next()
        self.after(delay, lambda: self.draw_result(delay, step+1))
class CaCanvas(Frame):
    def __init__(self, root, ca_width, ca_height, x_max, y_max):
        Frame.__init__(self, root)
        self.x_max = x_max
        self.y_max = y_max
        self.canvas = Canvas(self,
                             width=ca_width,
                             height=ca_height,
                             bg='white')
        self.canvas.pack()
        self.cell = [[None for x in range(x_max)] for y in range(y_max)]
        self.cell_count = [[0 for x in range(x_max)] for y in range(y_max)]
        self.x_scale = ca_width / x_max
        self.y_scale = ca_height / y_max
        self.create_grid()

    def create_grid(self):
        for x in range(self.x_max):
            for y in range(self.y_max):
                self.cell[x][y] = self.canvas.create_rectangle(
                    (x * self.x_scale, y * self.y_scale,
                     (x + 1) * self.x_scale, (y + 1) * self.y_scale),
                    outline='white',
                    fill='white')

    def set_on(self, x, y):
        self.canvas.itemconfig(self.cell[x][y], fill="black")
        self.cell_count[x][y] = 1

    def set_off(self, x, y):
        self.canvas.itemconfig(self.cell[x][y], fill="white")
        self.cell_count[x][y] = 0

    def count_cells(self):
        count = 0
        for x in range(self.x_max):
            for y in range(self.y_max):
                count += self.cell_count[x][y]
        return count

    def clear_cells(self):
        for x in range(self.x_max):
            for y in range(self.y_max):
                self.set_off(x, y)
Ejemplo n.º 6
0
class StartFrame(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.start_canvas = Canvas(self, width=600, height=250, bg="#FFFFFF")
        self.start_canvas.pack()

        buttonStart = Button(self, text="Start", width=10,
                                  command=self.start)
        buttonEdit = Button(self, text="Edit Lists",
                            command=self.parent.show_editor)
        self.list_menu_var = StringVar(self)
        self.list_menu_var.set("Random List")
        self.start_canvas.create_window(300, 200, window=buttonStart)
        self.menu = self.start_canvas.create_window(300, 150)
        self.start_canvas.create_window(520, 230, window=buttonEdit)
        self.start_canvas.create_text(300, 100, font=("Helvetica", 25),
                                      text="Select a list:")
        self.update_list()
        self.update()


    def start(self):
        self.parent.start_game(self.selected_list)

    def update(self, event=None):
        list_name = self.list_menu_var.get()
        for word_list in self.parent.list_list:
            if word_list.name == list_name:
                self.selected_list = word_list

    def update_list(self):
        list_menu = OptionMenu(self, self.list_menu_var,
                               *self.parent.list_list, command=self.update)
        list_menu.configure(width=30)
        self.start_canvas.itemconfig(self.menu, window=list_menu)
        
        
    def welcomeMessage(self):
        self.start_canvas.create_text((10, 10), anchor=NW, text="Welcome, %s."
                                      %(self.parent.user.username),
                                      font=("Helvetica", 15))
class CaCanvas(Frame):
    def __init__(self,root,ca_width,ca_height,x_max,y_max):
        Frame.__init__(self,root)
        self.x_max = x_max
        self.y_max = y_max
        self.canvas = Canvas(self,width=ca_width,height=ca_height,bg='white')
        self.canvas.pack()
        self.cell = [[None for x in range(x_max)] for y in range(y_max)]
        self.cell_count = [[0 for x in range(x_max)] for y in range(y_max)]
        self.x_scale = ca_width/x_max
        self.y_scale = ca_height/y_max
        self.create_grid()
    
    def create_grid(self):
        for x in range(self.x_max):
            for y in range(self.y_max):
                self.cell[x][y] = self.canvas.create_rectangle((x*self.x_scale,y*self.y_scale,(x+1)*self.x_scale,(y+1)*self.y_scale),outline='white',fill='white')
                
    def set_on(self,x,y):
        self.canvas.itemconfig(self.cell[x][y], fill="black")
        self.cell_count[x][y]=1

        
    def set_off(self,x,y):
        self.canvas.itemconfig(self.cell[x][y], fill="white")
        self.cell_count[x][y]=0

    def count_cells(self):
        count = 0
        for x in range(self.x_max):
            for y in range(self.y_max): 
                count+=self.cell_count[x][y]
        return count
        
    def clear_cells(self):
        for x in range(self.x_max):
            for y in range(self.y_max): 
                self.set_off(x,y)
Ejemplo n.º 8
0
class GameGui(Tk):
    score = None
    autorun = False

    def __init__(self, parent):
        Tk.__init__(self)
        self.parent = parent

        # Game title
        self.title("gamelogic")

        # Geometry
        self.geometry("{0}x{1}+0+0".format(545, (self.winfo_screenheight() / 2) + 250))
        self.columnconfigure(1, weight=5)

        # Game
        self.game = Game()

        # MinMax
        self.algorithm = None

        # Key Bindings
        self.bind('<Left>', self.move)
        self.bind('<Right>', self.move)
        self.bind('<Up>', self.move)
        self.bind('<Down>', self.move)
        self.bind('<n>', self.move)
        self.bind('<a>', self.move)

        # Outline of the gui
        #########################
        ##  Game Score here    ##
        #########################
        ##  Game Board here    ##
        #########################
        ##  Menu Button here   ##
        #########################

        ## Score ##

        self.score_label = Label(self, text='Sum', font=("Helvetica", 32, "bold")).grid(row=0, column=0, padx=20,
                                                                                        pady=0)
        self.score = Label(self, text="0", font=("Helvetica", 32, "bold")).grid(row=0, column=1)

        self.move = 0
        self.moves_label = Label(self, text='Moves', font=("Helvetica", 32, "bold")).grid(row=1, column=0, padx=20,
                                                                                          pady=0)
        self.moves = Label(self, text="0", font=("Helvetica", 32, "bold")).grid(row=1, column=1)

        ## Board ##
        self.board = Canvas(self, width=(self.winfo_screenwidth() / 2) - 400, height=(self.winfo_screenheight() / 2),
                            highlightthickness=0, borderwidth=0)
        self.board.grid(row=2, column=0, columnspan=2, sticky=E + W, padx=10, pady=10)

        ## Menu ##
        how_to = Label(self, text='Move with arrow keys \n <a> to auto-run \n <n> to jump one step',
                       font=("Helvetica", 12)).grid(row=3, column=0, padx=20, pady=20)
        # btn = Button(self, text="Close", command=partial(parent.openMenuFrame, self))
        # btn.grid(row=2, column=0)

        btn = Button(self, text="End Game", command=partial(parent.openMenuFrame, self))
        btn.grid(row=3, column=1, padx=20, pady=20)

        # Draw the initial grid
        self.draw(self.game.grid)

    def draw(self, grid):
        self.board.delete("all")

        for y in range(0, 4, 1):
            for x in range(0, 4, 1):
                top = y * sq_size
                left = x * sq_size
                bottom = y * sq_size + sq_size - 2
                right = x * sq_size + sq_size - 2

                # Create tiles and text
                item = self.board.create_rectangle(left, top, right, bottom)

                # Add the items
                self.board.itemconfig(item, fill=colors[grid[y][x]], outline="#ff0000")
                self.board.create_text((right - sq_size) + (sq_size / 2), (top + sq_size) - (sq_size / 2),
                                       text=str(grid[y][x]), font=("Helvetica", 32, "bold"))
                # self.board.itemconfig(item_text)
                # self.board.create_rectangle(left, top, right, bottom, fill=colors[grid[y][x]])

    def move(self, key, keycode=None):
        # Stop autorun
        self.autorun = False

        if keycode:
            code = keycode
        else:
            code = key.keycode

        if code == 8320768 or code == 38:
            self.game.move(Direction.Up)
        elif code == 8189699 or code == 39:
            self.game.move(Direction.Right)
        elif code == 8255233 or code == 40:
            self.game.move(Direction.Down)
        elif code == 8124162 or code == 37:
            self.game.move(Direction.Left)
        # Algorithm
        # one next
        elif code == 2949230 or code == 78:
            if not self.algorithm:
                self.algorithm = MinMax(self, self.game)
            dir, highest = self.algorithm.run()
            self.game.move(dir)
        # auto
        elif code == 97 or code == 65:
            if not self.algorithm:
                self.algorithm = MinMax(self, self.game)
            self.autorun = True
            self.auto()

        self.draw(self.game.grid)
        self.score = Label(self, text=str(self.game.calculate_score()), font=("Helvetica", 32, "bold")).grid(row=0,
                                                                                                             column=1)

    def auto(self):
        dir, highest = self.algorithm.run()

        # No direction returned, game over
        if not dir:
            self.autorun = False
            print 'Game over!'
            print self.score
            gameOver(highest, self)
            return

        self.game.move(dir)

        self.draw(self.game.grid)

        #Update labels
        self.score = Label(self, text=str(self.game.calculate_score()), font=("Helvetica", 32, "bold")).grid(row=0,
                                                                                                             column=1)
        self.move += 1
        self.moves = Label(self, text=str(self.move), font=("Helvetica", 32, "bold")).grid(row=1, column=1)
        if self.autorun:
            self.after(1, lambda: self.auto())
Ejemplo n.º 9
0
class World(Tk):
    def __init__(self,filename=None,block=50,debug=True,delay=0.25,image=False,width=10,height=10):
#    def __init__(self,filename=None,block=50,debug=True,delay=0.25,image=True,width=10,height=10):
        Tk.__init__(self)
        self.title("")
        arg, self.width, self.height = block, width, height
#        self.photos = [PhotoImage(file=(k+".gif")) for k in ["east","north","west","south"]]
        self.beepers, self.ovals, self.numbers, self.robots, self.walls = {},{},{},{},{}
        self.m, self.n, self.t, self.delay = arg*(width+3), arg*(height+3), arg, delay
        self.debug, self.useImage = debug, image
        a, b, c = self.t+self.t/2, self.m-self.t-self.t/2, self.n-self.t-self.t/2
        self.canvas = Canvas(self, bg="white", width=self.m, height=self.n)
        self.canvas.pack()
        count = 1
        for k in range(2*self.t, max(self.m,self.n)-self.t, self.t):
            if k < b: 
                self.canvas.create_line(k, c, k, a, fill="red")
                self.canvas.create_text(k, c+self.t/2, text=str(count), font=("Times",max(-self.t*2/3,-15),""))
            if k < c: 
                self.canvas.create_line(b, k, a, k, fill="red")
                self.canvas.create_text(a-self.t/2, self.n-k, text=str(count), font=("Times",max(-self.t*2/3,-15),""))
            count += 1
        self.canvas.create_line(a, c, b, c, fill="black", width=3)
        self.canvas.create_line(a, a, a, c, fill="black", width=3)
        if filename is not None:
            self.readWorld(filename)
        self.refresh()

    def readWorld(self,filename):
        try:
            infile = open("worlds\\%s.wld" % filename, "r")
        except IOError:
           try:
               infile = open("worlds/%s.wld" % filename, "r")
           except IOError:
               infile = open(filename, "r")            
        text = infile.read().split("\n")
        infile.close()
        for t in text:
            if t.startswith("eastwestwalls"):
                s = t.split(" ")
                y, x = int(s[1]), int(s[2])
                self.addWall(x, y, -1, y)
            if t.startswith("northsouthwalls"):
                s = t.split(" ")
                x, y = int(s[1]), int(s[2])
                self.addWall(x, y, x, -1)
            if t.startswith("beepers"):
                s = t.split(" ")
                y, x, n = int(s[1]), int(s[2]), int(s[3])
                if n is infinity:
                    self.addInfiniteBeepers(x, y)
                else:
                    for k in range(n):
                        self.addBeeper(x, y)

    def pause(self):
        sleep(self.delay)

    def isBeeper(self,x,y):
        return (x,y) in self.beepers.keys() and not self.beepers[(x,y)] == 0

    def countRobots(self,x,y):
        if (x,y) not in self.robots.keys():
            return 0
        return len(self.robots[(x,y)])

    def crash(self,x1,y1,x2,y2):
        if 0 in (x1,y1,x2,y2):
            return True
        if (x2,y2) in self.walls.keys() and (x1,y1) in self.walls[(x2,y2)]:
            return True
        if (x1,y1) in self.walls.keys() and (x2,y2) in self.walls[(x1,y1)]:
            return True        
        return False

    def addInfiniteBeepers(self,x,y):
        flag = (x,y) not in self.beepers.keys() or self.beepers[(x,y)] is 0        
        self.beepers[(x,y)] = infinity
        text = "oo"
        a, b = self.t+x*self.t, self.n-(self.t+y*self.t)
        t = self.t/3
        if flag:
            self.ovals[(x,y)] = self.canvas.create_oval(a-t, b-t, a+t, b+t, fill="black")
            self.numbers[(x,y)] = self.canvas.create_text(a, b, text=text, fill="white", font=("Times",max(-self.t/2,-20),""))
        else:
            self.canvas.itemconfig(self.numbers[(x,y)], text=text)
        if (x,y) in self.robots.keys():
            for robot in self.robots[(x,y)]:
                robot.lift()

    def addBeeper(self,x,y):
        if (x,y) in self.beepers.keys() and self.beepers[(x,y)] is infinity:
            return
        flag = (x,y) not in self.beepers.keys() or self.beepers[(x,y)] is 0
        if flag:
            self.beepers[(x,y)] = 1
        else:
            self.beepers[(x,y)] += 1
        text = str(self.beepers[(x,y)])
        a, b = self.t+x*self.t, self.n-(self.t+y*self.t)
        t = self.t/3
        if flag:
            self.ovals[(x,y)] = self.canvas.create_oval(a-t, b-t, a+t, b+t, fill="black")
            self.numbers[(x,y)] = self.canvas.create_text(a, b, text=text, fill="white", font=("Times",max(-self.t/2,-20),""))
        else:
            self.canvas.itemconfig(self.numbers[(x,y)], text=text)
        if (x,y) in self.robots.keys():
            for robot in self.robots[(x,y)]:
                robot.lift()            

    def removeBeeper(self,x,y):
        if self.beepers[(x,y)] is infinity:
            return        
        self.beepers[(x,y)] -= 1
        flag = self.beepers[(x,y)] is 0        
        text = str(self.beepers[(x,y)])
        if flag:
            self.canvas.delete(self.ovals[(x,y)])
            self.canvas.delete(self.numbers[(x,y)])            
        else:
            self.canvas.itemconfig(self.numbers[(x,y)], text=text)
        if (x,y) in self.robots.keys():
            for robot in self.robots[(x,y)]:
                robot.lift()            

    def addWall(self,x1,y1,x2,y2):
        if not x1 == x2 and not y1 == y2:
            return
        if x1 == x2:
            y1, y2 = min(y1, y2), max(y1, y2)
            if y1 == -1:
                y1 = y2
            for k in range(y1, y2+1):
                self.walls.setdefault((x1,k), []).append((x1+1,k))
                a, b = self.t+x1*self.t+self.t/2, self.n-(self.t+k*self.t)+self.t/2
                c, d = self.t+x1*self.t+self.t/2, self.n-(self.t+k*self.t)-self.t/2
                self.canvas.create_line(a, b+1, c, d-1, fill="black", width=3)                
        else:
            x1, x2 = min(x1, x2), max(x1, x2)
            if x1 == -1:
                x1 = x2
            for k in range(x1, x2+1):
                self.walls.setdefault((k,y1), []).append((k,y1+1))
                a, b = self.t+k*self.t-self.t/2, self.n-(self.t+y1*self.t)-self.t/2
                c, d = self.t+k*self.t+self.t/2, self.n-(self.t+y1*self.t)-self.t/2
                self.canvas.create_line(a-1, b, c+1, d, fill="black", width=3)

    def draw(self,x,y,d,img):
#       if self.useImage:
#           if img is not None:
#               self.canvas.delete(img)
#           x, y = self.t+x*self.t, self.n-(self.t+y*self.t)
#           photo = self.photos[d/90]
#           img = self.canvas.create_image(x, y, image=photo)            
#           return img
#       else:
        t, angle = self.t/2, 120
        x, y = self.t+x*self.t, self.n-(self.t+y*self.t)
        x1, y1 = x+3**0.5*t/2*cos(radians(d)), y-3**0.5*t/2*sin(radians(d))
        x2, y2 = x+t*cos(radians(d+angle)), y-t*sin(radians(d+angle))
        x3, y3 = x+t/4*cos(radians(d+180)), y-t/4*sin(radians(d+180))
        x4, y4 = x+t*cos(radians(d-angle)), y-t*sin(radians(d-angle))
        if img is not None:
            self.canvas.delete(img)
        img = self.canvas.create_polygon(x1, y1, x2, y2, x3, y3, x4, y4, fill="blue")
        return img

    def erase(self,img):
        self.canvas.delete(img)

    def recordMove(self,count,x1,y1,x2,y2):
        for robot in self.robots[(x1,y1)]:
            if robot.count == count:
                self.robots[(x1,y1)].remove(robot)
                self.robots.setdefault((x2,y2), []).append(robot)                
                break

    def lift(self,img):
        self.canvas.lift(img)

    def refresh(self):
        self.canvas.update()
        self.pause()

    def register(self,x,y,robot):
        self.robots.setdefault((x,y), []).append(robot)

    def remove(self,x,y,robot):
        self.robots[(x,y)].remove(robot)
Ejemplo n.º 10
0
class Ex(Frame):
    def __init__(self,parent):
        Frame.__init__(self,parent)
        self.parent = parent
        self.x_before = 20
        self.x_current = 20
        self.y_before = 200
        self.y_current = 200
        self.FirstRun = True
        self.initUI()
        self.runRandWalk(STEPS)
        self.FirstRun = False

    def initUI(self):
        self.parent.title("Random Walk Lines 1")
        self.pack(fill=BOTH,expand=1)
        
        self.style = Style()
        self.style.theme_use("default")
        frame = Frame(self,relief=RAISED,borderwidth=2)
        frame.pack(fill=BOTH,expand=True)

        self.canvas = Canvas(frame)
        self.canvas.create_line(10,200,390,200,dash=(4,2), width=2)
        self.canvas.pack(fill=BOTH,expand=1)
        
        self.newWalkButton = Button(self,text="New Walk",
                                   command=self.newWalk)
        self.closeButton   = Button(self,text="Close",
                                    command=self.closeAll)

        # pack the buttons here
        self.closeButton.pack(side=RIGHT,padx=5,pady=5)
        self.newWalkButton.pack(side=RIGHT)


    def newWalk(self):
        for x in range(0,STEPS):
            getTag = "step"+str(x)
            self.canvas.coords(getTag,(0,0,0,0))


        self.x_current = 20
        self.x_before  = 20
        self.y_current = 200
        self.y_before  = 200
        self.runRandWalk(STEPS)
        
    def closeAll(self):
        Frame.quit(self)

    def RandWalk(self,whichStep):
        r = random.randint(0,1)
        addval = 0;
        toTag = "step"+str(whichStep)
        if r == 0:
            addval = ADDVAL
        else:
            addval = -ADDVAL
            
        self.y_current = self.y_before + addval
        self.x_current = self.x_before + XSTEP
                
        if self.y_current < 200:
            if self.y_before == 200:
                if self.FirstRun == True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                              self.x_current,self.y_current),)
                    self.canvas.itemconfig(toTag,fill="green")
            else:
                if self.FirstRun == True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:                    
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="green")
        else:
            if self.y_before<200:
                if self.FirstRun==True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="green")
            else:
                if self.FirstRun==True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "red", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="red")

                
        self.canvas.pack(fill=BOTH,expand=1)
        self.x_before = self.x_current
        self.y_before = self.y_current
                    

    def runRandWalk(self,steps):
        for x in range(0,steps):
            self.RandWalk(x)
Ejemplo n.º 11
0
class NvimTk(object):
    """Wraps all nvim/tk event handling."""
    def __init__(self, nvim):
        """Initialize with a Nvim instance."""
        self._nvim = nvim
        self._attrs = {}
        self._nvim_updates = deque()
        self._canvas = None
        self._fg = '#000000'
        self._bg = '#ffffff'

    def run(self):
        """Start the UI."""
        self._tk_setup()
        t = Thread(target=self._nvim_event_loop)
        t.daemon = True
        t.start()
        self._root.mainloop()

    def _tk_setup(self):
        self._root = Tk()
        self._root.bind('<<nvim_redraw>>', self._tk_nvim_redraw)
        self._root.bind('<<nvim_detach>>', self._tk_nvim_detach)
        self._root.bind('<Key>', self._tk_key)

    def _tk_nvim_redraw(self, *args):
        update = self._nvim_updates.popleft()
        for update in update:
            handler = getattr(self, '_tk_nvim_' + update[0])
            for args in update[1:]:
                handler(*args)

    def _tk_nvim_detach(self, *args):
        self._root.destroy()

    def _tk_nvim_resize(self, width, height):
        self._tk_redraw_canvas(width, height)

    def _tk_nvim_clear(self):
        self._tk_clear_region(0, self._height - 1, 0, self._width - 1)

    def _tk_nvim_eol_clear(self):
        row, col = (
            self._cursor_row,
            self._cursor_col,
        )
        self._tk_clear_region(row, row, col, self._scroll_right)

    def _tk_nvim_cursor_goto(self, row, col):
        self._cursor_row = row
        self._cursor_col = col

    def _tk_nvim_cursor_on(self):
        pass

    def _tk_nvim_cursor_off(self):
        pass

    def _tk_nvim_mouse_on(self):
        pass

    def _tk_nvim_mouse_off(self):
        pass

    def _tk_nvim_insert_mode(self):
        pass

    def _tk_nvim_normal_mode(self):
        pass

    def _tk_nvim_set_scroll_region(self, top, bot, left, right):
        self._scroll_top = top
        self._scroll_bot = bot
        self._scroll_left = left
        self._scroll_right = right

    def _tk_nvim_scroll(self, count):
        top, bot = (
            self._scroll_top,
            self._scroll_bot,
        )
        left, right = (
            self._scroll_left,
            self._scroll_right,
        )

        if count > 0:
            destroy_top = top
            destroy_bot = top + count - 1
            move_top = destroy_bot + 1
            move_bot = bot
            fill_top = move_bot + 1
            fill_bot = fill_top + count - 1
        else:
            destroy_top = bot + count + 1
            destroy_bot = bot
            move_top = top
            move_bot = destroy_top - 1
            fill_bot = move_top - 1
            fill_top = fill_bot + count + 1

        # destroy items that would be moved outside the scroll region after
        # scrolling
        # self._tk_clear_region(destroy_top, destroy_bot, left, right)
        # self._tk_clear_region(move_top, move_bot, left, right)
        self._tk_destroy_region(destroy_top, destroy_bot, left, right)
        self._tk_tag_region('move', move_top, move_bot, left, right)
        self._canvas.move('move', 0, -count * self._rowsize)
        self._canvas.dtag('move', 'move')
        # self._tk_fill_region(fill_top, fill_bot, left, right)

    def _tk_nvim_highlight_set(self, attrs):
        self._attrs = attrs

    def _tk_nvim_put(self, data):
        # choose a Font instance
        font = self._fnormal
        if self._attrs.get('bold', False):
            font = self._fbold
        if self._attrs.get('italic', False):
            font = self._fbolditalic if font == self._fbold else self._fitalic
        # colors
        fg = "#{0:0{1}x}".format(self._attrs.get('foreground', self._fg), 6)
        bg = "#{0:0{1}x}".format(self._attrs.get('background', self._bg), 6)
        # get the "text" and "rect" which correspond to the current cell
        x, y = self._tk_get_coords(self._cursor_row, self._cursor_col)
        items = self._canvas.find_overlapping(x, y, x + 1, y + 1)
        if len(items) != 2:
            # caught part the double-width character in the cell to the left,
            # filter items which dont have the same horizontal coordinate as
            # "x"
            predicate = lambda item: self._canvas.coords(item)[0] == x
            items = filter(predicate, items)
        # rect has lower id than text, sort to unpack correctly
        rect, text = sorted(items)
        self._canvas.itemconfig(text, fill=fg, font=font, text=data or ' ')
        self._canvas.itemconfig(rect, fill=bg)
        self._tk_nvim_cursor_goto(self._cursor_row, self._cursor_col + 1)

    def _tk_nvim_bell(self):
        self._root.bell()

    def _tk_nvim_update_fg(self, fg):
        self._fg = "#{0:0{1}x}".format(fg, 6)

    def _tk_nvim_update_bg(self, bg):
        self._bg = "#{0:0{1}x}".format(bg, 6)

    def _tk_redraw_canvas(self, width, height):
        if self._canvas:
            self._canvas.destroy()
        self._fnormal = Font(family='Monospace', size=13)
        self._fbold = Font(family='Monospace', weight='bold', size=13)
        self._fitalic = Font(family='Monospace', slant='italic', size=13)
        self._fbolditalic = Font(family='Monospace',
                                 weight='bold',
                                 slant='italic',
                                 size=13)
        self._colsize = self._fnormal.measure('A')
        self._rowsize = self._fnormal.metrics('linespace')
        self._canvas = Canvas(self._root,
                              width=self._colsize * width,
                              height=self._rowsize * height)
        self._tk_fill_region(0, height - 1, 0, width - 1)
        self._cursor_row = 0
        self._cursor_col = 0
        self._scroll_top = 0
        self._scroll_bot = height - 1
        self._scroll_left = 0
        self._scroll_right = width - 1
        self._width, self._height = (
            width,
            height,
        )
        self._canvas.pack()

    def _tk_fill_region(self, top, bot, left, right):
        # create columns from right to left so the left columns have a
        # higher z-index than the right columns. This is required to
        # properly display characters that cross cell boundary
        for rownum in range(bot, top - 1, -1):
            for colnum in range(right, left - 1, -1):
                x1 = colnum * self._colsize
                y1 = rownum * self._rowsize
                x2 = (colnum + 1) * self._colsize
                y2 = (rownum + 1) * self._rowsize
                # for each cell, create two items: The rectangle is used for
                # filling background and the text is for cell contents.
                self._canvas.create_rectangle(x1,
                                              y1,
                                              x2,
                                              y2,
                                              fill=self._bg,
                                              width=0)
                self._canvas.create_text(x1,
                                         y1,
                                         anchor='nw',
                                         font=self._fnormal,
                                         width=1,
                                         fill=self._fg,
                                         text=' ')

    def _tk_clear_region(self, top, bot, left, right):
        self._tk_tag_region('clear', top, bot, left, right)
        self._canvas.itemconfig('clear', fill=self._bg)
        self._canvas.dtag('clear', 'clear')

    def _tk_destroy_region(self, top, bot, left, right):
        self._tk_tag_region('destroy', top, bot, left, right)
        self._canvas.delete('destroy')
        self._canvas.dtag('destroy', 'destroy')

    def _tk_tag_region(self, tag, top, bot, left, right):
        x1, y1 = self._tk_get_coords(top, left)
        x2, y2 = self._tk_get_coords(bot, right)
        self._canvas.addtag_overlapping(tag, x1, y1, x2 + 1, y2 + 1)

    def _tk_get_coords(self, row, col):
        x = col * self._colsize
        y = row * self._rowsize
        return x, y

    def _tk_key(self, event):
        if 0xffe1 <= event.keysym_num <= 0xffee:
            # this is a modifier key, ignore. Source:
            # https://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm
            return
        # Translate to Nvim representation of keys
        send = []
        if event.state & 0x1:
            send.append('S')
        if event.state & 0x4:
            send.append('C')
        if event.state & (0x8 | 0x80):
            send.append('A')
        special = len(send) > 0
        key = event.char
        if _is_invalid_key(key):
            special = True
            key = event.keysym
        send.append(SPECIAL_KEYS.get(key, key))
        send = '-'.join(send)
        if special:
            send = '<' + send + '>'
        nvim = self._nvim
        nvim.session.threadsafe_call(lambda: nvim.input(send))

    def _nvim_event_loop(self):
        self._nvim.session.run(self._nvim_request, self._nvim_notification,
                               lambda: self._nvim.attach_ui(80, 24))
        self._root.event_generate('<<nvim_detach>>', when='tail')

    def _nvim_request(self, method, args):
        raise Exception('This UI does not implement any methods')

    def _nvim_notification(self, method, args):
        if method == 'redraw':
            self._nvim_updates.append(args)
            self._root.event_generate('<<nvim_redraw>>', when='tail')
Ejemplo n.º 12
0
fill_color = "pink"
root.geometry(config_string)
cell_size = 20
canvas = Canvas(root, height = win_height)
canvas.pack(fill='both', expand = 'yes')

field_height = win_height // cell_size
field_width = win_width // cell_size

cell_matrix = []
cell_matrix_verif = []

for i in range(field_height):
    for j in range(field_width):
        square = canvas.create_rectangle(2 + cell_size * j, 2 + cell_size * i, cell_size + cell_size * j - 2, cell_size + cell_size * i - 2, fill = fill_color)
        canvas.itemconfig(square, state=HIDDEN, tags=('hid','0'))
        cell_matrix.append(square)
        cell_matrix_verif.append(square)
fict_square = canvas.create_rectangle(0,0,0,0, state=HIDDEN, tags=('hid','0'))
cell_matrix.append(fict_square)
cell_matrix_verif.append(fict_square)

#configuration de base a l'ouverture du programme
canvas.itemconfig(cell_matrix[addpoint(8, 8)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addpoint(10, 9)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addpoint(9, 9)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addpoint(9, 8)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addpoint(9, 7)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addpoint(10, 7)], state=NORMAL, tags='vis')
iii = 0
jjj = 0
Ejemplo n.º 13
0
class GameFrame(Frame):
    
    def __init__(self, parent):
        Frame.__init__(self, parent, width=600, height=250)
        self.parent = parent    
       
    def init_gui(self):

        correct = """R0lGODlhQABAAOeqAAAAAAABAAACAAADAAAEAAAFAAAFAQAGAQAHAQEHAQEIAQEJAQEKAQEKAgEL
AgEMAgENAgEPAgIPAgIQAgIRAwITAwIUAwIVBAMVBAIWAwIWBAIXBAMXBAMYAwIZBAMZBAMaBQMb
BAMdBQMeBQMfBQMgBQQgBQQiBgQkBgQlBgQmBwQnBwUnBgUoBwUqBwUrBwUsBwUsCAUtCAUuCAUv
CAYvCAUxCAYyCQYzCAY0CQY1CgY2CQY3CQc3CgY5Cgc5Cgc7Cgc+Cwg/CwdACwhACwhBCwhCCwhG
DAhHDAhIDQlLDQlMDglNDglPDglQDglRDglSDgpUDwpWDwtWDwpXDwpZDwtaEAtfEQtgEQthEQxk
EQxkEgxlEgxnEgxoEw1oEgxpEgxqEw1qEg1rEwxsEw1sEg1tEw1vEw1wFA1yFA5yFA1zFA50FA50
FQ51FA52FQ95Fg56FQ57Fg97FQ99Fg9+Fg9/Fg+AFhCAFg+BFhCCFhCEFxCGFxCHGBCIGBCKGBGK
GBCLGBGMGRGNGRGOGRGQGRGRGRGRGhGSGRGTGhKTGRKTGhGUGhKVGhKXGhKXGxKYGhKaGxKbGxKc
GxKdGxKdHBOdGxOdHBKeHBOeGxOeHBOfHBOgHBOhHBOiHBOiHROjHBOjHROkHRSkHROlHRSlHRSm
HRSnHRSoHRSrHv//////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
SU1QACH5BAEKAP8ALAAAAABAAEAAAAj+AP8JHEiwoMGDCBMqPAhgocOHEB0CaBixosWFEyde3MhR
YEaKHUNC/CiyJMYHCTSaXGkQgAcVKVnKHAhgBZIIIGeanAiki4acOkVOlJInBNCgHQEIELOIxFGk
GwFASLNJxVOoFgFUiFOKx1WsEQFY0GOqiQCwIQF0ECSqi4KvaDGKWNRJjgW4cRMCOEGI06AWePMy
ROGnU6QggQUXBIBij6dPUBIrptk4lKkuAiRPBpCCT6hQdipoVgxgBB9PnAzBGC0YQAY7mzRJWsI6
L4AIazTpVkNg8kgFXDhpwqTorm+JA6aE0kRpk47acQEkMUVJU6cs0NEC8FGKEiVOfQb+ZMcKgMWk
TM0joRgPFQCIQMw1bXpy9rjC22+Ea+IUZwJ7pAZcIVx1jdjwX1AAKFHJJt5lgsWBOgGwAyScUHKJ
JoJIAKFMpRlSIXOj3LAhSwAkgMeHlIDixYgkauGdJpds4ggFLO5EhCOaWMKcKUMEEGFaJfzBoG6d
vAEBgipl9cAZoFRXXSQ41OgRAAHUJgATp1Sn2yZjJNBeARi8FZYMoGByoW6IrEbeD04Y9RAAFBwy
JHOYdCFlS1T8UQROCwVgxocwapIIB3cuBsAWppgxQ5KLGfGibpSI4kShLTnQRiqEWPHBUQCYAJ9u
zHHCxwGUtiQCH6RwYscRBOS0QBjKsYGqCSk1lMpQDoxs0okjaVjVEABCVBIfc6CwccBxADwxCaiF
VEHqBosAqhsnMdiaUABoDCsJIDq40YmZkIJCBgP2/VMiIAxWd4kkTsr6SA7W3ndBJMPJai8naSBQ
Lk0zxKalvZo00kO8DgXAxID2UmLJHARLtAAYsdorCQ0NS/TBHcMytwkdFb8JgyHDYuKJCx2/OcQm
mFhCSScM73tfFNRhMsoLJY+UwBeneAKHly7fZ0EdqOxQc0UAvFBGBT0/JEAD9SWN0XEBAQA7
"""
        wrong = """R0lGODlhQABAAOexAAAAAAEAAAIAAAMAAAQAAAUAAAYAAAgAAAkAAAoAAAwAAA0AAA4AAA8AABAA
ABEAABIAABMAABQAABUAABYAABcAABgAABkAABoAABsAABwAAB0AAB4AAB8AACAAACEAACIAACMA
ACQAACUAACYAACgAACkAACoAACsAACwAAC0AAC4AADEAADMAADQAADUAADYAADgAADkAADoAADsA
ADwAAD0AAD4AAD8AAEEAAEIAAEQAAEUAAEkAAEoAAEsAAFQAAFUAAFgAAFkAAF0AAF8AAGEAAGIA
AGQAAGcAAGgAAGoAAGsAAG0AAG4AAG8AAHAAAHMAAHgAAHsAAHwAAIEAAIYAAIoAAI4AAJMAAJQA
AJUAAJYAAJcAAJgAAJkAAJoAAJsAAJwAAJ0AAJ4AAKAAAKEAAKQAAKcAAKgAAKkAAKoAAK0AAK4A
AK8AALAAALEAALMAALUAALcAALgAALkAALoAALsAAL4AAL8AAMAAAMEAAMQAAMUAAMYAAMgAAMkA
AMoAAMwAAM0AAM4AAM8AANAAANEAANIAANMAANQAANUAANYAANcAANgAANkAANoAANsAAN0AAN4A
AOAAAOEAAOIAAOMAAOQAAOYAAOgAAOkAAOoAAOwAAO0AAO4AAO8AAPAAAPEAAPIAAPMAAPQAAPUA
APYAAPcAAPgAAPkAAPoAAPsAAPwAAP0AAP4AAP8AAP//////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBH
SU1QACH5BAEKAP8ALAAAAABAAEAAAAj+AP8JHEhwIAAABRMqXLjwIMOHCQFAgIAQosWGFjRUvNhQ
A5sxDTZyvAggwhpAK0SOFAigwxxXo7aEXGmxZBlSqwbFUMmx5Z1To0qN4oKAJ02DCsiQEmqKUA2j
DwFsoFOKFKlRpE55CQB1JQABZE5dtVqqEIyuES28STXW6ihWXxweNQhAzCqsVq+eMpQCrUEKamCN
wpt3VKsvBPwyBEDASyvChVcdKuEXQIU0giEXVtVFgWKFCbKo0lyY1SEVXQFcaJM5r+u8pbY4+ExQ
AZbXuK+uQjTDKAAMckaTdh00pueRCK6IEpqb+ClEOVSqliN0+OugpbgkrinASinmzYn+l0KEYyMA
Cm3EWseNVZUXuQ0BVFnVNvxrU4peIATQ4AzM9c0ZtlVqVAhmX4CpKBLCQR8UYkp9BxLHShdFKUTA
FDBFyB4ppugBwn4m8CGWhuydIpNKBkxhCoD2mXLHhwad8MeKJLKnBQMbFSAFKODVeJUpe4ggHQiH
0OjjVUJtcQBCAkTBI4u5jXLKIBz4VsEjQB05FipdHLTEKdUdKWUjE6QmQSMPQskeK1sQ4QqEGmJl
SiMSVKbBIOppOYoqj6lJXFaFbPAZACT0kaeYcEaI1SmBnEDbPwCgYKiWlOZ1iiAsPMoSCYMYWSmJ
QTGS0lwAaNBIlp8qWoolJGhaEAD+EjziaapRlpIJjHMZVEGRiaYqJyWU5foqCH8cSuuWjrTgalQn
iHisa6csYsOyEAFgAiCzVhqUJOUJG5UHiWSL6Ca9eVstBYw8mKonZ5lbUxOspJoKGvC5q1AASbDi
Z4CrgFGhvQkN0ESatI6CChgPUAvRAFB40uOxYkSg8EIBONGJuNpWZcYCE7+qxFKDPesWh2psZy4A
R7TS67F7viFAxwAg8UrIIrO3ShwJKCwAE6nQXDN7qLxBwbIDPBHKyj9bZUobGq0kwBOdPJz0dUvB
cQFtADARSpg+yrlvYRzaMVtNSLDlM6ikdJLu1yOfwse/DR0xM9tYlcLJCxIgQrD+mKgAMtO9SvSJ
6CmUTAsAB37s3TUqfmTA0wBOjKwlKpDsUBGheIyo5yl6tEoQw1Gz/eMkPIgEwAh5oKrlKXl4/s8B
DWN8IFaadPtqBn2gIrqcf6BwUAaCCIdoKDs1xMAfPW+uiQv7vaCIumiX8ol+USHg7NelYPKDeTgg
InWAWWFSbrUN1KG4fVhVIoR0OSCiOvioRKID1mpVxWJQlhDhmwyI3HXgKZEonVcywAboBegUmghC
alRwCH0FKHvzOwoAJuAG3R3QEz2oTAkM4T+qfWJ8EkwAHDronE9EsCYpKMT7sBIK6gkLAAFow2jE
wwkfPAoAMCBEVcZiCk0U72RWBEiD4jAxBFcBgAaEoBEqJmE7dwFgATcRSikuYQRqASAGg1DFKSAh
QIBBCgJh4NAmijAxAKxAEJiwnBcN4gAwdAIIHYNUB24Qx8U8QFn2guEaI/KZgAAAOw=="""
        self.correct_img = PhotoImage(data=correct)
        self.wrong_img = PhotoImage(data=wrong)
        self.entry = Entry(self.parent, width=15, 
                           font=('Helvetica', 20, 'normal'), justify=CENTER)
        self.entry.bind("<Return>", lambda x:self.buttonSubmit.invoke())
        self.buttonNext = Button(self.parent, width=10, text="Next Word",
                            command=self.next_word, state=DISABLED)
        self.buttonSubmit = Button(self.parent, width=10, text="Submit",
                              command=self.submit_word)
        buttonReplay = Button(self.parent, width=10, text="Repeat Word",
                              command=self.replay_word)
        self.game_canvas = Canvas(self, width=600, height=250, bg="#FFFFFF")
        self.word_display = self.game_canvas.create_text((300, 105), text="?",
                           font=("Helvetica", 50, "bold"), fill="#004183")
        self.progress_display = self.game_canvas.create_text((593, 5),
                                text="%d/%d"%(1, self.parent.list_length),
                                font=("Helvetica", 25, "bold"), anchor=NE)
        self.timer_display = self.game_canvas.create_text(10, 5, anchor=NW,
                                                        font=("Helvetica", 25))
        self.progress_bar = ProgressBar(self, width=300,
                                       increments=len(self.parent.current_list.words))
        self.game_canvas.create_window(500, 10, anchor=NE, window=self.progress_bar)
        self.game_canvas.create_window(300, 180, window=self.entry)
        self.game_canvas_image = self.game_canvas.create_image(500, 170)
        self.game_canvas.create_window(150, 230, window=buttonReplay)
        self.game_canvas.create_window(300, 230, window=self.buttonSubmit)
        self.game_canvas.create_window(450, 230, window=self.buttonNext)
        self.game_canvas.pack()
        
    def start(self):
        self.current_list_iter = iter(self.parent.current_list.words)
        self.current_word = self.current_list_iter.next()
        self.parent.festival.speech(self.current_word)
        self.time_elapsed = 0
        self.init_gui()
        self.tick()

    def next_word(self):
        try:
            self.current_word = self.current_list_iter.next()
            index = self.parent.current_list.words.index(self.current_word) + 1
            self.game_canvas.itemconfig(self.progress_display, text="%d/%d"
                                   %(index, self.parent.list_length))
            if index == self.parent.list_length:
                self.buttonNext.configure(text="Finish")
            self.game_canvas.itemconfig(self.word_display, text="?", fill="#004183")
            self.game_canvas.itemconfig(self.game_canvas_image, state=HIDDEN)
            self.buttonSubmit.configure(state=NORMAL)
            self.buttonNext.configure(state=DISABLED)
            self.parent.festival.speech(self.current_word)
        except StopIteration:
            self.list_complete()

    def list_complete(self):
        self.parent.after_cancel(self.timer)
        self.parent.show_results(self.time_elapsed)
        

    def replay_word(self):
       self.parent.festival.speech(self.current_word)

    def submit_word(self, event=None):
        guess = self.entry.get()
        self.entry.delete(0, END)
        if guess == self.current_word.word:
            self.correct(guess)
        else:
            self.incorrect(guess)
        self.game_canvas.itemconfig(self.word_display, text='%s'%(self.current_word))
        self.buttonNext.configure(state=NORMAL)
        self.buttonSubmit.configure(state=DISABLED)
        self.game_canvas.itemconfig(self.game_canvas_image, state=NORMAL)
        

    def correct(self, guess):
        self.current_word.setAnswer(guess, True)
        self.game_canvas.itemconfig(self.game_canvas_image, image=self.correct_img)
        self.game_canvas.itemconfig(self.word_display, fill="#139E1C")
        self.progress_bar.increment(True)

    def incorrect(self, guess):
        self.current_word.setAnswer(guess, False)
        self.game_canvas.itemconfig(self.game_canvas_image, image=self.wrong_img)
        self.game_canvas.itemconfig(self.word_display, fill="#F30000")
        self.progress_bar.increment(False)

    def tick(self):
        seconds = (self.time_elapsed)%60
        minutes = self.time_elapsed/60
        separator = ":" if seconds > 9 else ":0"
        formatted_time = "%d%s%d"%(minutes, separator, seconds)
        self.game_canvas.itemconfig(self.timer_display, text=formatted_time)
        self.time_elapsed +=1
        self.timer = self.parent.after(1000, self.tick)
Ejemplo n.º 14
0
gen_root.geometry(config_string)
gen_cell_size = 20
gen_canvas = Canvas(gen_root, height=gen_height)
gen_canvas.pack(fill=BOTH)

gen_field_height = gen_height / gen_cell_size
gen_field_width = gen_width / gen_cell_size

# Make a 2D array of cell
gen_cell_matrix = []
for i in xrange(gen_field_height):
    for j in xrange(gen_field_width):
        # Create a cell
        gen_square = gen_canvas.create_rectangle(2 + gen_cell_size*j, 2 + gen_cell_size*i, gen_cell_size + gen_cell_size*j - 2, gen_cell_size + gen_cell_size*i - 2, fill=gen_color)
        # Make this cell hidden
        gen_canvas.itemconfig(gen_square, state=HIDDEN, tags=('hid', '0'))
        gen_cell_matrix.append(gen_square)
# It is a dummy element, it's kind of out of the box everywhere
gen_fict_square = gen_canvas.create_rectangle(0, 0, 0, 0, state=HIDDEN, tags=('hid', '0'))
gen_cell_matrix.append(gen_fict_square)


# Add glider
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(3, 3)], state=NORMAL, tags='vis')
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(3, 4)], state=NORMAL, tags='vis')
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(3, 5)], state=NORMAL, tags='vis')
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(4, 2)], state=NORMAL, tags='vis')
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(4, 3)], state=NORMAL, tags='vis')
gen_canvas.itemconfig(gen_cell_matrix[gen_addr(4, 4)], state=NORMAL, tags='vis')
# Add board. It is diferent representation the game fild
board = set()
Ejemplo n.º 15
0
class carGUI:

    carDict = {}
    carIDs = []

    def __init__(self, master):
        self.master = master
        master.title("A simple GUI")

        # Initialize Canvas
        self.canv = Canvas(master)
        self.canv.pack(fill='both', expand=True)

        # Initialize X-Lane
        self.xTop = self.canv.create_line(0,
                                          470,
                                          1000,
                                          470,
                                          fill='black',
                                          tags=('top'))
        self.xBottom = self.canv.create_line(0,
                                             510,
                                             1000,
                                             510,
                                             fill='black',
                                             tags=('left'))

        # Initialize Y-Lane
        self.yLeft = self.canv.create_line(470,
                                           0,
                                           470,
                                           1000,
                                           fill='blue',
                                           tags='right')
        self.yRight = self.canv.create_line(510,
                                            0,
                                            510,
                                            1000,
                                            fill='blue',
                                            tags='bottom')

        # Highlight Intersection
        self.rect = self.canv.create_rectangle(470,
                                               470,
                                               510,
                                               510,
                                               fill='green')

        # Show Regulation Lines
        self.xLimit = self.canv.create_line(470 - 40,
                                            450,
                                            470 - 40,
                                            530,
                                            fill="red")
        self.yLimit = self.canv.create_line(450,
                                            470 - 40,
                                            530,
                                            470 - 40,
                                            fill="red")

        # Create button to begin simulation
        b = Button(text="Start Simluation!", command=self.simClickListener)
        b.pack()

        # Create checkbox to differentiate real world sim from autonomous sim
        self.CheckVar = IntVar()
        self.checkConventional = Checkbutton(text="Conventional System", variable=self.CheckVar, \
            onvalue=1, offvalue=0, height=5)
        self.checkConventional.pack()

        # Create text fields to show first in queue cars
        self.carDisplayX = self.canv.create_text(10,
                                                 10,
                                                 anchor="nw",
                                                 fill="red")
        self.carDisplayY = self.canv.create_text(600,
                                                 10,
                                                 anchor="nw",
                                                 fill="black")

    def drawCar(self, lane, ID):

        if (lane == 1):
            # Draw an X car
            self.rect = self.canv.create_rectangle(0,
                                                   485,
                                                   10,
                                                   495,
                                                   fill='black')
        elif (lane == 2):
            # Draw a Y car
            self.rect = self.canv.create_rectangle(485, 0, 495, 10, fill='red')

        self.canv.addtag_below(self.rect, "HELLO")

        # Register the ID of the car
        self.carIDs.append(ID)
        # Ad the key value pair to the car dictionary for the GUI
        self.carDict[ID] = self.rect

    def moveCars(self, carList, timeInterval):

        self.master.update_idletasks()  # THIS UPDATES THE GUI

        for i in range(0, len(carList)):
            self.canv.move(self.carDict[carList[i].ID],
                           carList[i].velocityX * timeInterval,
                           carList[i].velocityY * timeInterval)

    def highlightCar(self, car, color):
        self.canv.itemconfig(self.carDict[car.ID], fill=color)

    def simClickListener(self):
        from Simulation import simulation as sim
        sim(self)

    def updateCarInformationDisplay(self, car):
        carData = "position X = " + str(car.positionX) + "\nposition Y = " + \
            str(car.positionY) + "\nvelocity X = " + str(car.velocityX) + \
            "\nvelocity Y = " + str(car.velocityY)

        if (car.velocityX > 0):
            self.canv.itemconfig(self.carDisplayX, text=carData)

        else:
            self.canv.itemconfig(self.carDisplayY, text=carData)
Ejemplo n.º 16
0
Archivo: tron.py Proyecto: yingted/tron
class TronClient(object):
	"""non-threadsafe client which mimics the Turing API"""
	OUTCOME="tie","win","lose","tie"
	def __init__(self,*args):
		self._t=self._x=self._y=self.t=self.x=self.y=-1
		self.outcome="ongoing"
		self.sock=None
		self.full=[[False]*49 for _ in xrange(50)]
		self.show=False
		self.root=self.cvs=None
		self.dropped=0
		if args:
			self.start(*args)
	def start(self,user=None,pw=None,host="",port=PORT):
		if isinstance(user,str)and not isinstance(pw,str):
			user,pw,host,port=None,None,user,pw if pw is not None else port
		self.sock=create_connection((host,port))
		setsockopt(self.sock,option=TCP_NODELAY)
		buf=""
		if user is not None:
			buf+='L'+pack(STRUCT_UP_LOGIN,user,pw)
		buf+='S'
		self.sock.sendall(buf)
	startlogin=start
	def _recv(self):
		self._t,self._x,self._y,a=unpack(STRUCT_DOWN_FRAME,self.sock.recv(calcsize(STRUCT_DOWN_FRAME)))
		setsockopt(self.sock)
		self._t-=1
		self._x-=1
		self._y-=1
		if self._x!=-1:
			self.t=self._t+1
			if self._t>1 and(self.x!=self._x or self.y!=self._y):
				self.dropped+=1
			self.x=self._x
			self.y=self._y
		else:
			self._close()
			outcome=self.OUTCOME[self._y+1]
			self.__init__()
			self.outcome=outcome
		for i in xrange(50):
			for j in xrange(49):
				k=i*49+j
				self.full[i][j]=(ord(a[k/8])>>(k%8))&1==1
		if self.show:
			if not self.root:
				self.root=Tk()
				self.root.resizable(0,0)
				self.root.protocol("WM_DELETE_WINDOW",self._close)
				self.root.wm_title(argv[0])
				self.cvs=Canvas(self.root,width=201,height=197,highlightthickness=0)
				self.cvs.pack()
				self.rects=[[self.cvs.create_rectangle(4*i,4*j,4*(i+1),4*(j+1))for j in reversed(xrange(49))]for i in xrange(50)]
			for i in xrange(50):
				for j in xrange(49):
					self.cvs.itemconfig(self.rects[i][j],fill="#088"if i==self.x and j==self.y else"#ccc"if self.full[i][j]else"white")
			self.root.update()
		elif self.root:
			self.root.destroy()
			self.root=self.cvs=self.rects=None
	def ended(self):
		if not self.sock:
			return True
		err=False
		if self.t>=0:
			assert abs(self._x-self.x)+abs(self._y-self.y)<=self.t-self._t and(self.t!=self._t+1 or(self._x-self.x)**2+(self._y-self.y)**2==1)
			try:
				self.sock.sendall(pack(STRUCT_UP_MOVE,self.t+1,self.x+1,self.y+1))
			except IOError:
				err=True
		try:
			self._recv()
		except IOError:
			err=True
		if err:
			self._close()
		return not self.sock
	def _close(self):
		if self.sock:
			try:
				self.sock.shutdown(SHUT_RDWR)
			except error:
				pass
		try:
			self.sock.close()
		except:
			pass
		self.sock=None
	def __iter__(self):
		while not self.ended():
			yield self
	def __repr__(self):
		return"<"+self.__class__.__name__+"@%(dropped)d/%(t)d (%(x)d,%(y)d) %(outcome)s>"%self.__dict__
Ejemplo n.º 17
0
class PlayerApp(Frame):
    def __init__(self, root, player):
        Frame.__init__(self, root)
        self.root = root
        self.config(bd=0, bg='black', highlightbackground='black')
        self.pack()
        self._canvas = Canvas(root,
                              width=(WIN_WIDTH),
                              height=WIN_HEIGHT,
                              bd=0,
                              bg='black',
                              highlightbackground='black')
        self._canvas.pack()

        self.player = player

        self._img_mode = 4
        self._img_mode_count = 6

        # Scale the size to with the entire width of our window.
        # TODO(igorc): Avoid scaling? Or auto-rescale when window resizes.
        frame1_size = self.player.get_frame_size()
        img1_aspect = frame1_size[0] / 2 / frame1_size[1]
        img1_width = int(WIN_WIDTH * 0.95)
        self._img1_size = (img1_width, int(img1_width / img1_aspect))

        if self.player.is_fin_enabled() or self.player.is_kinect_enabled():
            text_y = 0.07
            img1_y = 0.28
            img2_y = 0.56
        else:
            text_y = 0.04
            img1_y = 0.23
            img2_y = 0.54

        # Undo gamma correction in LED preview, otherwise it is too dark.
        # Keep a fixed value to have better feedback on LED gamma changes.
        left_x = int(WIN_WIDTH * 0.025)
        self._img1 = ImageTk.PhotoImage('RGBA', self._img1_size, gamma=2.2)
        self._img2 = ImageTk.PhotoImage('RGBA', self._img1_size)
        self._canvas.create_image(left_x,
                                  int(WIN_HEIGHT * img1_y),
                                  anchor='nw',
                                  image=self._img1)
        self._canvas.create_image(left_x,
                                  int(WIN_HEIGHT * img2_y),
                                  anchor='nw',
                                  image=self._img2)

        if self.player.is_fin_enabled():
            img3_width = int(WIN_WIDTH * 0.15)
            # The fin dimensions are 150x240 inches.
            self._img3_size = (img3_width, int(img3_width * 1.1))
            self._img3 = ImageTk.PhotoImage('RGBA', self._img3_size, gamma=2.2)
            left_scale = 0.60 if self.player.is_kinect_enabled() else 0.65
            self._canvas.create_image(int(WIN_WIDTH * left_scale),
                                      int(WIN_HEIGHT * 0.05),
                                      anchor='nw',
                                      image=self._img3)

        if self.player.is_kinect_enabled():
            img4_width = int(WIN_WIDTH * 0.15)
            self._img4_size = (img4_width, int(img4_width * 0.7))
            self._img4 = ImageTk.PhotoImage('RGB', self._img4_size, gamma=2.2)
            self._canvas.create_image(int(WIN_WIDTH * 0.8),
                                      int(WIN_HEIGHT * 0.08),
                                      anchor='nw',
                                      image=self._img4)

        self._main_label = self._canvas.create_text(
            (left_x, WIN_HEIGHT * text_y),
            fill='#fff',
            anchor='nw',
            justify='left',
            font=("Sans Serif", 16))
        self._canvas.itemconfig(self._main_label, text="this is the text")

        self.root.bind('q', lambda e: player.volume_up())
        self.root.bind('a', lambda e: player.volume_down())
        self.root.bind('m', lambda e: self.switch_mask())
        self.root.bind('g', lambda e: player.gamma_up())
        self.root.bind('b', lambda e: player.gamma_down())
        self.root.bind('h', lambda e: player.visualization_volume_up())
        self.root.bind('n', lambda e: player.visualization_volume_down())
        self.root.bind('v', lambda e: player.toggle_visualization())
        self.root.bind('t', lambda e: self.toggle_visualizer_render())
        self.root.bind('d', lambda e: player.toggle_hdr_mode())
        self.root.bind('o', lambda e: player.select_next_preset(False))
        self.root.bind('p', lambda e: player.select_next_preset(True))
        self.root.bind('l', lambda e: player.lock_screen())
        self.root.bind('0', lambda e: player.stop_effect())
        self.root.bind('1', lambda e: player.play_effect('slowblink'))
        self.root.bind('2', lambda e: player.play_effect('radiaterainbow'))
        self.root.bind('3', lambda e: player.play_effect('threesine'))
        self.root.bind('4', lambda e: player.play_effect('plasma'))
        self.root.bind('5', lambda e: player.play_effect('rider'))
        self.root.bind('6', lambda e: player.play_effect('flame'))
        self.root.bind('7', lambda e: player.play_effect('glitter'))
        self.root.bind('8', lambda e: player.play_effect('slantbars'))
        self.root.bind('9', lambda e: player.play_effect('textticker'))
        self.root.bind('!', lambda e: player.play_effect('solidcolor'))
        self.root.bind('@', lambda e: player.play_effect('randompixels'))
        self.root.bind('#', lambda e: player.play_effect('teststripes'))
        self.root.bind('$', lambda e: player.play_effect('blink'))
        self.root.bind('%', lambda e: player.play_effect('chameleon'))
        self.root.bind('^', lambda e: player.play_effect('indicator'))
        self.root.bind('&', lambda e: player.play_effect('flick'))
        self.root.bind('*', lambda e: player.play_effect('textstay'))
        self.root.bind('<space>', lambda e: player.toggle())
        self.root.bind('<Up>', lambda e: player.prev())
        self.root.bind('<Down>', lambda e: player.next())
        self.root.bind('<Left>', lambda e: player.skip_backward())
        self.root.bind('<Right>', lambda e: player.skip_forward())
        self.root.protocol('WM_DELETE_WINDOW', lambda: self.quit())
        self.root.after(1000 / FPS / 4, lambda: self.update())
        self.running = True

    def run_effect(self, effect):
        self.player.effect = effect

    def switch_mask(self):
        self._img_mode += 1
        self._img_mode = self._img_mode % self._img_mode_count

    def toggle_visualizer_render(self):
        if (self._img_mode % 3) == 0:
            self._img_mode += 1
        elif (self._img_mode % 3) == 2:
            self._img_mode += 2
        else:
            self._img_mode += 2
        self._img_mode = self._img_mode % self._img_mode_count

    def quit(self):
        self.running = False

    def _paste_images(self, images, mode):
        # Always use LED image as the first image.
        frame1 = images[2].copy() if images[2] else None
        frame3 = images[3].copy() if images[3] else None
        frame4 = images[4].copy() if images[4] else None

        crop_rect = None
        frame_size = self.player.get_frame_size()
        if mode < 3:
            crop_rect = (0, 0, frame_size[0] / 2, frame_size[1])
        else:
            crop_rect = (frame_size[0] / 2, 0, frame_size[0], frame_size[1])
        if frame1:
            frame1 = frame1.crop(crop_rect)

        if (mode % 3) == 0:
            # Second is intermediate image by default.
            frame2 = images[1].copy() if images[1] else None
            if frame2:
                frame2 = frame2.crop(crop_rect)
        elif (mode % 3) == 1:
            # Otherwise show original image.
            frame2 = images[0].copy() if images[0] else None
            if frame2 and mode >= 3:
                frame2 = frame2.transpose(Image.FLIP_LEFT_RIGHT)
        else:
            # Show black if disabled.
            frame2 = Image.new('RGBA', self._img1_size, (0, 0, 0, 0))

        if frame1:
            self._img1.paste(frame1.resize(self._img1_size))
        if frame2:
            self._img2.paste(frame2.resize(self._img1_size))
        if frame3:
            # Dorsal fin
            self._img3.paste(frame3.resize(self._img3_size))
        if frame4:
            # Kinect
            self._img4.paste(frame4.resize(self._img4_size))

    def update(self):
        try:
            mode = self._img_mode
            if (mode % 3) == 1 and self.player.is_playing_effect():
                mode -= 1
            need_original = (mode % 3) == 1
            need_intermediate = (mode % 3) == 0
            images = self.player.get_frame_images(need_original,
                                                  need_intermediate)
            if images:
                self._paste_images(images, mode)
            status_lines = self.player.get_status_lines()
            self._canvas.itemconfig(self._main_label,
                                    text='\n'.join(status_lines))
            # TODO(igorc): Reschedule after errors.
            self.root.after(1000 / FPS / 4, lambda: self.update())
        except KeyboardInterrupt:
            self.quit()
Ejemplo n.º 18
0
class SudokuGraphicalUserInterface(Interface, Frame):
	"""GUI class for the PAC Sudoku game."""
	def __init__(self, config_file_handler, master=None):
		"""Builds and initializes the GUI as a Interface type if instance.
		
		First, the Interface instance attributes are created, additionally
		the following instance attributes are created:
		solve_action_set -- Set of methods for the solve menu actions
		settings_action_set -- Set of methods for the settings menu actions
		play_action_set -- Set of methods for the play menu actions
		gui_builder -- Set of methods for building the PAC Sudoku GUI
		config_file -- XMLFileHandler object with the config file loaded
		interactive -- Sudokuinteractive initialized as None
		violation -- Violation flag set to False
		currently_editing -- Canvas image ID of a square initialized as None
		timer -- Sudoku timer
		_timer_increment -- Used to increment by 1 second the timer
		
		"""
		Interface.__init__(self, config_file_handler)
		self.solve_action_set = SudokuGUISolveActionSet(self)
		self.settings_action_set = SudokuGUISettingsActionSet(self)
		self.play_action_set = SudokuGUIPlayActionSet(self)
		self.gui_builder = SudokuGUIBuilder(self)
		self.config_file = config_file_handler
		self.interactive = None
		self.violation = False
		self.currently_editing = None
		self.timer = datetime(1900, 1, 1)
		self._timer_increment = timedelta(seconds=1)
		Frame.__init__(self, master)
		self.pack()
		self._create_widgets()
	
	def run(self):
		"""Starts the graphical User Interface for the PAC Sudoku game."""
		print "\n\nStarting the graphical user interface ..."
		self.master.title("PAC Sudoku")
		self.master.minsize(362, 462)
		self.master.protocol("WM_DELETE_WINDOW", self.quit_handler)
		self.mainloop()
		
	def start_interactive_mode(self):
		"""Initializes the interactive mode for solving sudokus.
		
		A new Sudokuinteractive instance is created since which will
		be handled all interactive actions.
		
		Additionally 2 new event bindings will be used:
		Left Mouse Button: For selecting a square in the sudoku field.
		Key Pressed: For populating the selected square.
		
		And one new instance attribute is created:
		last_game_start -- Records the start time of the new game.
		
		"""
		self.reset_interactive()
		self.interactive = SudokuInteractive(self.input_matrix.first_matrix)
		self.sudoku_canvas.bind("<Button-1>", self._init_update_square)
		self.sudoku_canvas.bind_all(
			"<Key>",
			self.play_action_set.update_square_action
		)
		self.last_game_start = self.interactive.game_start()
		self._init_update_time()

	def continue_interactive_mode(self, memory_pos):
		"""Initializes the interactive mode for saved sudokus.
		
		Any Sudokuinteractive instance need to be reset, afterwards
		memory.pos will be read from interactive.memory to get time
		and input matrix. Interactive.matrix will also be restored
		according to memory data.
		
		"""
		previous_time, interactive_matrix, input_matrix, name = \
										self.interactive.load_game(memory_pos)
		if not interactive_matrix:
			return False
		self._reset_input_matrix()
		self.input_matrix = MatrixHandler(input_matrix)
		self.reset_interactive()
		self.interactive = SudokuInteractive(input_matrix)
		del(self.interactive.matrix)
		self.interactive.matrix = MatrixHandler(interactive_matrix)
		self.build_squares_from_interactive_matrix()
		self.sudoku_canvas.bind("<Button-1>", self._init_update_square)
		self.sudoku_canvas.bind_all(
			"<Key>",
			self.play_action_set.update_square_action
		)
		self.last_game_start = time.clock() - previous_time
		self.timer += timedelta(seconds=int(previous_time))
		self._init_update_time()
		return True

	def build_squares_from_input_matrix(self):
		"""Draws a new sudoku from input_matrix and starts interactive mode.
		
		Once a sudoku has been loaded or generated, draw the sudoku canvas
		with fix squares for the numbers fix numbers in input_matrix using
		small GIF images built by gui_builder. The zeroes are left blank.
		
		This method also creates a new instance attribute:
		square_item_matrix -- 9x9 matrix containing all canvas image item IDs
		
		"""
		self.square_item_matrix = []
		for i in range(9):
			current_square_item_list = []
			for j in range(9):
				current_square_item_list.append(
					self.sudoku_canvas.create_image(
						40 * j + 22,
						40 * i + 22,
						image=self.list_fix_squares[
							self.input_matrix.first_matrix[i][j]
						]
					)
				)
			self.square_item_matrix.append(current_square_item_list)

	def build_squares_from_interactive_matrix(self):
		"""Draws a saved sudoku and starts interactive mode.
		
		Once a sudoku has been loaded or generated, draw the sudoku canvas
		with fix squares for the numbers fix numbers in input_matrix and 
		draw open numbers for the numbers in saved sudoku using
		interactive.matrix.
		
		This method also creates a new instance attribute:
		square_item_matrix -- 9x9 matrix containing all canvas image item IDs
		
		"""
		self.square_item_matrix = []
		for i in range(9):
			current_square_item_list = []
			for j in range(9):
				input_value = self.input_matrix.first_matrix[i][j]
				interactive_value = self.interactive.matrix.first_matrix[i][j]
				if input_value:
					target_square = self.list_fix_squares[input_value]
				else:
					target_square = self.list_open_squares[interactive_value]
				current_square_item_list.append(
					self.sudoku_canvas.create_image(
						40 * j + 22,
						40 * i + 22,
						image=target_square
					)
				)
			self.square_item_matrix.append(current_square_item_list)

	def reset_interactive(self):
		"""Terminates interactive mode.
		
		Instance attribute interactive is set to None and events created by
		start_interactive_mode are disabled.
		
		Also violation and currently_editing instance attributes are reset.
		
		"""
		if self.interactive is not None:
			self._reset_time()
			del(self.interactive)
			self.violation = False
			self.currently_editing = None
			self.interactive = None
			self.sudoku_canvas.unbind("<Button-1>")
			self.sudoku_canvas.unbind_all("<Key>")
	
	def reset_display(self):
		"""Cleans the canvas and resets timer and input_matrix."""
		self._reset_input_matrix()
		self.sudoku_canvas.destroy()
		self.sudoku_canvas = Canvas(
			self.sudoku_frame,
			width=360,
			height=360,
			bg="white"
		)
		self.sudoku_canvas.pack(side="top")
		self.sudoku_canvas.create_line(122, 0, 122, 362, width=2)
		self.sudoku_canvas.create_line(242, 0, 242, 362, width=2)
		self.sudoku_canvas.create_line(0, 122, 362, 122, width=2)
		self.sudoku_canvas.create_line(0, 242, 362, 242, width=2)
		self.timer = datetime(1900, 1, 1)
		self.time_label.configure(text=self.timer.strftime("%H:%M:%S"))

	def _create_widgets(self):
		"""Calls the gui_builder methods to build the PAC Sudoku GUI"""
		self.gui_builder.build_gui_frames()
		self.gui_builder.build_top_frame_content()
		self.gui_builder.build_main_frame_content()
		self.gui_builder.build_bottom_frame_content()

	def _reset_time(self):
		"""Resets the sudoku timer.
		
		Protected attribute _job may not exist at this point. Handle
		this gracefully.
		
		"""
		try:
			self.after_cancel(self._job)
			del(self._job)
		except AttributeError:
			pass
		del(self.timer)
		self.timer = datetime(1900, 1, 1)
	
	def _init_update_square(self, event):
		"""Starts the process to update a clicked square in the sudoku canvas.
		
		This method is launched with the Left Mouse Button event in
		interactive mode.
		
		The clicked square will be updated with a edit_* image corresponding:
		edit_empty -- If the user did not add a number to it.
		edit_number -- If the user previously add a number to it.
		
		If a previous square was highlighted for edit, turn it back to:
		blank -- If the user did not add any number to it
		number -- If the user add a number to it
		
		If a violation is found, or the game is not in interactive mode, or
		the user is trying to update a fix square, this method won't do
		anything.
		
		"""
		if self.violation:
			return None
		if self.interactive is None:
			return None
		self._set_clicked_square_position_in_canvas()
		row = self.current_square_y
		column = self.current_square_x
		if self.input_matrix.first_matrix[row][column] != 0:
			return None
		to_edit = self.square_item_matrix[row][column]
		current_digit = self.interactive.matrix.first_matrix[row][column]
		if self.currently_editing is not None:
			self.sudoku_canvas.itemconfig(
				self.currently_editing,
				image=self.list_open_squares[self.last_digit]
			)
		self.currently_editing = to_edit
		self.last_digit = current_digit
		self.sudoku_canvas.itemconfig(
			to_edit,
			image=self.list_edit_squares[current_digit]
		)

	def _init_update_time(self):
		"""Starts the process to update timer each second."""
		self.time_label.configure(text=self.timer.strftime("%H:%M:%S"))
		self.timer += self._timer_increment
		self._job = self.after(1000, self._init_update_time)
	
	def _set_clicked_square_position_in_canvas(self):
		"""Set square coordinates in the canvas after clicking on one.
		
		Two new instance attributes are created:
		current_square_x -- column in the sudoku canvas of clicked square
		current_square_y -- row in the sudoku canvas of clicked square
		
		"""
		pionterx = self.sudoku_canvas.winfo_pointerx()
		piontery = self.sudoku_canvas.winfo_pointery()
		rootx = self.sudoku_canvas.winfo_rootx()
		rooty = self.sudoku_canvas.winfo_rooty()
		self.current_square_x = (pionterx - rootx)//40
		self.current_square_y = (piontery - rooty)//40
	
	def quit_handler(self):
		"""Handler for verifying if changes to config should be saved."""
		selection = False
		if self.config_changes_not_saved(self.config_file):
			selection = tkMessageBox.askyesno(
				"Changes to Config settings not saved",
				"Changes to config settings have not been saved.\n" +
				"Would you like to save settings before closing?"
			)
		if selection:
			self.settings_action_set.save_settings_action()
		self.quit()
Ejemplo n.º 19
0
class histogramWidget:
    BACKGROUND = "#222222"
    EDGE_HISTOGRAM_COLOR = "#999999"
    NODE_HISTOGRAM_COLOR = "#555555"
    TOOLTIP_COLOR="#FFFF55"
    
    PADDING = 8
    CENTER_WIDTH = 1
    CENTER_COLOR = "#444444"
    ZERO_GAP = 1
    UPDATE_WIDTH = 9
    UPDATE_COLOR = "#FFFFFF"
    HANDLE_WIDTH = 5
    HANDLE_COLOR = "#FFFFFF"
    HANDLE_LENGTH = (HEIGHT-2*PADDING)
    TICK_COLOR = "#FFFFFF"
    TICK_WIDTH = 10
    TICK_FACTOR = 2
    
    LOG_BASE = 10.0
    
    def __init__(self, parent, x, y, width, height, data, logScale=False, callback=None):
        self.canvas = Canvas(parent,background=histogramWidget.BACKGROUND, highlightbackground=histogramWidget.BACKGROUND,width=width,height=height)
        self.canvas.place(x=x,y=y,width=width,height=height,bordermode="inside")
        
        self.logScale = logScale
        
        self.callback = callback
        
        self.edgeBars = []
        self.nodeBars = []
        
        self.binValues = []
        self.numBins = len(data) - 1
        
        self.currentBin = self.numBins     # start the slider at the highest bin
        
        edgeRange = 0.0
        nodeRange = 0.0
        
        for values in data.itervalues():
            if values[0] > edgeRange:
                edgeRange = values[0]
            if values[1] > nodeRange:
                nodeRange = values[1]
        
        edgeRange = float(edgeRange)    # ensure that it will yield floats when used in calculations...
        nodeRange = float(nodeRange)
        
        if logScale:
            edgeRange = math.log(edgeRange,histogramWidget.LOG_BASE)
            nodeRange = math.log(nodeRange,histogramWidget.LOG_BASE)
        
        # calculate the center line - but don't draw it yet
        self.center_x = histogramWidget.PADDING
        if self.logScale:
            self.center_x += histogramWidget.TICK_WIDTH+histogramWidget.PADDING
        self.center_y = height/2
        self.center_x2 = width-histogramWidget.PADDING
        self.center_y2 = self.center_y + histogramWidget.CENTER_WIDTH
        
        # draw the histograms with background-colored baseline rectangles (these allow tooltips to work on very short bars with little area)
        self.bar_interval = float(self.center_x2 - self.center_x) / (self.numBins+1)
        bar_x = self.center_x
        edge_y2 = self.center_y-histogramWidget.PADDING
        edge_space = edge_y2-histogramWidget.PADDING
        node_y = self.center_y2+histogramWidget.PADDING
        node_space = (height-node_y)-histogramWidget.PADDING
        
        thresholds = sorted(data.iterkeys())
        for threshold in thresholds:
            self.binValues.append(threshold)
            edgeWeight = data[threshold][0]
            nodeWeight = data[threshold][1]
            if logScale:
                if edgeWeight > 0:
                    edgeWeight = math.log(edgeWeight,histogramWidget.LOG_BASE)
                else:
                    edgeWeight = 0
                if nodeWeight > 0:
                    nodeWeight = math.log(nodeWeight,histogramWidget.LOG_BASE)
                else:
                    nodeWeight = 0
            
            bar_x2 = bar_x + self.bar_interval
            
            edge_y = histogramWidget.PADDING + int(edge_space*(1.0-edgeWeight/edgeRange))
            edge = self.canvas.create_rectangle(bar_x,edge_y,bar_x2,edge_y2,fill=histogramWidget.EDGE_HISTOGRAM_COLOR,width=0)
            baseline = self.canvas.create_rectangle(bar_x,edge_y2+histogramWidget.ZERO_GAP,bar_x2,edge_y2+histogramWidget.PADDING,fill=histogramWidget.BACKGROUND,width=0)
            self.canvas.addtag_withtag("Threshold: %f" % threshold,edge)
            self.canvas.addtag_withtag("No. Edges: %i" % data[threshold][0],edge)
            self.canvas.tag_bind(edge,"<Enter>",self.updateToolTip)
            self.canvas.tag_bind(edge,"<Leave>",self.updateToolTip)
            self.edgeBars.append(edge)
            self.canvas.addtag_withtag("Threshold: %f" % threshold,baseline)
            self.canvas.addtag_withtag("No. Edges: %i" % data[threshold][0],baseline)
            self.canvas.tag_bind(baseline,"<Enter>",self.updateToolTip)
            self.canvas.tag_bind(baseline,"<Leave>",self.updateToolTip)
            
            node_y2 = node_y + int(node_space*(nodeWeight/nodeRange))
            node = self.canvas.create_rectangle(bar_x,node_y,bar_x2,node_y2,fill=histogramWidget.NODE_HISTOGRAM_COLOR,width=0)
            baseline = self.canvas.create_rectangle(bar_x,node_y-histogramWidget.PADDING,bar_x2,node_y-histogramWidget.ZERO_GAP,fill=histogramWidget.BACKGROUND,width=0)
            self.canvas.addtag_withtag("Threshold: %f" % threshold,node)
            self.canvas.addtag_withtag("No. Nodes: %i" % data[threshold][1],node)
            self.canvas.tag_bind(node,"<Enter>",self.updateToolTip)
            self.canvas.tag_bind(node,"<Leave>",self.updateToolTip)
            self.nodeBars.append(node)
            self.canvas.addtag_withtag("Threshold: %f" % threshold,baseline)
            self.canvas.addtag_withtag("No. Nodes: %i" % data[threshold][1],baseline)
            self.canvas.tag_bind(baseline,"<Enter>",self.updateToolTip)
            self.canvas.tag_bind(baseline,"<Leave>",self.updateToolTip)
            
            bar_x = bar_x2
        
        # now draw the center line
        self.centerLine = self.canvas.create_rectangle(self.center_x,self.center_y,self.center_x2,self.center_y2,fill=histogramWidget.CENTER_COLOR,width=0)
        
        # draw the tick marks if logarithmic
        if self.logScale:
            tick_x = histogramWidget.PADDING
            tick_x2 = histogramWidget.PADDING+histogramWidget.TICK_WIDTH
            
            start_y = edge_y2
            end_y = histogramWidget.PADDING
            dist = start_y-end_y
            while dist > 1:
                dist /= histogramWidget.TICK_FACTOR
                self.canvas.create_rectangle(tick_x,end_y+dist-1,tick_x2,end_y+dist,fill=histogramWidget.TICK_COLOR,width=0)
            
            start_y = node_y
            end_y = height-histogramWidget.PADDING
            dist = end_y-start_y
            while dist > 1:
                dist /= histogramWidget.TICK_FACTOR
                self.canvas.create_rectangle(tick_x,end_y-dist,tick_x2,end_y-dist+1,fill=histogramWidget.TICK_COLOR,width=0)
        
        # draw the update bar
        bar_x = self.currentBin*self.bar_interval + self.center_x
        bar_x2 = self.center_x2
        bar_y = self.center_y-histogramWidget.UPDATE_WIDTH/2
        bar_y2 = bar_y+histogramWidget.UPDATE_WIDTH
        self.updateBar = self.canvas.create_rectangle(bar_x,bar_y,bar_x2,bar_y2,fill=histogramWidget.UPDATE_COLOR,width=0)
        
        # draw the handle
        handle_x = self.currentBin*self.bar_interval-histogramWidget.HANDLE_WIDTH/2+self.center_x
        handle_x2 = handle_x+histogramWidget.HANDLE_WIDTH
        handle_y = self.center_y-histogramWidget.HANDLE_LENGTH/2
        handle_y2 = handle_y+histogramWidget.HANDLE_LENGTH
        self.handleBar = self.canvas.create_rectangle(handle_x,handle_y,handle_x2,handle_y2,fill=histogramWidget.HANDLE_COLOR,width=0)
        self.canvas.tag_bind(self.handleBar, "<Button-1>",self.adjustHandle)
        self.canvas.tag_bind(self.handleBar, "<B1-Motion>",self.adjustHandle)
        self.canvas.tag_bind(self.handleBar, "<ButtonRelease-1>",self.adjustHandle)
        parent.bind("<Left>",lambda e: self.nudgeHandle(e,-1))
        parent.bind("<Right>",lambda e: self.nudgeHandle(e,1))
        
        # init the tooltip as nothing
        self.toolTipBox = self.canvas.create_rectangle(0,0,0,0,state="hidden",fill=histogramWidget.TOOLTIP_COLOR,width=0)
        self.toolTip = self.canvas.create_text(0,0,state="hidden",anchor="nw")
        self.canvas.bind("<Enter>",self.updateToolTip)
        self.canvas.bind("<Leave>",self.updateToolTip)
    
    def adjustHandle(self, event):
        newBin = int(self.numBins*(event.x-self.center_x)/float(self.center_x2-self.center_x)+0.5)
        if newBin == self.currentBin or newBin < 0 or newBin > self.numBins:
            return
        
        self.canvas.move(self.handleBar,(newBin-self.currentBin)*self.bar_interval,0)
        self.currentBin = newBin
        if self.callback != None:
            self.callback(self.binValues[newBin])
    
    def nudgeHandle(self, event, distance):
        temp = self.currentBin+distance
        if temp < 0 or temp > self.numBins:
            return
        
        self.canvas.move(self.handleBar,distance*self.bar_interval,0)
        self.currentBin += distance
        
        if self.callback != None:
            self.callback(self.binValues[self.currentBin])
    
    def update(self, currentBins):
        currentBar = self.canvas.coords(self.updateBar)
        self.canvas.coords(self.updateBar,currentBins*self.bar_interval+self.center_x,currentBar[1],currentBar[2],currentBar[3])
    
    def updateToolTip(self, event):
        allTags = self.canvas.gettags(self.canvas.find_overlapping(event.x,event.y,event.x+1,event.y+1))
        
        if len(allTags) == 0:
            self.canvas.itemconfig(self.toolTipBox,state="hidden")
            self.canvas.itemconfig(self.toolTip,state="hidden")
            return
        
        outText = ""
        for t in allTags:
            if t == "current":
                continue
            outText += t + "\n"
        
        outText = outText[:-1]  # strip the last return
        
        self.canvas.coords(self.toolTip,event.x+20,event.y)
        self.canvas.itemconfig(self.toolTip,state="normal",text=outText,anchor="nw")
        # correct if our tooltip is off screen
        textBounds = self.canvas.bbox(self.toolTip)
        if textBounds[2] >= WIDTH-2*histogramWidget.PADDING:
            self.canvas.itemconfig(self.toolTip, anchor="ne")
            self.canvas.coords(self.toolTip,event.x-20,event.y)
            if textBounds[3] >= HEIGHT-2*histogramWidget.PADDING:
                self.canvas.itemconfig(self.toolTip, anchor="se")
        elif textBounds[3] >= HEIGHT-2*histogramWidget.PADDING:
            self.canvas.itemconfig(self.toolTip, anchor="sw")
        
        # draw the box behind it
        self.canvas.coords(self.toolTipBox,self.canvas.bbox(self.toolTip))
        self.canvas.itemconfig(self.toolTipBox, state="normal")
Ejemplo n.º 20
0
class ProgressBar:
    def __init__(self, master=None, orientation="horizontal",
                 min=0, max=100, width=100, height=18,
                 doLabel=1, appearance="sunken",
                 fillColor="blue", background="gray",
                 labelColor="yellow", labelFont="Verdana",
                 labelText="", labelFormat="%d%%",
                 value=0, bd=2):
        # preserve various values
        self.master=master
        self.orientation=orientation
        self.min=min
        self.max=max
        self.width=width
        self.height=height
        self.doLabel=doLabel
        self.fillColor=fillColor
        self.labelFont= labelFont
        self.labelColor=labelColor
        self.background=background
        self.labelText=labelText
        self.labelFormat=labelFormat
        self.value=value
        self.frame=Frame(master, relief=appearance, bd=bd)
        self.canvas=Canvas(self.frame, height=height, width=width, bd=0,
                           highlightthickness=0, background=background)
        self.scale=self.canvas.create_rectangle(0, 0, width, height,
                                                fill=fillColor)
        self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2,
                                           height / 2, text=labelText,
                                           anchor="c", fill=labelColor,
                                           font=self.labelFont)
        self.update()
        self.canvas.pack(side='top', fill='x', expand='no')

    def updateProgress(self, newValue, newMax=None):
        if newMax:
            self.max = newMax
        self.value = newValue
        self.update()

    def update(self):
        # Trim the values to be between min and max
        value=self.value
        if value > self.max:
            value = self.max
        if value < self.min:
            value = self.min
        # Adjust the rectangle
        if self.orientation == "horizontal":
            self.canvas.coords(self.scale, 0, 0,
              float(value) / self.max * self.width, self.height)
        else:
            self.canvas.coords(self.scale, 0,
                               self.height - (float(value) /
                                              self.max*self.height),
                               self.width, self.height)
        # Now update the colors
        self.canvas.itemconfig(self.scale, fill=self.fillColor)
        self.canvas.itemconfig(self.label, fill=self.labelColor)
        # And update the label
        if self.doLabel:
            if value:
                if value >= 0:
                    pvalue = int((float(value) / float(self.max)) *
                                   100.0)
                else:
                    pvalue = 0
                self.canvas.itemconfig(self.label, text=self.labelFormat
                                         % pvalue)
            else:
                self.canvas.itemconfig(self.label, text='')
        else:
            self.canvas.itemconfig(self.label, text=self.labelFormat %
                                   self.labelText)
        self.canvas.update_idletasks()
Ejemplo n.º 21
0
class Window(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent, background="white")            
        self.parent = parent        
        self.initUI()
        
        home='/home/little_light/Desktop/workspace/python/data/GSTRB'
        modelFile=home+'/model/demo2.pkl'
        input_var = T.tensor4('inputs',dtype=theano.config.floatX)
        target_var = T.ivector('targets')
        network,loss,params=build_2f(input_var,target_var,regularW=0.0001)
        pvals=cPickle.load(open(modelFile))
        [p.set_value(pval) for (p, pval) in zip(lasagne.layers.get_all_params(network), pvals)]
    
        predict=lasagne.layers.get_output(network, deterministic=True)
        input=lasagne.layers.get_all_layers(network)[0].input_var
        #lasagne.layers.input.input
        self.predict_fn=theano.function(inputs=[input],outputs=predict)
        
    def initUI(self):
        self.parent.title("Simple")
        self.pack(fill=BOTH, expand=1)
        self.tbImg=Entry(self.parent,width=50)
        self.tbImg.place(x=10,y=10)
        self.bLoad=Button(master=self,text="Load", command = self.load)
        self.bLoad.pack()
        self.bLoad.place(x=10,y=30)
        
        self.canvas = Canvas(self, width=400, height=400)      
        self.canvas.pack()
        
        fileName='/home/little_light/Desktop/workspace/python/data/GSTRB/Final_Training/Images/00000/00004_00029.ppm'
        
        
        img = ImageTk.PhotoImage(Image.open(fileName))      
        
        self.canvas.image=img
        self.image_on_canvas=self.canvas.create_image(0,0,image=img,anchor='nw')   
        
        self.canvas.place(x=10,y=60)
        
        self.v = StringVar()
        self.label=Label(master=self,textvariable=self.v)
        self.v.set("Target label:")
        self.label.place(x=10,y=470)
        
        
    def load(self):
        print "load"
        fileName=self.tbImg.get()
        img = ImageTk.PhotoImage(Image.open(fileName))
        self.canvas.image=img
        #self.canvas.create_image(0,0,image=img)
        self.canvas.itemconfig(self.image_on_canvas, image =self.canvas.image)
        img=Image.open(fileName)
        img.load() 
        img2=img.resize((32,32))
        img2.load()
        data = np.asarray(img2, dtype="int32")
        mean=86.2111433696
        data=np.transpose(data,(2,0,1))
        data=np.asarray((data-mean)/256.0,dtype=theano.config.floatX)
        data2=np.zeros((1,3,32,32),dtype=theano.config.floatX)
        data2[0]=data
        data=data2
        print np.argmax(self.predict_fn(data)[0])
        self.v.set("Target label:"+str(np.argmax(self.predict_fn(data)[0])))
Ejemplo n.º 22
0
class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.levels = list()
        self.signs = list()
        self.items = [i for i in range(0,64)]
        self.items.remove(16)
        self.current_item = 0
        self.parent = parent
        self.max_width = 600
        self.max_height = 600
        self.client = Client()
        self.initDimensions()
        self.initUI()
        self.event = None
        self.reset_canvas()

    def connect(self):

        res = self.client.regis()
        if(res == 1):
            time.sleep(1)
            self.connect_button.config(state = 'disabled')
            self.disconnect_button.config(state = 'normal')

    def disconnect(self):
        self.client.close()
        self.connect_button.config(state = 'normal')
        self.disconnect_button.config(state = 'disabled')


    def initDimensions(self):
        self.canvas_width = self.max_width
        self.canvas_height = self.max_height
        self.rows = 10
        self.cols = 10
        # self.h = 1;
        self.cellwidth = self.canvas_width/self.cols
        self.cellheight = self.canvas_height/self.rows
        self.initData()

    def add_new_level(self):
        temp=dict()
        temp2 = dict()
        self.levels.append(temp)
        self.signs.append(temp2)

    def insert_new_level(self, loc):
        temp=dict()
        temp2 = dict()
        self.levels.insert(loc,temp)
        self.signs.insert(loc,temp2)

    def initData(self):
        self.levels = list()
        self.signs = list()
        self.rect = dict()
        self.rect_text = dict()
        self.curr_level = 0
        self.overlay_level = 0
        self.overlayToggle = False
        self.levels.append(dict())
        self.signs.append(dict())
        self.current_item = 1


    def reset_canvas(self):
        self.canvas.delete(ALL)
        self.parent.title("Craft Builder: Dimensions: " + str(self.rows) + 'x' + str(len(self.levels)) +'x' + str(self.cols))

    def redraw_overlay(self):
        c = set(self.levels[self.overlay_level].keys())
        if self.overlayToggle == 1:
            for key in c:
                x1 = key[1] * self.cellwidth
                y1 = (self.rows - key[0] - 1) * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight

                if (key[0], key[1]) in self.rect:
                    self.canvas.itemconfig(self.rect[key[0],key[1]], width = OVERLAYWIDTH)
                else:
                    self.rect[key[0],key[1]] = self.canvas.create_rectangle(x1,y1,x2,y2, fill='white', outline = 'black', width = OVERLAYWIDTH, tag = 'block')
                    self.rect_text[key[0],key[1]] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = '', font=('verdana', 7), tag = 'blocktext')

    def redraw_level(self):
        # self.canvas.delete(ALL)

        # self.rect=dict()
        # self.rect_text = dict()
        start = time.clock()

        b = set(self.levels[self.curr_level].keys())

        for key in b:
            val = self.levels[self.curr_level][key]
            if (key[0], key[1]) in self.rect:
                self.canvas.itemconfig(self.rect[key[0],key[1]], fill = COLORS[val], outline = 'black', width = DEFAULTWIDTH)
                self.canvas.itemconfig(self.rect_text[key[0],key[1]], text = val)
            else:
                x1 = key[1] * self.cellwidth
                y1 = (self.rows - key[0] - 1) * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight
                self.rect[key[0],key[1]] = self.canvas.create_rectangle(x1,y1,x2,y2, fill = COLORS[val], outline = 'black', width = DEFAULTWIDTH, tag = 'block')
                self.rect_text[key[0],key[1]] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = val, font=('verdana', 7), tag = 'blocktext')

        items_to_remove = list()
        for key in self.rect:
            if key not in self.levels[self.curr_level]:
                self.canvas.delete(self.rect[key[0],key[1]])
                self.canvas.delete(self.rect_text[key[0],key[1]])
                items_to_remove.append(key)
        for i in items_to_remove:
            self.rect.pop(i)
            self.rect_text.pop(i)


        self.parent.title("Craft Builder: Dimensions: " + str(self.rows) + 'x' + str(len(self.levels)) +'x' + str(self.cols))
        self.redraw_overlay()




    def updateDimensions(self,r,c,y=1):
        self.rows = r
        self.cols = c

        self.cellwidth = self.max_width/self.cols
        self.cellheight = self.max_height/self.rows
        if(self.cellwidth<=self.cellheight):
            self.cellheight = self.cellwidth
        else:
            self.cellwidth = self.cellheight
        self.canvas_height = self.rows * self.cellheight
        self.canvas_width = self.cols * self.cellwidth
        self.canvas.config(width = self.canvas_width, height = self.canvas_height)

        self.canvas.delete(ALL)
        self.initData()
        for i in range(y-1):
            self.levels.append(dict())
            self.signs.append(dict())

    def altMenu(self, event):
        # print "Keycode:", event.keycode, "State:", event.keysym, event.type
        self.event = event
        if event.type == '2':
            self.altAction = True
            self.clear_button.config(text = 'Multi Clear', bg = 'white')
            self.delete_button.config(text = 'Multi Delete', bg='white')
            self.insert_button.config(text = 'Multi Insert', bg='white')
            self.copy_level_button.config(text = 'Multi Copy', bg = 'white')
        elif event.type == '3':
            defaultbg = self.parent.cget('bg')
            self.altAction = False
            self.clear_button.config(text = 'Clear Level', bg = defaultbg)
            self.delete_button.config(text = 'Delete', bg = defaultbg)
            self.insert_button.config(text = 'Insert', bg = defaultbg)
            self.copy_level_button.config(text = 'Copy overlay level', bg = defaultbg)
        sys.stdout.flush()

    def initUI(self):

        self.altAction = False
        self.parent.title("Craft Builder")
        self.style = Style()
        self.style.theme_use("default")
        self.pack(fill=BOTH, expand=0)

        self.columnconfigure(0, pad = 7)
        self.columnconfigure(1, pad = 7)
        self.columnconfigure(2, pad = 7)
        self.columnconfigure(9, weight =1 )
        self.columnconfigure(3, pad=7)
        self.columnconfigure(5, pad=7)

        self.rowconfigure(1, weight=1)
        self.rowconfigure(5, pad=7)
        self.rowconfigure(6, pad=7)
        self.rowconfigure(7, pad=7)
        self.rowconfigure(8, pad=7)

        area = Frame(self, width=500, height=500, borderwidth = 2, relief = 'sunken')
        area.grid(row=1, column=0, columnspan=11, rowspan=4,
            padx=5, sticky=E+W+S+N)

        self.canvas = Canvas(area, bg='white', width=self.canvas_width, height=self.canvas_height)

        self.canvas.pack()
        self.canvas.bind("<Button-1>", self.callbackLeftClick)
        self.canvas.bind("<B1-Motion>", self.callbackLeftClick)
        self.canvas.bind("<Button-3>", self.callbackRightClick)
        self.canvas.bind("<B3-Motion>", self.callbackRightClick)
        self.canvas.bind("<Button-5>", self.scrollWheel)
        self.canvas.bind("<Button-4>", self.scrollWheel)
        self.parent.bind("<Shift_L>", self.altMenu)
        self.parent.bind("<KeyRelease-Shift_L>", self.altMenu)


        self.new_button = Button(self, text="New", command = self.onNew, width = 6)
        self.new_button.grid(row=5, column=0)

        save_button = Button(self, text="Save", command = self.onSave, width = 6)
        save_button.grid(row=6, column=0)

        load_button = Button(self, text="Load", command = self.onLoad, width = 6)
        load_button.grid(row=7, column=0)

        self.connect_button = Button(self, text="Connect", command = self.connect, width = 6)
        self.connect_button.grid(row=8, column=0)

        self.clear_button = Button(self, text="Clear Level", command = self.onClear, width =8)
        self.clear_button.grid(row=5, column=1)

        self.delete_button = Button(self, text="Delete Level", command = self.onDelete, width =8)
        self.delete_button.grid(row=6, column=1)

        self.insert_button = Button(self, text="Insert Level", command = self.onInsertLevel, width =8)
        self.insert_button.grid(row=7, column=1)

        self.disconnect_button = Button(self, text="Disconnect", command = self.disconnect, width = 8)
        self.disconnect_button.grid(row=8, column=1)
        self.disconnect_button['state'] = 'disabled'

        lbl_a = Label(self, text="Curr. Level", font=("Verdana", 10))
        lbl_a.grid(row = 5, column = 2)

        lbl_b = Label(self, text="Overlay Level", font=("Verdana", 10))
        lbl_b.grid(row = 6, column = 2)

        self.copy_level_button = Button(self, text="Copy overlay level", command = self.onCopy, width = 12)
        self.copy_level_button.grid(row=7, column=2, columnspan=1)

        load_world_button = Button(self, text="Load from world", command = self.onLoadFromWorld, width = 12)
        load_world_button.grid(row=8, column=2)

        self.currLevelCombo = Combobox(self, values = range(len(self.levels)), width = 5, state = 'readonly')
        self.currLevelCombo.grid(row = 5, column = 3)
        self.currLevelCombo.bind("<<ComboboxSelected>>", self.currLevelChooser)
        self.currLevelCombo.set(0)

        self.overlayLevelCombo = Combobox(self, values = range(len(self.levels)), width = 5, state = 'readonly')
        self.overlayLevelCombo.grid(row = 6, column = 3)
        self.overlayLevelCombo.bind("<<ComboboxSelected>>", self.overlayLevelChooser)
        self.overlayLevelCombo.set(0)


        self.new_level_button = Button(self, text="New Level", command = self.onNewLevel, width = 12)
        self.new_level_button.grid(row=7, column=3,columnspan=1)

        paste_button = Button(self, text="Paste in world", command = self.onPaste, width = 12)
        paste_button.grid(row=8, column=3)

        lbl_d = Label(self, text="Item", font=("Verdana", 10))
        lbl_d.grid(row = 5, column = 4)

        self.toggle = Checkbutton(self, text="Overlay Toggle", command = self.onToggle)
        self.toggle.grid(row=6, column=4)

        rotate_button = Button(self, text="Rotate", command = self.onRotate, width = 12)
        rotate_button.grid(row=7, column=4,columnspan=1)

        paste_sign_button = Button(self, text="Paste Signs", command = self.onPasteSign, width = 12)
        paste_sign_button.grid(row=8, column=4)

        self.itemCombo = Combobox(self, values = self.items, width = 5, state = 'readonly')
        self.itemCombo.grid(row = 5, column = 5)
        self.itemCombo.bind("<<ComboboxSelected>>", self.itemChooser)
        self.itemCombo.set(1)
        self.current_item = 1
        self.lbl_e = Label(self, text="", font=("Verdana", 8), width = 12, relief = 'ridge')
        self.lbl_e.grid(row = 6, column = 5)

        add_geo_button = Button(self, text="Add Geometry", command = self.addGeo, width = 12)
        add_geo_button.grid(row=8, column=5)

        try:
            global builder
            import builder
        except ImportError:
            add_geo_button.config(state = 'disabled')

    def scrollWheel(self, event):
        if event.num == 5:
            #scroll down
            if self.curr_level==len(self.levels) -1:
                pass
            else:
                self.curr_level = self.curr_level + 1
                self.currLevelCombo.set(self.curr_level)
                self.redraw_level()
        else:
            #scroll up
            if self.curr_level == 0:
                pass
            else:
                self.curr_level = self.curr_level - 1
                self.currLevelCombo.set(self.curr_level)
                self.redraw_level()

    def onInsertLevel(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter num_levels to insert and level below which to insert\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split(' ')
            try:
                if len(data) == 2:
                    for i in range(int(data[0])):
                        self.insert_new_level(int(data[1]))
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'


        else:
            self.insert_new_level(self.curr_level)
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
            self.redraw_level()

    def onCopy(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_level num_times\n" +
                                                                 "and level above which to copy, all seperated by spaces.")
            self.wait_window(self.w.top)
            self.altAction = 0

            data = self.w.value.split(' ')
            try:
                if len(data) == 4:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    n = data[2]
                    l = int(data[3]) + 1
                    for i in range(int(n)):
                        for j in range(st, sto +1):
                            for col in range(self.cols):
                                for row in range(self.rows):
                                    if (row,col) in self.levels[j]:
                                        if  l+j-st < len(self.levels) :
                                            self.levels[l+j-st][row,col] = self.levels[j][row,col]
                        l = l +(sto-st+1)
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'

        else:
            for col in range(self.cols):
                for row in range(self.rows):
                    if (row,col) in self.levels[self.overlay_level]:
                       self.levels[self.curr_level][row,col] = self.levels[self.overlay_level][row,col]
        sys.stdout.flush()
        self.redraw_level()



    def onClear(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_levels to clear\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split()
            try:
                if len(data) == 2:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    for i in range(st,sto+1):
                        if i < len(self.levels):
                            self.levels[i] = dict()
                            self.signs[i] = dict()
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'
        else:
            if tkMessageBox.askquestion('Clear', "Clear Level: " + str(self.curr_level)) == 'yes':
                self.levels[self.curr_level] = dict()
                self.signs[self.curr_level] = dict()
                self.redraw_level()
            else:
                pass

    def onDelete(self):
        if self.altAction == 1:
            self.w=popupWindow(self,title = "Enter the arguments start_level end_levels to delete\n" +
                                                                 "seperated by a space.")
            self.wait_window(self.w.top)
            self.altAction = 0
            data = self.w.value.split()
            try:
                if len(data) == 2:
                    st,sto = sorted((data[0],data[1]))
                    st = int(st)
                    sto = int(sto)
                    for i in range(sto,st-1,-1):
                        if i < len(self.levels) and i >=0 and len(self.levels)>1:
                            self.levels.pop(i)
                            self.signs.pop(i)
                        elif i < len(self.levels) and i ==0 :
                            self.levels[i] = dict()
                            self.signs[i] = dict()

                    self.currLevelCombo.config(values = range(len(self.levels)))
                    self.overlayLevelCombo.config(values = range(len(self.levels)))
                    self.curr_level = 0
                    self.currLevelCombo.set(0)
                    self.overlayLevelCombo.set(0)
                    self.redraw_level()
                else:
                    print 'Not enough arguments'
            except ValueError:
                print 'Error in values'

        else:
            if tkMessageBox.askquestion('Delete', "Delete Level: " + str(self.curr_level)) == 'yes':
                if len(self.levels) == 1:
                    self.onClear()
                else:
                    self.levels.pop(self.curr_level)
                    self.signs.pop(self.curr_level)
                    self.currLevelCombo.config(values = range(len(self.levels)))
                    self.overlayLevelCombo.config(values = range(len(self.levels)))

                    if self.overlayToggle == 1:
                        self.toggle.invoke()
                        self.overlayToggle = 0

                    if self.curr_level != 0:
                        self.curr_level = self.curr_level - 1
                        self.currLevelCombo.set(self.curr_level)
                    else:
                        self.currLevelCombo.set(self.curr_level)
                    self.redraw_level()

    def addGeo(self):
        self.w=popupWindow(self,title = "Enter Command: help for Help")
        self.wait_window(self.w.top)

        try:
            c = self.w.value.split(' ')
            if c[0] == 'help':
                self.h = HelpWindow(self, title = 'Enter command followed by args seperated by spaces\n' +
                                                                    'Available commands (sphere, pyramid, cuboid)\n' +
                                                                    '1.   pyramid x1 x2 y z1 z2 fill(0/1) \n' +
                                                                    '2.   sphere cx cy cz r fill(0/1) \n' +
                                                                    '4.   circle_x x y z r fill(0/1) \n' +
                                                                    '5.   circle_y x y z r fill(0/1) \n' +
                                                                    '6.   circle_z x y z r fill(0/1) \n' +
                                                                    '7.   cylinder_x x1 x2 y z r fill(0/1) \n' +
                                                                    '8.   cylinder_y x y1 y2 z r fill(0/1) \n' +
                                                                    '9.   cylinder_z x y z1 z2 r fill(0/1) \n' +
                                                                    '10. cuboid x1 x2 y1 y2 z1 z2 fill(0/1) \n' )
            elif c[0] == 'sphere':
                if len(c) - 1 == 5:
                    result = builder.sphere(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >=0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'pyramid':
                if len(c) - 1 == 6:
                    result = builder.pyramid(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'circle_x':
                if len(c) - 1 == 5:
                    result = builder.circle_x(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'circle_y':
                if len(c) - 1 == 5:
                    result = builder.circle_y(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'circle_z':
                if len(c) - 1 == 5:
                    result = builder.circle_z(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_x':
                if len(c) - 1 == 6:
                    x1,x2 = sorted([int(c[1]),int(c[2])])
                    result = builder.cylinder_x(x1,x2,int(c[3]),int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_y':
                if len(c) - 1 == 6:
                    y1,y2 = sorted([int(c[2]),int(c[3])])
                    result = builder.cylinder_y(int(c[1]),y1,y2,int(c[4]),int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
            elif c[0] == 'cylinder_z':
                if len(c) - 1 == 6:
                    z1,z2 = sorted([int(c[3]),int(c[4])])
                    result = builder.cylinder_z(int(c[1]),int(c[2]),z1,z2,int(c[5]),int(c[6]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item

            elif c[0] == 'cuboid':
                if len(c) - 1 == 7:
                    result = builder.cuboid(int(c[1]),int(c[2]),int(c[3]),int(c[4]),int(c[5]),int(c[6]),int(c[7]))
                    for i in result:
                        if i[1] < len(self.levels) and i[1] >= 0:
                            if i[0] < self.rows and i[0] >=0 and i[2] < self.cols and i[2] >=0:
                                self.levels[i[1]][i[0],i[2]] = self.current_item
                pass

            newLevels = list()
            for i, j in enumerate(self.levels):
                temp = dict()
                for key, val in j.iteritems():
                    if int(val) != 0:
                        temp[key] = val
                newLevels.append(temp)

            self.levels = newLevels

            self.redraw_level()

        except RuntimeError:
            pass

    def onPaste(self):
        self.w=popupWindow(self,title = "On world, facing north (i.e x increases ahead of you,\n"+
                                                            "and z increases to your right.\n" +
                                                            "Enter origin point (x y z) seperated by spaces: eg. 12 12 12:")
        self.wait_window(self.w.top)
        data = self.w.value.split(' ')
        try:
            xo = int(data[0])
            yo = int(data[1])
            zo = int(data[2])
            if tkMessageBox.askquestion('Coords', "Is this (x,y,z) correct: " + str(xo) +',' +str(yo) + ',' + str(zo)) == 'yes':
                print 'Pasting'
                count = 0
                for j,i in enumerate(self.levels):
                    for key,value in i.iteritems():
                        xr = int(xo + key[0])
                        yr = int(yo + j)
                        zr = int(zo + key[1])
                        # self.client.client_send(xr,yr,zr,0)
                        if int(value) != 0:
                            self.client.client_send(xr,yr,zr,int(value))
                            count = count + 1
                        if count % NUMPERSEC == 0:
                            time.sleep(1)
            else:
                pass
        except ValueError:
            pass

    def onPasteSign(self):
        self.w=popupWindow(self,title = "Facing north, enter origin point(x y z): eg. 12 12 12:")
        self.wait_window(self.w.top)
        data = self.w.value.split(' ')
        try:
            xo = int(data[0])
            yo = int(data[1])
            zo = int(data[2])
            if tkMessageBox.askquestion('Coords', "Is this (x,y,z) correct: " + str(xo) +',' +str(yo) + ',' + str(zo)) == 'yes':
                print 'Pasting'
                count = 0
                for j,i in enumerate(self.signs):
                    for key,value in i.iteritems():
                        xr = int(xo + key[0])
                        yr = int(yo + j)
                        zr = int(zo + key[1])

                        for num,val in enumerate(value):
                            if val!=-1:
                                # print j,i,num, val
                                self.client.client_send_sign(xr, yr, zr, num, val)
                        sys.stdout.flush()
        except ValueError:
            pass

    def onLoadFromWorld(self):
        self.w=popupWindow(self,title = "Enter bottom left point: (x y z)")
        self.wait_window(self.w.top)
        try:
            [x1,y1,z1] = [int(i) for i in self.w.value.split(' ')]

            self.w=popupWindow(self,title = "Enter top right point: (x y z)")
            self.wait_window(self.w.top)
            [x2,y2,z2] = [int(i) for i in self.w.value.split(' ')]

            x1,x2 =  sorted([x1,x2])
            y1,y2 =  sorted([y1,y2])
            z1,z2 =  sorted([z1,z2])

            if tkMessageBox.askquestion('Coords', "Bottom left: " + str(x1) +',' +str(y1) + ',' + str(z1) + '\n' + \
                "Top right: " + str(x2) +',' +str(y2) + ',' + str(z2)) == 'yes':
                print 'Copying',x1,y1,z1,' to',x2,y2,z2
                data = self.client.read_db(x1,y1,z1,x2,y2,z2, db_name)
                signs = self.client.read_signs(x1,y1,z1,x2,y2,z2, db_name)
                newData = list()

                for i in data:
                    temp = dict()
                    for key,value in i.iteritems():
                        if value != 0:
                            temp[key[0], key[1]] = value
                    newData.append(temp)

                newSignData = list()
                for i in signs:
                    temp = dict()
                    for key,value in i.iteritems():
                        temp[key[0], key[1]] = value
                    newSignData.append(temp)

                if self.overlayToggle == 1:
                    self.toggle.invoke()
                    self.overlayToggle = 0
                self.updateDimensions(x2-x1+1, z2-z1+1, len(newData))
                self.reset_canvas()
                self.levels = newData
                self.signs = newSignData
                sys.stdout.flush()

                self.redraw_level()
                self.currLevelCombo.config(values = range(len(self.levels)))
                self.overlayLevelCombo.config(values = range(len(self.levels)))
        except ValueError:
            pass

    def onSave(self):
        filename = asksaveasfilename(parent=self)
        pickle.dump({'Dimensions' : [self.rows,self.cols,len(self.levels)],'Levels' : self.levels, 'Signs' : self.signs}, open(filename, 'wb'))

    def onLoad(self):
        if self.overlayToggle == 1:
            self.toggle.invoke()
            self.overlayToggle = 0

        filename = askopenfilename(parent=self)
        try:
            obj = pickle.load(open(filename, 'rb'))
            self.updateDimensions(int(obj['Dimensions'][0]), int(obj['Dimensions'][1]), int(obj['Dimensions'][2]))
            self.reset_canvas()
            self.levels = obj['Levels']

            if 'Signs' in obj:
                self.signs = obj['Signs']
            self.redraw_level()
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
        except IOError:
            pass

    def onToggle(self):
        if self.overlayToggle == 0:
            self.overlayToggle =1
            self.redraw_level()
        else:
            self.overlayToggle = 0
            self.redraw_level()

    def onNewLevel(self):
        self.add_new_level()
        self.currLevelCombo.config(values = range(len(self.levels)))
        self.overlayLevelCombo.config(values = range(len(self.levels)))
        self.redraw_level()

    def onRotate(self):
        self.rotatedData = list()
        self.rotatedSignData = list()

        for i in self.levels:
            temp = dict()
            for key,value in i.iteritems():
                xr = (key[0] * math.cos(math.radians(-90)) - (key[1]) * math.sin(math.radians(-90)))
                zr = (key[0] * math.sin(math.radians(-90)) + (key[1]) * math.cos(math.radians(-90)))
                temp[int(math.floor(xr)),int(math.floor(zr))] = value
            self.rotatedData.append(temp)

        sign_map = {0:2, 3:0, 1:3, 2:1, 6:5, 7:6, 4:7, 5:4} #FOR ROTATION CALCULATION
        for i in self.signs:
            temp = dict()
            for key,value in i.iteritems():
                xr = (key[0] * math.cos(math.radians(-90)) - (key[1]) * math.sin(math.radians(-90)))
                zr = (key[0] * math.sin(math.radians(-90)) + (key[1]) * math.cos(math.radians(-90)))
                new_value = [value[sign_map[0]],
                                      value[sign_map[1]],
                                      value[sign_map[2]],
                                      value[sign_map[3]],
                                      value[sign_map[4]],
                                      value[sign_map[5]],
                                      value[sign_map[6]],
                                      value[sign_map[7]]]
                temp[int(math.floor(xr)),int(math.floor(zr))] = new_value
            self.rotatedSignData.append(temp)

        #Moving to origin x,z : 0,0
        self.newData=list()
        self.newSignData=list()
        for i in self.rotatedData:
            temp=dict()
            for key,value in i.iteritems():
                temp[key[0], int(key[1])+int((self.rows-1))] = value
            self.newData.append(temp)
        for i in self.rotatedSignData:
            temp=dict()
            for key,value in i.iteritems():
                temp[key[0], int(key[1])+int((self.rows-1))] = value
            self.newSignData.append(temp)


        temp = self.rows
        self.rows = self.cols
        self.cols = temp

        temp = self.curr_level
        temp2 = self.overlay_level
        temp3 = self.overlayToggle
        temp4 = self.current_item

        self.updateDimensions(self.rows, self.cols,len(self.newData))
        self.reset_canvas()
        self.levels = self.newData
        self.signs = self.newSignData
        self.curr_level = temp
        self.overlay_level = temp2
        self.overlayToggle = temp3

        self.itemCombo.set(temp4)
        self.currLevelCombo.config(values = range(len(self.levels)))
        self.overlayLevelCombo.config(values = range(len(self.levels)))
        self.currLevelCombo.set(self.curr_level)
        self.overlayLevelCombo.set(self.overlay_level)
        self.redraw_level()


    def onNew(self):
        if self.overlayToggle == 1:
            self.toggle.invoke()
            self.overlayToggle = 0
        self.w=popupWindow(self,title = "Enter Dimensions in XxZxY format (e.g. 10x20x3)")
        self.wait_window(self.w.top)
        try:
            data = self.w.value.split('x')
            if len(data) == 2:
                self.updateDimensions(int(data[0]), int(data[1]),1)
            else:
                self.updateDimensions(int(data[0]), int(data[1]),int(data[2]))
            # self.initData()
            self.reset_canvas()
            self.currLevelCombo.config(values = range(len(self.levels)))
            self.overlayLevelCombo.config(values = range(len(self.levels)))
        except ValueError:
            pass

    def currLevelChooser(self, event):
        self.curr_level = int(self.currLevelCombo.get())
        self.redraw_level()

    def overlayLevelChooser(self, event):
        self.overlay_level = int(self.overlayLevelCombo.get())
        self.redraw_level()

    def itemChooser(self, event):
        self.current_item = int(self.itemCombo.get())

    def callbackLeftClick(self,event):
        if self.current_item == 0:
            return
        col = int(math.floor((event.x)/self.cellwidth))
        row = int(math.floor((event.y)/self.cellheight))
        x1 = col * self.cellwidth
        y1 = row * self.cellheight
        x2 = x1 + self.cellwidth
        y2 = y1 + self.cellheight

        if (self.rows - row - 1,col) in self.rect:
            self.canvas.itemconfig(self.rect[self.rows - row - 1,col],fill=COLORS[self.current_item])
            self.canvas.itemconfig(self.rect_text[self.rows - row - 1,col], text = str(self.current_item))
        else:
            self.rect[self.rows - row - 1,col] = self.canvas.create_rectangle(x1,y1,x2,y2, fill=COLORS[self.current_item], outline = 'black', width = DEFAULTWIDTH, tag = 'block')
            self.rect_text[self.rows - row - 1,col] = self.canvas.create_text((x1+x2)/2,(y1+y2)/2, text = self.current_item, font=('verdana', 7), tag = 'blocktext')

        self.levels[self.curr_level][self.rows - row - 1,col] = self.current_item

        if row < self.rows and row >=0 and col < self.cols and col >= 0:
            self.lbl_e.config(text = 'x,y,z: ' + str(self.rows-row-1) + ',' + str(self.curr_level) + ',' + str(col))

    def callbackRightClick(self,event):
        col = int(math.floor((event.x)/self.cellwidth))
        row = int(math.floor((event.y)/self.cellheight))

        if (self.rows - row - 1,col) in self.rect:
            self.canvas.delete(self.rect[self.rows - row - 1,col])
            self.canvas.delete(self.rect_text[self.rows - row - 1,col])
            self.rect.pop((self.rows - row -1, col))
            self.rect_text.pop((self.rows - row -1, col))

        self.levels[self.curr_level].pop((self.rows - row - 1,col),None)

        if row < self.rows and row >=0 and col < self.cols and col >= 0:
            self.lbl_e.config(text = 'x,y,z: ' + str(self.rows-row-1) + ',' + str(self.curr_level) + ',' + str(col))
Ejemplo n.º 23
0
class MazePlannerCanvas(Frame):
    """
    MazePlannerCanvas contains the main frontend workhorse functionality of the entire
    application.
    it allows the user to graphically place nodes and define the edges between them
    """
    def __init__(self, parent, status=None, manager=DataStore()):
        """
        Construct an instance of the MazePlannerCanvas

        :param parent:              The parent widget that the mazePlannerCanvas will sit in
        :param status:              The statusbar that will receive mouse updates
        :type manager: DataStore
        :return:
        """
        Frame.__init__(self, parent)
        self._manager = manager
        self._canvas = Canvas(self, bg="grey", cursor="tcross")
        self._canvas.pack(fill=BOTH, expand=1)
        self._commands = {
            (ControlSpecifier.DRAG_NODE,    ExecutionStage.START)       : self._begin_node_drag,
            (ControlSpecifier.CREATE_EDGE,  ExecutionStage.START)       : self._begin_edge,
            (ControlSpecifier.DRAG_NODE,    ExecutionStage.END)         : self._end_node_drag,
            (ControlSpecifier.CREATE_EDGE,  ExecutionStage.END)         : self._end_edge,
            (ControlSpecifier.DRAG_NODE,    ExecutionStage.EXECUTE)     : self._execute_drag,
            (ControlSpecifier.CREATE_EDGE,  ExecutionStage.EXECUTE)     : self._execute_edge,
            (ControlSpecifier.MENU,         ExecutionStage.EXECUTE)     : self._launch_menu,
            (ControlSpecifier.CREATE_NODE,  ExecutionStage.EXECUTE)     : self.create_new_node,
        }
        self._commands = load_controls(self._commands)
        self._edge_cache = \
            {
                "x_start"       : None,
                "y_start"       : None,
                "x_end"         : None,
                "y_end"         : None,
                "item_start"    : None,
                "item_end"      : None,
                "edge"          : None
            }
        self._command_cache = None
        self._cache = \
            {
                "item"  : None,
                "x"     : 0,
                "y"     : 0,
                "event" : None
            }
        self._status = status
        self._edge_bindings = {}
        self._node_listing = {}
        self._object_listing = {}
        self._curr_start = None
        self._construct(parent)

    def _construct(self, parent):
        """
        Construct all of the event bindings and callbacks for mouse events
        """
        self._canvas.focus_set()
        self._canvas.bind("<B1-Motion>", lambda event, m_event=Input_Event.DRAG_M1: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<B2-Motion>", lambda event, m_event=Input_Event.DRAG_M2: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<B3-Motion>", lambda event, m_event=Input_Event.DRAG_M3: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonPress-2>", lambda event, m_event=Input_Event.CLICK_M2: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonRelease-2>", lambda event, m_event=Input_Event.RELEASE_M2: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonPress-1>", lambda event, m_event=Input_Event.CLICK_M1: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonPress-3>", lambda event, m_event=Input_Event.CLICK_M3: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonRelease-1>", lambda event, m_event=Input_Event.RELEASE_M1: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<ButtonRelease-3>", lambda event, m_event=Input_Event.RELEASE_M3: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<Return>", lambda event, m_event=Input_Event.RETURN: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<Double-Button-1>", lambda event, m_event=Input_Event.D_CLICK_M1: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<Double-Button-2>", lambda event, m_event=Input_Event.D_CLICK_M2: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<Double-Button-3>", lambda event, m_event=Input_Event.D_CLICK_M3: self._handle_mouse_events(m_event, event))
        self._canvas.bind("<Motion>", lambda event, m_event=None : self._handle_mot(m_event, event))
        self._canvas.bind("<Enter>", lambda event: self._canvas.focus_set())
        self._canvas.bind("<space>", lambda event, m_event=Input_Event.SPACE: self._handle_mouse_events(m_event, event))

    def _handle_mot(self, m_event, event):
        """
        Callback function to handle movement of the mouse

        Function updates the mouse location status bar as well as setting cache values to the current location
        of the mouse

        :m_event:           The specifier for the type of event that has been generated
        :event:             The tk provided event object
        """
        event.x = int(self._canvas.canvasx(event.x))
        event.y = int(self._canvas.canvasy(event.y))
        self._status.set_text("Mouse X:" + str(event.x) + "\tMouse Y:" + str(event.y))
        item = self._get_current_item((event.x, event.y))
        if self._is_node(item):
            Debug.printi("Node: " + str(item), Debug.Level.INFO)
        if self._is_edge(item):
            d_x = self._edge_bindings[item].x_start - self._edge_bindings[item].x_end
            d_y = self._edge_bindings[item].y_start - self._edge_bindings[item].y_end
            square = (d_x * d_x) + (d_y * d_y)
            distance = int(math.sqrt(square))
            Debug.printi("Edge: " + str(item) + " | Source: "
                         + str(self._edge_bindings[item].item_start) + " | Target: "
                         + str(self._edge_bindings[item].item_end) + " | Length: "
                         + str(distance))
        self._cache["x"] = event.x
        self._cache["y"] = event.y

    def _handle_mouse_events(self, m_event, event):
        """
        Function that routes mouse events to the appropriate handlers

        Prints logging and UI information about the state of the mouse and then routes
        the mouse event to the appropriate handler

        :m_event:           The specifier for the tupe of event that has been generated
        :event:             The tk provided event object
        """
        event.x = int(self._canvas.canvasx(event.x))
        event.y = int(self._canvas.canvasy(event.y))
        self._status.set_text("Mouse X:" + str(self._cache["x"]) + "\tMouse Y:" + str(self._cache["y"]))
        Debug.printet(event, m_event, Debug.Level.INFO)
        self._cache["event"] = event
        try:
            self._commands[m_event]((event.x, event.y))
        except KeyError:
            Debug.printi("Warning, no control mapped to " + m_event, Debug.Level.ERROR)
        self._command_cache = m_event


    def _begin_node_drag(self, coords):
        """
        Handles starting operations for dragging a node

        Updates the cache information regarding a node drag event, we will used this cache value
        as the handle on which node to update the information for

        :coords:            The mouse coordinates associated with this event
        """
        # Determine which node has been selected, cache this information
        item = self._get_current_item(coords)
        if item in self._node_listing:
            self._update_cache(item, coords)

    def _end_node_drag(self, coords):
        """
        Performs actions to complete a node drag operation

        Validates node location, and other associated object information and updates the cache
        when a node drag is completed

        :coords:            The coordinates associated with this event
        """
        if self._cache["item"] is None:
            return

        # Obtain the final points
        x = coords[0]
        y = coords[1]
        item = self._cache["item"]
        self._validate_node_position(coords)

        container = self._manager.request(DataStore.DATATYPE.NODE, item)
        container.x_coordinate = x
        container.y_coordinate = y
        self._manager.inform(DataStore.EVENT.NODE_EDIT, container.empty_container(), self._cache["item"])
        Debug.printi("Node " + str(self._cache["item"]) + " has been moved", Debug.Level.INFO)
        # Clean the cache
        self._clear_cache(coords)

    def _validate_node_position(self, coords):
        """
        if x < 0:
            x = 0
        if y < 0:
            y = 0
        if x > self._canvas.winfo_width():
            x = self._canvas.winfo_width()-25
        if y > self._canvas.winfo_height():
            y = self._canvas.winfo_height()-25
        self._canvas.move(item, x, y)
        """
        pass

    def _execute_drag(self, coords):
        """
        Updates object position on canvas when user is dragging a node

        :param coords:          The coordinates associated with this event
        """
        # Abort drag if the item is not a node
        if self._cache["item"] not in self._node_listing:
            return
        # Update the drawing information
        delta_x = coords[0] - self._cache["x"]
        delta_y = coords[1] - self._cache["y"]

        # move the object the appropriate amount as long as the drag event has not been done on the empty canvas
        if not self._cache["item"] is None:
            self._canvas.move(self._cache["item"], delta_x, delta_y)

        # record the new position
        self._cache["x"] = coords[0]
        self._cache["y"] = coords[1]

        self._update_attached_edges(self._cache["item"], coords)
        self._update_attached_objects(self._cache["item"], coords)

    def _update_attached_objects(self, item, coords):
        if item not in self._object_listing:
            return
        container = self._manager.request(DataStore.DATATYPE.OBJECT, item)
        container.x_coordinate = coords[0]
        container.y_coordinate = coords[1]
        self._manager.inform(DataStore.EVENT.OBJECT_EDIT, container.empty_container(), item)

    def _update_attached_edges(self, node, coords):
        """
        Updates all associated edges related to a node drag event

        :param node:            The node that has been dragged
        :param coords:          The mouse coordinates which are the new coordinates of the node
        """
        # Go through dictionary and gather list of all attached edge bindings for a node
        start_bindings = []
        for key, binding in self._edge_bindings.iteritems():
            if binding.item_start == node:
                start_bindings.append(binding)

        end_bindings = []
        for key, binding in self._edge_bindings.iteritems():
            if binding.item_end == node:
                end_bindings.append(binding)

        #  Adjust the bindings with this node as the starting edge
        for binding in start_bindings:
            self._canvas.delete(binding.edge)
            del self._edge_bindings[binding.edge]
            old_edge = binding.edge
            binding.edge = self._canvas.create_line(coords[0], coords[1], binding.x_end,
                                                    binding.y_end, tags="edge", activefill="RoyalBlue1", tag="edge")
            self._edge_bindings[binding.edge] = binding
            self._manager.update_key(DataStore.EVENT.EDGE_EDIT, binding.edge, old_edge)
            binding.x_start = coords[0]
            binding.y_start = coords[1]

        # Adjust the bindings with this node as the ending edge
        for binding in end_bindings:
            self._canvas.delete(binding.edge)
            del self._edge_bindings[binding.edge]
            old_edge = binding.edge
            binding.edge = self._canvas.create_line(binding.x_start, binding.y_start,
                                                    coords[0], coords[1], tags="edge", activefill="RoyalBlue1", tag="edge")
            self._edge_bindings[binding.edge] = binding
            self._manager.update_key(DataStore.EVENT.EDGE_EDIT, binding.edge, old_edge)
            binding.x_end = coords[0]
            binding.y_end = coords[1]

        # Remember to adjust all of the edges so that they sit under the node images
        self._canvas.tag_lower("edge")

    def _launch_menu(self, coords):
        """
        Callback function in response to the pressing of the Return key

        Launches a context menu based on the location of the mouse
        :param coords:
        :return:
        """
        # Configure the "static" menu entries -- they can't be static without seriously destroying readability
        # due to the Python version that is being used -.- so now it has to be not optimal until I find a better
        # solution
        p_menu = Menu(self._canvas)
        item = self._get_current_item((self._cache["x"], self._cache["y"]))
        updated_coords = self._canvas_to_screen((self._cache["x"], self._cache["y"]))
        if item is None:
            # No node is currently selected, create the general menu
            p_menu.add_command(label="Place Room", command=lambda: self.create_new_node((self._cache["x"], self._cache["y"])))
            p_menu.add_command(label="Delete All", command=lambda: self.delete_all())
            p_menu.tk_popup(updated_coords[0], updated_coords[1])
            return

        if self._is_node(item):
            # Create the node specific menu
            p_menu.add_command(label="Place Object", command=lambda: self._mark_object((self._cache["x"], self._cache["y"])))
            p_menu.add_command(label="Edit Room", command=lambda: self._selection_operation((self._cache["x"], self._cache["y"])))
            p_menu.add_command(label="Delete Room", command=lambda: self.delete_node(self._get_current_item((self._cache["x"], self._cache["y"]))))
            p_menu.add_command(label="Mark as start", command=lambda: self._mark_start_node(self._get_current_item((self._cache["x"], self._cache["y"]))))

            if self._is_object(item):
                # Launch the node menu as well as an an added option for selecting stuff to edit an object
                p_menu.add_command(label="Edit Object", command=lambda: self._edit_object(coords))
                p_menu.add_command(label="Delete Object", command=lambda: self._delete_object(self._get_current_item((self._cache["x"], self._cache["y"]))))
                p_menu.delete(0)
            p_menu.tk_popup(updated_coords[0], updated_coords[1])
            return

        if self._is_edge(item):
            p_menu.add_command(label="Edit Corridor", command=lambda: self._selection_operation((self._cache["x"], self._cache["y"])))
            p_menu.add_command(label="Delete Corridor", command=lambda: self.delete_edge(self._get_current_item((self._cache["x"], self._cache["y"]))))
            p_menu.tk_popup(updated_coords[0], updated_coords[1])
            return

        self._clear_cache(coords)

    def _edit_object(self, coords):

        """
        Awkward moment when you find a threading related bug in the Tkinter library, caused by some
        Tcl issue or something like that.
        The below line must be left commented out otherwise the window_wait call in the dialog will crash
        out with a Tcl ponter based issue :/
        item = self._get_current_item((self._cache["x"], self._cache["y"]))
        This means that we can only use the mouse to edit objects
        """

        item = self._get_current_item(coords)

        if item not in self._object_listing:
            Debug.printi("Not a valid object to edit", Debug.Level.ERROR)
            return
        obj = ObjectDialog(self, coords[0] + 10, coords[1] + 10, populator=self._manager.request(DataStore.DATATYPE.OBJECT, item))
        Debug.printi("Editing object " + str(item), Debug.Level.INFO)
        self._manager.inform(DataStore.EVENT.OBJECT_EDIT, obj._entries, item)
        Debug.printi("Editing object " + str(item), Debug.Level.INFO)

    def _delete_object(self, item):
        if item not in self._object_listing:
            Debug.printi("Object does not exist to delete", Debug.Level.ERROR)
            return
        del self._object_listing[item]
        self._manager.inform(DataStore.EVENT.OBJECT_DELETE, data_id=item)
        self._canvas.itemconfig(item, outline="red", fill="black", activeoutline="black", activefill="red")

    def _mark_object(self, coords, prog=False, data=None):
        """
        Mark a node as containing an object
        :param coords:
        :return:
        """
        # Retrieve the item
        item = self._get_current_item(coords)

        if not prog:
            if item not in self._node_listing:
                Debug.printi("Invalid object placement selection", Debug.Level.ERROR)
                return

            if item in self._object_listing:
                Debug.printi("This room already has an object in it", Debug.Level.ERROR)
                return
            # Retrieve its coordinates
            # Launch the object maker dialog
            obj = ObjectDialog(self, coords[0] + 10, coords[1] + 10, populator=Containers.ObjectContainer(key_val={
                "x_coordinate"  :   coords[0],
                "y_coordinate"  :   coords[1],
                "name"          :   "Object_"+str(item),
                "mesh"          :   None,
                "scale"         :   None
            }))
            entries = obj._entries
        else:
            entries = {
                "x_coordinate": coords[0],
                "y_coordinate": coords[1],
                "name": data["name"],
                "mesh": data["mesh"],
                "scale": data["scale"]
            }
        # Save informatoin to the manager
        self._manager.inform(DataStore.EVENT.OBJECT_CREATE, entries, item)
        self._object_listing[item] = item
        self._canvas.itemconfig(item, fill="blue")
        Debug.printi("Object created in room " + str(item), Debug.Level.INFO)

    def _valid_edge_cache(self):
        """
        Return true if the edge cache contains a valid edge descriptor

        A valid edge descriptor is when the edge has a valid starting node, if the
        edge does not contain a valid starting node, this means that the edge was not
        created in the proper manner and should thus be ignored by any edge operations
        """
        valid = not self._edge_cache["item_start"] == (None,)
        return valid

    def _canvas_to_screen(self, coords):
        """
        Convert canvas coordinates into screen coordinates

        :param coords:              The current canvas coordinates
        :return:
        """
        """
        # upper left corner of the visible region
        x0 = self._canvas.winfo_rootx()
        y0 = self._canvas.winfo_rooty()

        # given a canvas coordinate cx/cy, convert it to window coordinates:
        wx0 = x0 + coords[0]
        wy0 = y0 + coords[1]


        # upper left corner of the visible region

        x0 = self._canvas.canvasx(0)
        y0 = self._canvas.canvasy(0)

        # given a canvas coordinate cx/cy, convert it to window coordinates:
        wx0 = coords[0] - x0
        wy0 = coords[1] - y0
        #"""
        return (self._cache["event"].x_root, self._cache["event"].y_root)

    def _begin_edge(self, coords):
        """
        Begin recording information regarding the placement of an edge

        :param coords:               The coordinates associated with this event
        """
        # Record the starting node
        self._edge_cache["item_start"] = self._get_current_item((self._cache["x"], self._cache["y"]))

        # Abort the operation if the item was not a valid node to be selecting
        if self._edge_cache["item_start"] is None or self._edge_cache["item_start"] not in self._node_listing:
            self._clear_edge_cache()
            return

        self._edge_cache["x_start"] = self._cache["x"]
        self._edge_cache["y_start"] = self._cache["y"]

    def _end_edge(self, coords, prog=False, data=None):
        """
        Perform the operations required to complete an edge creation operation
        :param coords:
        :return:
        """
        # Check if the cursor is over a node, if so continue, else abort
        curr = self._get_current_item((coords[0], coords[1]))
        if not prog:
            if curr is None or not self._valid_edge_cache() or curr not in self._node_listing:
                # Abort the edge creation process
                self._canvas.delete(self._edge_cache["edge"])
                self._clear_edge_cache()
                return

            # Check if this edge already exists in the program
            if self._check_duplicate_edges(self._edge_cache["item_start"], curr):
                self.delete_edge(self._edge_cache["edge"])
                Debug.printi("Multiple edges between rooms not permitted", Debug.Level.ERROR)
                return

            #Ensure that edges arent made between the same room
            if curr == self._edge_cache["item_start"]:
                Debug.printi("Cannot allow paths starting and ending in the same room", Debug.Level.ERROR)
                return

        self._canvas.tag_lower("edge")
        self._edge_cache["item_end"] = curr

        # Note that we use the edge ID as the key
        self._edge_bindings[self._edge_cache["edge"]] = EdgeBind(self._edge_cache)
        self._edge_bindings[self._edge_cache["edge"]].x_end = coords[0]
        self._edge_bindings[self._edge_cache["edge"]].y_end = coords[1]
        # Inform the manager
        if not prog:
            self._manager.inform(
                DataStore.EVENT.EDGE_CREATE,
                    {
                        "source"    :   self._edge_cache["item_start"],
                        "target"    :   self._edge_cache["item_end"],
                        "height"    :   None,
                        "wall1"     :   {
                            "height":Defaults.Edge.WALL_HEIGHT,
                            "textures":{
                                Defaults.Wall.PATH: {
                                    "path":Defaults.Wall.PATH,
                                    "tile_x":Defaults.Wall.TILE_X,
                                    "tile_y":Defaults.Wall.TILE_Y,
                                    "height":None
                                }
                            }
                        } if Defaults.Config.EASY_MAZE else None,
                        "wall2"     : {
                            "height": Defaults.Edge.WALL_HEIGHT,
                            "textures": {
                                Defaults.Wall.PATH: {
                                    "path": Defaults.Wall.PATH,
                                    "tile_x": Defaults.Wall.TILE_X,
                                    "tile_y": Defaults.Wall.TILE_Y,
                                    "height":None
                                }
                            }
                        }
                    } if Defaults.Config.EASY_MAZE else None,
                self._edge_cache["edge"])
        else:
            # We are programmatically adding the edges in
            self._manager.inform(
                DataStore.EVENT.EDGE_CREATE,
                {
                    "source": self._edge_cache["item_start"],
                    "target": self._edge_cache["item_end"],
                    "height": None,
                    "wall1": data["wall1"],
                    "wall2": data["wall2"]
                },
                self._edge_cache["edge"])

        Debug.printi("Edge created between rooms "
                     + str(self._edge_cache["item_start"])
                     + " and "
                     + str(self._edge_cache["item_end"])
                     , Debug.Level.INFO)
        self._clear_edge_cache()
        self._clear_cache(coords)

    def _check_duplicate_edges(self, start_node, end_node):
        for binding in self._edge_bindings.itervalues():
            if ( start_node == binding.item_start and end_node == binding.item_end )\
            or ( start_node == binding.item_end and end_node == binding.item_start):
                return True
        return False

    def _execute_edge(self, coords):
        """
        Perform the operations that occur during the motion of an edge drag

        :param coords:
        :return:
        """
        # Update the line position
        # We will update the line position by deleting and redrawing
        if not self._valid_edge_cache():
            return

        self._canvas.delete(self._edge_cache["edge"])
        self._edge_cache["edge"] = self._canvas.create_line( \
            self._edge_cache["x_start"], self._edge_cache["y_start"],
            coords[0]-1, coords[1]-1, tags="edge", activefill="RoyalBlue1", tag="edge")
        d_x = self._edge_cache["x_start"] - coords[0]
        d_y = self._edge_cache["y_start"] - coords[1]
        square = (d_x * d_x) + (d_y * d_y)
        distance = math.sqrt(square)
        Debug.printi("Current corridor distance: " + str(int(distance)))

    def _update_cache(self, item, coords):
        """
        Update the local cache with the item id and coordinates of the mouse

        :param item:                The item with which to update the cache
        :param coords:              The current event coordinates
        """
        self._cache["item"] = item
        self._cache["x"] = coords[0]
        self._cache["y"] = coords[1]

    def _clear_cache(self, coords):
        """
        Clear the cache

        Set the cache values to the current mouse position and None the item
        :param coords:              The coordinates of the mouse at that event time
        """
        self._cache["item"] = None
        self._cache["x"] = coords[0]
        self._cache["y"] = coords[1]

    def _clear_edge_cache(self):
        """
        Clear the edge cache to None for all values
        :return:
        """
        self._edge_cache["x_start"]       = None,
        self._edge_cache["y_start"]       = None,
        self._edge_cache["x_end"]         = None,
        self._edge_cache["y_end"]         = None,
        self._edge_cache["item_start"]    = None,
        self._edge_cache["item_end"]      = None,
        self._edge_cache["edge"]          = None


    def _get_current_item(self, coords):
        """
        Return the item(if any) that the mouse is currently over
        :param coords:                  The current coordinates of the mouse
        :return:
        """
        item = self._canvas.find_overlapping(coords[0]-1, coords[1]-1, coords[0]+1, coords[1]+1)

        if item is ():
            return None

        # Hacky solution
        # Return the first node that we come across, since they seem to be returned by tkinter
        # in reverse order to their visual positioning, we'll go through the list backwards
        for val in item[::-1]:
            if val in self._node_listing:
                return val

        # Else, just return the first item and be done with it
        return item[0]

    def _is_node(self, obj):
        """
        Returns true if the supplied object is a node
        :param obj:             The object id to id
        :return:
        """
        return obj in self._node_listing

    def _is_edge(self, obj):
        """
        Returns true if the supplied object is an edge

        :param obj:             The object id to id
        :return:
        """
        return obj in self._edge_bindings

    def _is_object(self, obj):
        """
        Returns true if the supplied object is an object

        :param obj:             The object id to id
        :return:
        """
        return obj in self._object_listing

    def _get_obj_type(self, obj):
        """
        Returns the Object type of the supplied object

        :param obj:             The object to identify
        :return:
        """
        if self._is_node(obj):
            return EditableObject.NODE
        if self._is_edge(obj):
            return EditableObject.EDGE
        if self._is_object(obj):
            return EditableObject.OBJECT
        return None

    def _selection_operation(self, coords):
        """
        Contextually create or edit a node
        :param coords:
        :return:
        """
        # Determine the item ID
        item = self._get_current_item(coords)
        self._cache["item"] = item
        true_coords = self._canvas_to_screen((self._cache["x"], self._cache["y"]))

        if self._is_node(item):
            Debug.printi("Node Selected : " + str(item) + " | Launching Editor", Debug.Level.INFO)
            # Make request from object manager using the tag assigned
            populator = self._manager.request(DataStore.DATATYPE.NODE, item)
            updated_node = NodeDialog(self, true_coords[0] + 10, true_coords[1] + 10, populator=populator)
            # post information to object manager, or let the dialog handle it, or whatever
            self._manager.inform(DataStore.EVENT.NODE_EDIT, updated_node._entries, item)
            return

        if self._is_edge(item):
            Debug.printi("Edge Selected : " + str(item) + " | Launching Editor", Debug.Level.INFO)
            # Make a request from the object manager to populate the dialog
            populator = self._manager.request(DataStore.DATATYPE.EDGE, item)
            updated_edge = EdgeDialog(self, true_coords[0] + 10, true_coords[1] + 10, populator=populator)
            # Make sure that information is posted to the object manager
            self._manager.inform(DataStore.EVENT.EDGE_EDIT, updated_edge._entries, item)

            return

        if self._is_object(item):
            self._edit_object(coords)
            return

    def create_new_node(self, coords, prog = False, data=None):
        """
        Creates a new node on the Canvas and adds it to the datastore
        :param coords:
        :return:
        """
        # Create the node on Canvas
        self._cache["item"] = self._canvas.create_rectangle(coords[0], coords[1], coords[0]+25, coords[1]+25,
                                                            outline="red", fill="black", activeoutline="black", activefill="red", tag="node")

        self._node_listing[self._cache["item"]] = self._cache["item"]
        if not prog:
            if not Defaults.Config.EASY_MAZE:

                true_coords = self._canvas_to_screen((self._cache["x"], self._cache["y"]))
                new_node = NodeDialog(self, true_coords[0] + 25, true_coords[1] + 25,
                                      populator=Containers.NodeContainer(
                                          {
                                              "node_id": self._cache["item"],
                                              "x_coordinate": self._cache["x"],
                                              "y_coordinate": self._cache["y"],
                                              "room_texture": None,
                                              "wall_pictures": None
                                          }))
                entries = new_node._entries
            else:
                entries = {
                    "node_id": self._cache["item"],
                    "x_coordinate": self._cache["x"],
                    "y_coordinate": self._cache["y"],
                    "room_texture": Defaults.Node.ROOM_TEXTURE,
                    "wall_pictures": None
                }
        else:
            pics = data[1]
            data = data[0]
            entries = {
                "node_id": data["id"],
                "x_coordinate": data["x"],
                "y_coordinate": data["y"],
                "room_texture": data["texture"],
                "wall_pictures": pics
            }
        # Inform the datastore
        self._manager.inform(DataStore.EVENT.NODE_CREATE, entries, self._cache["item"])
        self._clear_cache(coords)

    def delete_all(self):
        """
        Delete all nodes and associated edges and objects from the canvas
        """
        # Iterate over each node in the node listing and delete it using delete node
        for key in self._node_listing.keys():
            self.delete_node(key)

        # Delete any rouge edge bindings that may exist
        for binding in self._edge_bindings:
            self.delete_edge(binding)

        self._object_listing.clear()

        # Delete any naughty objects that are left
        self._canvas.delete("all")
        self._manager.inform(DataStore.EVENT.DELETE_ALL)

    def delete_node(self, node_id):
        """
        Delete a node and all its associated edges and object from the canvas

        :param node_id:             The tkinter id of the node to be deleted
        """
        # Delete from our internal representations
        if node_id not in self._node_listing:
            return

        del self._node_listing[node_id]
        # Delete from the canvas
        self._canvas.delete(node_id)

        # Iterate through the edge bindings and delete all of those
        for key in self._edge_bindings.keys():
            if self._edge_bindings[key].item_start == node_id or self._edge_bindings[key].item_end == node_id:
                self.delete_edge(key)
        # Inform the object manager that a node as been deleted
        if node_id in self._object_listing:
            self._delete_object(node_id)
        self._manager.inform(DataStore.EVENT.NODE_DELETE, data_id=node_id)

    def delete_edge(self, edge_id):
        """
        Delete the specified edge from the MazeCanvas

        :param edge_id:             The edge to be deleted
        :return:
        """
        # Go through the edge bindings and delete the appropriate edge
        try:
            # try to delete the edge binding if it exists
            del self._edge_bindings[edge_id]
        except KeyError:
            # Terrible I know, but I dont have the time to find the root cause
            pass
        # Delete the edge from the canvas
        self._canvas.delete(edge_id)
        # Inform the object manager that an edge has been deleted
        self._manager.inform(DataStore.EVENT.EDGE_DELETE, data_id=edge_id)

    def _mark_start_node(self, node_id):
        """
        Mark the passed in node as the starting node
        :param node_id:
        :return:
        """
        # Print the debug information
        # Mark as the new starting node on the canvas, first check that it is a node
        if node_id in self._node_listing:
            Debug.printi("Node:" + str(node_id) + " has been marked as the new starting node", Debug.Level.INFO)
            if self._curr_start is not None:
                # Return the old starting node to its normal colour
                self._canvas.itemconfig(self._curr_start, outline="red", fill="black", activeoutline="black", activefill="red")
            self._curr_start = node_id
            self._canvas.itemconfig(node_id, outline="black", fill="green", activeoutline="green", activefill="black")

        # Inform the object manager that there is a new starting node
        environment_container = self._manager.request(DataStore.DATATYPE.ENVIRONMENT)
        environment_container.start_node = node_id
        self._manager.inform(DataStore.EVENT.ENVIRONMENT_EDIT, environment_container)
Ejemplo n.º 24
0
cell_size = 20
canvas = Canvas(root, height=win_height)
canvas.pack(fill=BOTH)

field_height = win_height / cell_size
field_width = win_width / cell_size

cell_matrix = []
for i in xrange(field_height):
    for j in xrange(field_width):
        square = canvas.create_rectangle(2 + cell_size * j,
                                         2 + cell_size * i,
                                         cell_size + cell_size * j - 2,
                                         cell_size + cell_size * i - 2,
                                         fill=fill_color)
        canvas.itemconfig(square, state=HIDDEN, tags=('hid', '0'))
        cell_matrix.append(square)
fict_square = canvas.create_rectangle(0,
                                      0,
                                      0,
                                      0,
                                      state=HIDDEN,
                                      tags=('hid', '0'))
cell_matrix.append(fict_square)

canvas.itemconfig(cell_matrix[addr(8, 8)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addr(10, 9)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addr(9, 9)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addr(9, 8)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addr(9, 7)], state=NORMAL, tags='vis')
canvas.itemconfig(cell_matrix[addr(10, 7)], state=NORMAL, tags='vis')
Ejemplo n.º 25
0
class StlFrame(Frame):
	def __init__(self, root, scale=1):
		Frame.__init__(self, root)
		self.app = root
		
		self.gridOffset = 10
		self.arrangeMargin = 2
		self.centerOnLoad = True
		
		self.offsetx = 0
		self.offsety = 0
		self.scale = scale
		self.zoom = 1
		
		self.selection = None
		self.selectable = []
		self.itemMap = {}

		self.canvas = Canvas(self, width=200*self.scale+13, height=200*self.scale+13, bd=2, relief=RIDGE, bg="white")
		self.canvas.config(takefocus="1")
		self.canvas.bind("<Key>", self.keyCanvas)
		self.canvas.bind("<Button-1>", self.clickCanvas)
		self.canvas.bind("<B1-Motion>", self.dragCanvas)
		self.canvas.bind("<MouseWheel>", self.wheelCanvas)
		self.canvas.bind("<Button-4>", self.wheelCanvas)
		self.canvas.bind("<Button-5>", self.wheelCanvas)

		self.root = root
		self.buildarea = [200, 200]

		self.canvas.grid(row=1,column=1,columnspan=5)
		self.drawGrid()	
		
	def keyCanvas(self, event):
		self.app.setModified()
		if event.keysym == "Left":
			self.moveStl(-1, 0)
		elif event.keysym == "Right":
			self.moveStl(1, 0)
		elif event.keysym == "Up":
			if (event.state & SHIFT_MASK) != 0:
				self.rotateStl(1)
			else:
				self.moveStl(0, 1)
		elif event.keysym == "Down":
			if (event.state & SHIFT_MASK) != 0:
				self.rotateStl(-1)
			else:
				self.moveStl(0, -1)
	
	def clickCanvas(self, event):
		self.app.setModified()
		self.canvas.focus_set()
		self.startx = event.x/float(self.scale)
		self.starty = event.y/float(self.scale)
		itemIdList = self.canvas.find_closest(event.x, event.y)
		for itemId in itemIdList:
			if itemId in self.selectable:
				self.setSelection(itemId)
				self.app.setSelection(self.itemMap[itemId])
				return

	def dragCanvas(self, event):
		self.app.setModified()
		self.canvas.focus_set()
		x = event.x/float(self.scale)
		y = event.y/float(self.scale)
		self.moveStl((x - self.startx), (self.starty - y))
		self.startx = x
		self.starty = y
		
	def wheelCanvas(self, event):
		self.app.setModified()
		if event.num == 4 or event.delta == 120:
			self.rotateStl(1)
		elif event.num == 5 or event.delta == -120:
			self.rotateStl(-1)
			
	def moveStl(self, dx, dy):
		if self.selection is None:
			return
		self.canvas.move(self.selection, dx*self.scale, -dy*self.scale)
		stlObj = self.itemMap[self.selection]
		stlObj.deltaTranslation(dx, dy)
			
	def rotateStl(self, angle):
		if self.selection is None:
			return
		#self.canvas.move(self.selection, dx, -dy)
		stlObj = self.itemMap[self.selection]
		rads = math.radians(angle+stlObj.rotation)
		cos = math.cos(rads)
		sin = math.sin(rads)
		
		d = []
		xMin = yMin = 99999
		xMax = yMax = -99999
		for x,y in stlObj.hull:
			xp = (x-stlObj.hxCenter)*cos - (y-stlObj.hyCenter)*sin + stlObj.hxCenter
			if xp < xMin: xMin=xp
			if xp > xMax: xMax=xp
			xp += stlObj.translatex
			
			yp = (x-stlObj.hxCenter)*sin + (y-stlObj.hyCenter)*cos + stlObj.hyCenter
			if yp < yMin: yMin=yp
			if yp > yMax: yMax=yp
			yp += stlObj.translatey
			d.extend(self.transform(xp,self.buildarea[1]-yp))

		self.canvas.delete(stlObj.name)
		self.selectable.remove(self.selection)
		del self.itemMap[self.selection]
			
		itemId = self.canvas.create_polygon(d, fill=hilite, outline="black", tag=stlObj.name, width=3)
		self.selectable.append(itemId)
		self.itemMap[itemId] = stlObj
		self.setSelection(itemId)

		stlObj.deltaRotation(angle)
		stlObj.hxSize = xMax-xMin
		stlObj.hySize = yMax-yMin
		stlObj.hArea = stlObj.hxSize * stlObj.hySize

		
	def setSelection(self, itemId):
		if itemId not in self.selectable:
			return
		
		if self.selection is not None:
			self.canvas.itemconfig(self.selection, fill=gray)
			
		self.canvas.itemconfig(itemId, fill=hilite)
		self.selection = itemId
		
	def setSelectionByName(self, name):
		for i in self.itemMap.keys():
			if self.itemMap[i].name == name:
				self.setSelection(i)
				return
		
	def getSelection(self):
		return self.selection
	
	def getSelectedStl(self):
		if self.selection is None:
			return None
		
		return self.itemMap[self.selection]

	def drawGrid(self):
		self.canvas.delete("GRID")
		ltGray = "#C0C0C0"
		dkGray = "#808080"
		
		yleft = 0

		yright = self.buildarea[1]*self.zoom*self.scale
		if yright > self.buildarea[1]*self.scale: yright = self.buildarea[1]*self.scale

		for x in range(0, self.buildarea[0]+1, 10):
			if x%50 == 0:
				c = dkGray
			else:
				c = ltGray
			x = x*self.zoom*self.scale
			if x >= 0 and x <= self.buildarea[0]*self.scale:
				self.canvas.create_line(x+self.gridOffset, yleft+self.gridOffset, x+self.gridOffset, yright+self.gridOffset, fill=c, tags="GRID")
			
		xtop = 0

		xbottom = self.buildarea[0]*self.zoom*self.scale
		if xbottom > self.buildarea[0]*self.scale: xbottom = self.buildarea[0]*self.scale

		for y in range(0, self.buildarea[1]+1, 10):
			if y%50 == 0:
				c = dkGray
			else:
				c = ltGray
			y = y*self.zoom*self.scale
			if y >= 0 and y <= self.buildarea[1]*self.scale:
				self.canvas.create_line(xtop+self.gridOffset, y+self.gridOffset, xbottom+self.gridOffset, y+self.gridOffset, fill=c, tags="GRID")
			
	def addStl(self, stlObject, highlight=False, process=True):
		self.canvas.delete(stlObject.name)
		if highlight:
			col = hilite
		else:
			col = gray
			
		if self.centerOnLoad and process:
			dx = (self.buildarea[0]/2) - stlObject.hxCenter
			dy = (self.buildarea[1]/2) - stlObject.hyCenter
			stlObject.deltaTranslation(dx, dy)
			stlObject.applyDeltas()
		
		d = []
		for x,y in stlObject.hull:
			d.extend(self.transform(x,self.buildarea[1]-y))
			
		itemId = self.canvas.create_polygon(d, fill=col, outline="black", tag=stlObject.name, width=3)
		self.selectable.append(itemId)
		self.itemMap[itemId] = stlObject
		if highlight:
			self.setSelection(itemId)
			
	def delStl(self):
		if self.selection is None:
			return

		stlObj = self.itemMap[self.selection]
		self.canvas.delete(stlObj.name)
		self.selectable.remove(self.selection)
		del self.itemMap[self.selection]
		self.selection = None
		
	def delAll(self):
		objs = self.itemMap.values()
		for o in objs:
			self.canvas.delete(o.name)
		self.selectable = []
		self.itemMap = {}
		self.selection = None
		
	def commit(self):
		if self.selection is not None:
			o = self.itemMap[self.selection]
			name = o.name
		else:
			name = ""
			
		objs = self.itemMap.values()
		self.selectable = []
		self.itemMap = {}
		
		for o in objs:
			self.canvas.delete(o.name)
			o.applyDeltas()
			self.addStl(o, highlight=(o.name == name), process=False)
			
	def getItemIdFromObject(self, obj):
		for itemId in self.itemMap.keys():
			if obj.name == self.itemMap[itemId].name:
				return itemId
			
		return None
			
	def arrange(self):
		def cmpobj(a, b):
			return cmp(b.hArea, a.hArea)
		
		omap = Map(self.buildarea)
		maxx = maxy = -99999
		minx = miny = 99999
		
		objs = sorted(self.itemMap.values(), cmpobj)
		for o in objs:
			itemId = self.getItemIdFromObject(o)
			if itemId is None: continue
			
			x, y = omap.find(o.hxSize+self.arrangeMargin*2, o.hySize+self.arrangeMargin*2)
			if x is None or y is None:
				showinfo("Plate full",  "Object %s does not fit" % o.name, parent=self)
			else:
				dx = x - o.hxCenter - o.translatex + o.hxSize/2 + self.arrangeMargin
				dy = y - o.hyCenter - o.translatey + o.hySize/2 + self.arrangeMargin
				
				self.setSelection(itemId)
				self.app.setSelection(o)
				self.moveStl(dx, dy)
				deltax = o.hxSize+self.arrangeMargin*2
				deltay = o.hySize+self.arrangeMargin*2
				omap.mark(x, y, deltax, deltay)
				if x < minx: minx=x
				if x+deltax > maxx: maxx=x+deltax
				if y < miny: miny=y
				if y+deltay > maxy: maxy=y+deltay
				
		dx = self.buildarea[0]/2-(maxx+minx)/2
		dy = self.buildarea[1]/2-(maxy+miny)/2

		for o in objs:
			itemId = self.getItemIdFromObject(o)
			if itemId is None: continue
			
			self.setSelection(itemId)
			self.app.setSelection(o)
			self.moveStl(dx, dy)
			
	def getStls(self):
		return self.itemMap.values()
			
	def countObjects(self):
		return len(self.selectable)

	def transform(self, ptx, pty):
		x = (ptx+self.offsetx)*self.zoom*self.scale+self.gridOffset
		y = (pty-self.offsety)*self.zoom*self.scale+self.gridOffset
		return (x, y)
	
	def triangulate(self, p1, p2):
		dx = p2[0] - p1[0]
		dy = p2[1] - p1[1]
		d = math.sqrt(dx*dx + dy*dy)
		return d
Ejemplo n.º 26
0
class Ex(Frame):
    def __init__(self,parent):
        Frame.__init__(self,parent)
        self.parent = parent
        self.x_before = 400
        self.x_current = 400
        self.y_before = 400
        self.y_current = 400
        self.FirstRun = True
        self.AddVal = ADDVAL
        self.AddVal_X = ADDVAL_X
        self.initUI()
        self.runRandWalk(STEPS)
        self.FirstRun = False
        self.Steps = STEPS
        self.newSteps = STEPS
        self.XStep = XSTEP

    def initUI(self):
        self.parent.title("Random Walk Lines 1")
        self.pack(fill=BOTH,expand=1)
        
        self.style = Style()
        self.style.theme_use("default")
        frame = Frame(self,relief=RAISED,borderwidth=2)
        frame.pack(fill=BOTH,expand=True)

        self.canvas = Canvas(frame)
        self.canvas.create_line(10,400,790,400,dash=(4,2), width=2)
        self.canvas.create_line(400,10,400,790,dash=(4,2), width=2)
        self.canvas.pack(fill=BOTH,expand=1)
        
        self.newWalkButton = Button(self,text="New Walk",
                                   command=self.newWalk)
        self.closeButton   = Button(self,text="Close",
                                    command=self.closeAll)
        self.stepsButton   = Button(self,text="Send Steps",
                                    command=self.sendSteps)
        self.xSizeButton   = Button(self,text="Set X Step",
                                    command=self.xSize)
        self.ySizeButton   = Button(self,text="Set Y Step",
                                    command=self.ySize)
        self.xSizeBox      = Entry(self,width=10)
        self.ySizeBox      = Entry(self,width=10)
        self.stepsBox      = Entry(self,width=10)
        

        # pack the buttons here
        self.closeButton.pack(side=RIGHT,padx=5,pady=5)
        self.newWalkButton.pack(side=RIGHT)
        self.stepsButton.pack(side=RIGHT)
        self.stepsBox.pack(side=RIGHT)
        self.xSizeButton.pack(side=RIGHT)
        self.xSizeBox.pack(side=RIGHT)
        self.ySizeButton.pack(side=RIGHT)
        self.ySizeBox.pack(side=RIGHT)
        
    def ySize(self):
        self.AddVal = int(self.ySizeBox.get())

    def xSize(self):
        self.AddVal_X = int(self.xSizeBox.get())

    def sendSteps(self):
        self.newSteps = int(self.stepsBox.get())
        
    def newWalk(self):
        for x in range(0,self.Steps):
            getTag = "step"+str(x)
            self.canvas.coords(getTag,(0,0,0,0))

        self.Steps = self.newSteps
        self.x_current = 400
        self.x_before  = 400
        self.y_current = 400
        self.y_before  = 400
        self.runRandWalk(self.Steps)
        
    def closeAll(self):
        Frame.quit(self)

    def RandWalk(self,whichStep):
        r = random.randint(0,1)
        rx = random.randint(0,1)
        addval = 0;
        addval_x = 0;
        toTag = "step"+str(whichStep)
        if r == 0:
            addval = (self.AddVal)
        else:
            addval = -(self.AddVal)

        if rx==0:
            addval_x = (self.AddVal_X)
        else:
            addval_x = -(self.AddVal_X)
            
        self.y_current = self.y_before + addval
        self.x_current = self.x_before + addval_x
                
        if self.y_current < 200:
            if self.y_before == 200:
                if self.FirstRun == True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                              self.x_current,self.y_current),)
                    self.canvas.itemconfig(toTag,fill="green")
            else:
                if self.FirstRun == True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:                    
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="green")
        else:
            if self.y_before<200:
                if self.FirstRun==True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "green", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="green")
            else:
                if self.FirstRun==True:
                    self.canvas.create_line(self.x_before,self.y_before,
                                            self.x_current,self.y_current,
                                            fill = "red", width = 5,
                                            tags=toTag)
                else:
                    self.canvas.coords(toTag,(self.x_before,self.y_before,
                                             self.x_current,self.y_current))
                    self.canvas.itemconfig(toTag,fill="red")

                
        self.canvas.pack(fill=BOTH,expand=1)
        self.x_before = self.x_current
        self.y_before = self.y_current
                    

    def runRandWalk(self,steps):
        for x in range(0,steps):
            self.RandWalk(x)
Ejemplo n.º 27
0
class App(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.rect=dict()
        self.max_width = 600
        self.max_height = 600
        self.initDimensions()
        self.initUI()
        self.reset_canvas()
        for i in range(10):
            self.updateCanvas()
        for i in range(100):
            self.newUpdate()
            self.canvas.update_idletasks()

    def initDimensions(self):
        self.canvas_width = self.max_width
        self.canvas_height = self.max_height
        self.rows = 44
        self.cols = 44
        # self.h = 1;
        self.cellwidth = self.canvas_width/self.cols
        self.cellheight = self.canvas_height/self.rows
        print self.cellheight,self.cellwidth

    def updateDimensions(self,r,c,y=1):
        self.rows = r
        self.cols = c

        self.cellwidth = self.max_width/self.cols
        self.cellheight = self.max_height/self.rows
        if(self.cellwidth<=self.cellheight):
            self.cellheight = self.cellwidth
        else:
            self.cellwidth = self.cellheight
        self.canvas_height = self.rows * self.cellheight
        self.canvas_width = self.cols * self.cellwidth

    def initUI(self):
        self.parent.title("Test")
        self.pack(fill=BOTH, expand=0)
        area = Frame(self, width=500, height=500, borderwidth = 2, relief = 'sunken')
        area.grid(row=1, column=0, columnspan=11, rowspan=4,
            padx=5, sticky=E+W+S+N)
        # self.updateDimensions(10, 70)
        self.canvas = Canvas(area, bg='white', width=self.canvas_width, height=self.canvas_height)
        self.canvas.pack()
        # self.rowconfigure(0, pad =10)
        # self.rowconfigure(1, pad =10)

    def reset_canvas(self):
        self.canvas.delete(ALL)
        for col in range(self.cols):
            for row in range(self.rows):
                x1 = col * self.cellwidth
                y1 = row * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight
                self.rect[self.rows - row - 1,col] = self.canvas.create_rectangle(x1,y1,x2,y2, fill="red", tags="rect", outline = 'black', width = 1)



    def newUpdate(self):
        start = time.clock()
        self.canvas.delete(ALL)
        self.rect=dict()
        t = time.clock()
        a = [random.randint(0, self.rows-1) for i in range(500)]
        b = [random.randint(0, self.cols-1) for i in range(500)]
        t1 = time.clock()
        # print 'Random: ', time.clock() - t
        for (row,col) in zip(a,b):
                x1 = col * self.cellwidth
                y1 = row * self.cellheight
                x2 = x1 + self.cellwidth
                y2 = y1 + self.cellheight
                if (row,col) not in self.rect:
                    self.rect[row,col] = self.canvas.create_rectangle(x1,y1,x2,y2, fill="red", tags="rect", outline = 'black', width = 0)

        # print 'Time : ', time.clock() - start - (t1-t)
        # print 'Size of data(2):', len(self.rect)
        # print a
        # print b


    def updateCanvas(self):
        start = time.clock()
        for col in range(self.rows):
            for row in range(self.cols):
                self.canvas.itemconfig(self.rect[row,col],fill='white')
Ejemplo n.º 28
0
def start():
    """ Calaculates several values for the game's run."""
    global canvas, mainChar, root, i, k, bob, Link, bill, f, g, enemy
    user32 = ctypes.windll.user32 #renders size to fullscreen
    w = int(user32.GetSystemMetrics(0))
    h = int(user32.GetSystemMetrics(1))
    f = int(w/40) # calculates how many tiles needed
    g = int(h/40)

    print w

    root = Tk()
    root.title("Transparency")
    frame = Frame(root)
    canvas = Canvas(frame, bg="black", width=w, height=h)
    w, h = root.winfo_screenwidth(), root.winfo_screenheight()
    print w, h
    root.overrideredirect(1)
    root.geometry("%dx%d+0+0" % (w, h))
    root.focus_set() # <-- move focus to this widget
    root.bind("<Escape>", quitApp) # All root bindings
    root.bind("w", moveUp) 
    root.bind("s", moveDown)
    root.bind("a", moveLeft)
    root.bind("d", moveRight)
    #root.bind("h", healthPotion)
    root.bind("<space>", useItem)
    root.bind("b", bossSpawn)
    canvas.pack()




    photoimage = ImageTk.PhotoImage(Image.open("dungeonTile.jpg"))
    mainChar = ImageTk.PhotoImage(Image.open("CobaltKnight.png"))
    enemy = ImageTk.PhotoImage(Image.open("LobsterRoach.png"))
    im = Image.open("Karel.png")
    print im.mode
    x = 0
    y = 0
    print bill, "bill"
    if bill == 0:
        for i in range(f+1):
            for k in range(g+1):
                canvas.create_image(i*40, k*40, image=photoimage)
        bill = 1
    mainSpawn() #spawns main
    mobSpawn(canvas,enemy)  #spawns mobs
    #bob = Label(canvas,width=w,height=h, text = "health", fg = 'red', font = ('Times', 30, 'bold'), anchor = 'nw')
    #bob.pack()
    bob = canvas.create_text(40,40, text = "bob", fill = "red", font = ('Times', 30, 'bold'), anchor = 'nw')
    bar = "health " + str(Link.getHealth()) + "/" + str(Link.getMaxHealth())
    canvas.itemconfig(bob, text=bar)
    canvas.create_rectangle(w-120, 40 , w-40, 120, fill='black', outline = 'white')
    canvas.create_rectangle(w-240, 40 , w-160, 120, fill='black', outline = 'white')
    #createInterface(bob,canvas,i,k,Link.getHealth(),Link.getMaxHealth()) #creates user interface
    #bob.pack()
    frame.pack()
    print "music"
    #canvas.create_text(i,k, text = "health", fill = 'red', font = ('Times', 30, 'bold'), anchor = 'nw')

    #f= wave.open( 'Naruto-Breakdown.wav', 'rb' )
    #sampleRate= f.getframerate()
    #channels= f.getnchannels()
    #format = sound.AFMT_S16_LE
    #snd= sound.Output( sampleRate, channels, format )
    #s= f.readframes( 300000 )
    #snd.play( s )
    #while snd.isPlaying(): time.sleep( 0.05 )
    #canvas.pack()
    root.mainloop()
Ejemplo n.º 29
0
Archivo: tkutil.py Proyecto: DT021/wau
class ProgressBar:
    def __init__(self,
                 master=None,
                 orientation="horizontal",
                 min=0,
                 max=100,
                 width=100,
                 height=18,
                 doLabel=1,
                 appearance="sunken",
                 fillColor="blue",
                 background="gray",
                 labelColor="yellow",
                 labelFont="Verdana",
                 labelText="",
                 labelFormat="%d%%",
                 value=0,
                 bd=2):
        # preserve various values
        self.master = master
        self.orientation = orientation
        self.min = min
        self.max = max
        self.width = width
        self.height = height
        self.doLabel = doLabel
        self.fillColor = fillColor
        self.labelFont = labelFont
        self.labelColor = labelColor
        self.background = background
        self.labelText = labelText
        self.labelFormat = labelFormat
        self.value = value
        self.frame = Frame(master, relief=appearance, bd=bd)
        self.canvas = Canvas(self.frame,
                             height=height,
                             width=width,
                             bd=0,
                             highlightthickness=0,
                             background=background)
        self.scale = self.canvas.create_rectangle(0,
                                                  0,
                                                  width,
                                                  height,
                                                  fill=fillColor)
        self.label = self.canvas.create_text(self.canvas.winfo_reqwidth() / 2,
                                             height / 2,
                                             text=labelText,
                                             anchor="c",
                                             fill=labelColor,
                                             font=self.labelFont)
        self.update()
        self.canvas.pack(side='top', fill='x', expand='no')

    def updateProgress(self, newValue, newMax=None):
        if newMax:
            self.max = newMax
        self.value = newValue
        self.update()

    def update(self):
        # Trim the values to be between min and max
        value = self.value
        if value > self.max:
            value = self.max
        if value < self.min:
            value = self.min
        # Adjust the rectangle
        if self.orientation == "horizontal":
            self.canvas.coords(self.scale, 0, 0,
                               float(value) / self.max * self.width,
                               self.height)
        else:
            self.canvas.coords(
                self.scale, 0,
                self.height - (float(value) / self.max * self.height),
                self.width, self.height)
        # Now update the colors
        self.canvas.itemconfig(self.scale, fill=self.fillColor)
        self.canvas.itemconfig(self.label, fill=self.labelColor)
        # And update the label
        if self.doLabel:
            if value:
                if value >= 0:
                    pvalue = int((float(value) / float(self.max)) * 100.0)
                else:
                    pvalue = 0
                self.canvas.itemconfig(self.label,
                                       text=self.labelFormat % pvalue)
            else:
                self.canvas.itemconfig(self.label, text='')
        else:
            self.canvas.itemconfig(self.label,
                                   text=self.labelFormat % self.labelText)
        self.canvas.update_idletasks()
Ejemplo n.º 30
0
class World(Tk):
    #    def __init__(self,filename=None,block=50,debug=True,delay=0.25,image=False,width=10,height=10):
    def __init__(self,
                 filename=None,
                 block=50,
                 debug=True,
                 delay=0.25,
                 image=True,
                 width=10,
                 height=10):
        Tk.__init__(self)
        self.title("")
        arg, self.width, self.height = block, width, height
        self.photos = [
            PhotoImage(file=(k + ".gif"))
            for k in ["east", "north", "west", "south"]
        ]
        self.beepers, self.ovals, self.numbers, self.robots, self.walls = {},{},{},{},{}
        self.m, self.n, self.t, self.delay = arg * (width + 3), arg * (
            height + 3), arg, delay
        self.debug, self.useImage = debug, image
        a, b, c = self.t + self.t / 2, self.m - self.t - self.t / 2, self.n - self.t - self.t / 2
        self.canvas = Canvas(self, bg="white", width=self.m, height=self.n)
        self.canvas.pack()
        count = 1
        for k in range(2 * self.t, max(self.m, self.n) - self.t, self.t):
            if k < b:
                self.canvas.create_line(k, c, k, a, fill="red")
                self.canvas.create_text(k,
                                        c + self.t / 2,
                                        text=str(count),
                                        font=("Times",
                                              max(-self.t * 2 / 3, -15), ""))
            if k < c:
                self.canvas.create_line(b, k, a, k, fill="red")
                self.canvas.create_text(a - self.t / 2,
                                        self.n - k,
                                        text=str(count),
                                        font=("Times",
                                              max(-self.t * 2 / 3, -15), ""))
            count += 1
        self.canvas.create_line(a, c, b, c, fill="black", width=3)
        self.canvas.create_line(a, a, a, c, fill="black", width=3)
        if filename is not None:
            self.readWorld(filename)
        self.refresh()

    def readWorld(self, filename):
        try:
            infile = open("worlds\\%s.wld" % filename, "r")
        except IOError:
            try:
                infile = open("worlds/%s.wld" % filename, "r")
            except IOError:
                infile = open(filename, "r")
        text = infile.read().split("\n")
        infile.close()
        for t in text:
            if t.startswith("eastwestwalls"):
                s = t.split(" ")
                y, x = int(s[1]), int(s[2])
                self.addWall(x, y, -1, y)
            if t.startswith("northsouthwalls"):
                s = t.split(" ")
                x, y = int(s[1]), int(s[2])
                self.addWall(x, y, x, -1)
            if t.startswith("beepers"):
                s = t.split(" ")
                y, x, n = int(s[1]), int(s[2]), int(s[3])
                if n is infinity:
                    self.addInfiniteBeepers(x, y)
                else:
                    for k in range(n):
                        self.addBeeper(x, y)

    def pause(self):
        sleep(self.delay)

    def isBeeper(self, x, y):
        return (x, y) in self.beepers.keys() and not self.beepers[(x, y)] == 0

    def countRobots(self, x, y):
        if (x, y) not in self.robots.keys():
            return 0
        return len(self.robots[(x, y)])

    def crash(self, x1, y1, x2, y2):
        if 0 in (x1, y1, x2, y2):
            return True
        if (x2, y2) in self.walls.keys() and (x1, y1) in self.walls[(x2, y2)]:
            return True
        if (x1, y1) in self.walls.keys() and (x2, y2) in self.walls[(x1, y1)]:
            return True
        return False

    def addInfiniteBeepers(self, x, y):
        flag = (x, y) not in self.beepers.keys() or self.beepers[(x, y)] is 0
        self.beepers[(x, y)] = infinity
        text = "oo"
        a, b = self.t + x * self.t, self.n - (self.t + y * self.t)
        t = self.t / 3
        if flag:
            self.ovals[(x, y)] = self.canvas.create_oval(a - t,
                                                         b - t,
                                                         a + t,
                                                         b + t,
                                                         fill="black")
            self.numbers[(x, y)] = self.canvas.create_text(
                a,
                b,
                text=text,
                fill="white",
                font=("Times", max(-self.t / 2, -20), ""))
        else:
            self.canvas.itemconfig(self.numbers[(x, y)], text=text)
        if (x, y) in self.robots.keys():
            for robot in self.robots[(x, y)]:
                robot.lift()

    def addBeeper(self, x, y):
        if (x, y) in self.beepers.keys() and self.beepers[(x, y)] is infinity:
            return
        flag = (x, y) not in self.beepers.keys() or self.beepers[(x, y)] is 0
        if flag:
            self.beepers[(x, y)] = 1
        else:
            self.beepers[(x, y)] += 1
        text = str(self.beepers[(x, y)])
        a, b = self.t + x * self.t, self.n - (self.t + y * self.t)
        t = self.t / 3
        if flag:
            self.ovals[(x, y)] = self.canvas.create_oval(a - t,
                                                         b - t,
                                                         a + t,
                                                         b + t,
                                                         fill="black")
            self.numbers[(x, y)] = self.canvas.create_text(
                a,
                b,
                text=text,
                fill="white",
                font=("Times", max(-self.t / 2, -20), ""))
        else:
            self.canvas.itemconfig(self.numbers[(x, y)], text=text)
        if (x, y) in self.robots.keys():
            for robot in self.robots[(x, y)]:
                robot.lift()

    def removeBeeper(self, x, y):
        if self.beepers[(x, y)] is infinity:
            return
        self.beepers[(x, y)] -= 1
        flag = self.beepers[(x, y)] is 0
        text = str(self.beepers[(x, y)])
        if flag:
            self.canvas.delete(self.ovals[(x, y)])
            self.canvas.delete(self.numbers[(x, y)])
        else:
            self.canvas.itemconfig(self.numbers[(x, y)], text=text)
        if (x, y) in self.robots.keys():
            for robot in self.robots[(x, y)]:
                robot.lift()

    def addWall(self, x1, y1, x2, y2):
        if not x1 == x2 and not y1 == y2:
            return
        if x1 == x2:
            y1, y2 = min(y1, y2), max(y1, y2)
            if y1 == -1:
                y1 = y2
            for k in range(y1, y2 + 1):
                self.walls.setdefault((x1, k), []).append((x1 + 1, k))
                a, b = self.t + x1 * self.t + self.t / 2, self.n - (
                    self.t + k * self.t) + self.t / 2
                c, d = self.t + x1 * self.t + self.t / 2, self.n - (
                    self.t + k * self.t) - self.t / 2
                self.canvas.create_line(a,
                                        b + 1,
                                        c,
                                        d - 1,
                                        fill="black",
                                        width=3)
        else:
            x1, x2 = min(x1, x2), max(x1, x2)
            if x1 == -1:
                x1 = x2
            for k in range(x1, x2 + 1):
                self.walls.setdefault((k, y1), []).append((k, y1 + 1))
                a, b = self.t + k * self.t - self.t / 2, self.n - (
                    self.t + y1 * self.t) - self.t / 2
                c, d = self.t + k * self.t + self.t / 2, self.n - (
                    self.t + y1 * self.t) - self.t / 2
                self.canvas.create_line(a - 1,
                                        b,
                                        c + 1,
                                        d,
                                        fill="black",
                                        width=3)

    def draw(self, x, y, d, img):
        if self.useImage:
            if img is not None:
                self.canvas.delete(img)
            x, y = self.t + x * self.t, self.n - (self.t + y * self.t)
            photo = self.photos[d / 90]
            img = self.canvas.create_image(x, y, image=photo)
            return img
        else:
            t, angle = self.t / 2, 120
            x, y = self.t + x * self.t, self.n - (self.t + y * self.t)
            x1, y1 = x + 3**0.5 * t / 2 * cos(
                radians(d)), y - 3**0.5 * t / 2 * sin(radians(d))
            x2, y2 = x + t * cos(radians(d + angle)), y - t * sin(
                radians(d + angle))
            x3, y3 = x + t / 4 * cos(radians(d + 180)), y - t / 4 * sin(
                radians(d + 180))
            x4, y4 = x + t * cos(radians(d - angle)), y - t * sin(
                radians(d - angle))
            if img is not None:
                self.canvas.delete(img)
            img = self.canvas.create_polygon(x1,
                                             y1,
                                             x2,
                                             y2,
                                             x3,
                                             y3,
                                             x4,
                                             y4,
                                             fill="blue")
            return img

    def erase(self, img):
        self.canvas.delete(img)

    def recordMove(self, count, x1, y1, x2, y2):
        for robot in self.robots[(x1, y1)]:
            if robot.count == count:
                self.robots[(x1, y1)].remove(robot)
                self.robots.setdefault((x2, y2), []).append(robot)
                break

    def lift(self, img):
        self.canvas.lift(img)

    def refresh(self):
        self.canvas.update()
        self.pause()

    def register(self, x, y, robot):
        self.robots.setdefault((x, y), []).append(robot)

    def remove(self, x, y, robot):
        self.robots[(x, y)].remove(robot)
Ejemplo n.º 31
0
class ResultsFrame(Frame):
    "Class which controls the results screen of the spelling aid""" 
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        #Create UI elements
        self.results_list = ResultsTable(self.parent, height=160, width=250)
        buttonRetry = Button(self.parent, text="Retry", width=10,
                             command=self.restart)
        buttonNewlist = Button(self.parent, text="New List", width=10,
                               command=self.new_selection)
        buttonExit = Button(self.parent, text="Quit", width=10,
                            command=self.parent.destroy)
        self.results_canvas = Canvas(self, width=600, height=250, bg="#FFFFFF")
        font = ("Helvetica", 20)
        self.results_canvas.create_text(300, 15, text="Results", fill="#004183",
                                        font=font)
        self.results_canvas.create_window(310, 35, window=self.results_list,
                                          anchor=NW)
        self.results_canvas.create_window(150, 230, window=buttonRetry)
        self.results_canvas.create_window(300, 230, window=buttonNewlist)
        self.results_canvas.create_window(450, 230, window=buttonExit)
        self.results_canvas.create_text(25, 55, font=font, text="List:",
                                        anchor=W)
        self.results_canvas.create_text(25, 85, font=font, text="Score:",
                                        anchor=W)
        self.results_canvas.create_text(25, 115, font=font, text="Time:",
                                        anchor=W)
        self.results_canvas.create_text(25, 145, font=font, text="Best Score:",
                                        anchor=W)
        self.results_canvas.create_text(25, 175, font=font, text="Best Time:",
                                        anchor=W)
        self.list_name = self.results_canvas.create_text(300, 55, font=font,
                                                         anchor=E)
        self.score_number = self.results_canvas.create_text(300, 85, font=font,
                                                            anchor=E)
        self.time_number = self.results_canvas.create_text(300, 115, font=font,
                                                           anchor=E)
        self.best_score = self.results_canvas.create_text(300, 145, font=font,
                                                          anchor=E)
        self.best_time = self.results_canvas.create_text(300, 175, font=font,
                                                         anchor=E)
        self.results_canvas.pack()
        
    def calculate(self, word_list, time_elapsed):
        """Calculate and display the users score and time, as well as personal
           bests"""
        score = 0
        user_id = self.parent.user.uid
        list_id = word_list.l_id
        self.results_list.add_list(word_list.words)
        for word in word_list.words:
            if word.isCorrect:
                score += 1
        previous_records = self.parent.db.sql("""SELECT best_score, best_time 
                           FROM user_list_map WHERE list_id = '%d'
                           AND user_id = '%d'"""
                           %(list_id, user_id))
        
        try:
            best_score = max(score, previous_records[0][0])
            best_time = min(time_elapsed, previous_records[0][1])
            self.parent.db.sql("""UPDATE user_list_map SET best_score='%d',
                           best_time='%d' WHERE list_id = '%d' AND
                           user_id = '%d'"""
                           %(best_score, best_time, list_id, user_id))
        except IndexError:
            #If the list has not been played before, create a record
            best_score = score
            best_time = time_elapsed
            print "Creating"
            self.parent.db.sql("""INSERT INTO user_list_map VALUES
                               ('%d', '%d', '%d', '%d')"""
                               %(user_id, list_id, best_score, best_time))
        self.results_canvas.itemconfig(self.list_name, text=word_list.name)
        self.results_canvas.itemconfig(self.score_number, text=score)
        self.results_canvas.itemconfig(self.time_number, text=time_elapsed)
        self.results_canvas.itemconfig(self.best_score, text=best_score)
        self.results_canvas.itemconfig(self.best_time, text=best_time)
   
    def restart(self):
        """Clear the results page and restart the game with the current list"""
        self.results_list.clear()
        self.parent.start_game(self.parent.current_list)

    def new_selection(self):
        """Clear the results page and return to the start screen"""
        self.results_list.clear()
        self.parent.new_list()
Ejemplo n.º 32
0
def draw_board(root):
    """
      Create the graphical user interface.
    """

    # provide the title that will be shown in the header
    root.title("Bonbon Crumble")

    # Indicate which variables of the program will be altered
    # ! In order to manipulate variables that are part of the program
    # ! but exist outside of the function, you need to indicate that you want
    # ! to use and alter these variables by declaring them as "global"
    global canvas, board, ovals, progress_label, points_label, points_field, \
        max_label, max_field, swaps_left_label, swaps_left_field

    # canvas will be the main board used for mastermind
    # ! to create a canvas, the constructor is called
    # ! (i.e. name of the class and required parameters)
    canvas = Canvas(root, bg="white",
                    height=DIMENSION * (BONBON_SIZE + BONBON_SPACING) + 100,
                    width=DIMENSION * (BONBON_SIZE + BONBON_SPACING))

    # Draw the empty circles representing the guesses
    create_ovals(DIMENSION, DIMENSION)
    # Fill circles with initial colors
    init_board(DIMENSION)

    canvas.create_line(0,
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 10,
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING),
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 10,
                       width=2)

    # Draw the progress label
    progress_label = Label(canvas, text=">> Select first bonbon.")
    canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 15,
                         anchor=NW, window=progress_label)

    canvas.create_line(0,
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 40,
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING),
                       bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 40,
                       width=1)

    # Draw the swaps left label and field
    swaps_left_label = Label(canvas, text="Swaps left:")
    canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=swaps_left_label)
    swaps_left_field = Label(canvas, text=remaining_swaps, bg="white")
    canvas.create_window(2 * (BONBON_SIZE + BONBON_SPACING) + 10,
                         bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=swaps_left_field)

    # Draw the points label and field
    points_label = Label(canvas, text="Score:", font=16)
    canvas.create_window(3 * (BONBON_SIZE + BONBON_SPACING),
                         bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=points_label)
    points_field = Label(canvas, text="0", font=16)
    canvas.create_window(4 * (BONBON_SIZE + BONBON_SPACING) + 10,
                         bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=points_field)

    # Draw the max points label and field
    max_label = Label(canvas, text="Max score:")
    canvas.create_window(5 * (BONBON_SIZE + BONBON_SPACING) + 10,
                         bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=max_label)
    max_field = Label(canvas, text="n/a", bg="white")
    canvas.create_window(7 * (BONBON_SIZE + BONBON_SPACING) + 10,
                         bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 50,
                         anchor=NW, window=max_field)
    canvas.itemconfig(max_field, fill="red")

    # Draw the quit button
    quit_button = Button(canvas, text="Quit", command=root.destroy)
    quit_button.configure(width=5, relief=FLAT)
    canvas.create_window(10, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 75,
                         anchor=NW, window=quit_button)

    # Draw the max button
    max_button = Button(canvas, text="Calculate maximum score", command=get_maximum_score)
    max_button.configure(width=20, relief=FLAT)
    canvas.create_window(100, bonbon_asked.nb_visible_rows(board) * (BONBON_SIZE + BONBON_SPACING) + 75,
                         anchor=NW, window=max_button)

    # draw the canvas
    canvas.pack()
Ejemplo n.º 33
0
class MoveControl(LabelFrame):
	def __init__(self, root, prtr, settings, log, *arg):
		fn = os.path.join(settings.cmdFolder, "images", "control_xyz.png")
		self.image = Image.open(fn)
		self.photo = ImageTk.PhotoImage(self.image)
		LabelFrame.__init__(self, root, *arg, text="Movement")

		self.app = root
		self.hilite = None
		self.hilitemask = None
		self.settings = settings
		self.printer = prtr
		self.log = log
		
		l = Label(self, text="mm/min")
		l.grid(row=1, column=2)
		
		l = Label(self, text="X/Y Feed Rate:")
		l.grid(row=2, column=1, sticky=E)
		
		self.xyfeed = Spinbox(self, width=10, justify=RIGHT, from_=0, to=MAXFEED)
		self.xyfeed.grid(row=2, column=2)
		self.xyfeed.delete(0, END)
		self.xyfeed.insert(0, settings.xyfeed)
		self.xyfeed.bind("<FocusOut>", self.valxyFeed)
		self.xyfeed.bind("<Leave>", self.valxyFeed)
		
		l = Label(self, text="Z Feed Rate:")
		l.grid(row=3, column=1, sticky=E)
				
		self.zfeed = Spinbox(self, width=10, justify=RIGHT, from_=0, to=MAXFEED)
		self.zfeed.grid(row=3, column=2)
		self.zfeed.delete(0, END)
		self.zfeed.insert(0, settings.zfeed)
		self.zfeed.bind("<FocusOut>", self.valzFeed)
		self.zfeed.bind("<Leave>", self.valzFeed)
		
		self.canvas = Canvas(self, width=self.image.size[0], height=self.image.size[1], *arg)
		self.canvas.create_image((0, 0), image=self.photo, anchor=N+W)
		self.canvas.grid(row=4, column=1, columnspan=2)
		for m in imageMasks:
			self.canvas.create_oval((m[0][0]-mask_rad, m[0][1]-mask_rad, m[0][0]+mask_rad, m[0][1]+mask_rad),
							outline="#FF0000", width=4, tags=m[1], state=HIDDEN)
		self.canvas.bind("<Button-1>", self.OnLeftDown)
		self.canvas.bind("<Motion>", self.OnMotion)
		self.canvas.bind("<Enter>", self.OnEnter)
		self.canvas.bind("<Leave>", self.OnLeave)
		
		self.bAllOff = Button(self, text="Release Motors", command=self.allMotorsOff)	
		self.bAllOff.grid(row=5, column=1, columnspan=2)
		
	def valxyFeed(self, *arg):
		x = self.validFeed(self.xyfeed.get(), 'XY')
			
		if x == None:
			self.xyfeed.delete(0, END)
			self.xyfeed.insert(0, "%d" % self.settings.xyfeed)
			return True

		if self.settings.xyfeed != x:
			self.settings.xyfeed = x
			self.settings.setModified()		
		return True
		
	def valzFeed(self, *arg):
		x = self.validFeed(self.zfeed.get(), 'Z')
			
		if x == None:
			self.zfeed.delete(0, END)
			self.zfeed.insert(0, "%d" % self.settings.zfeed)
			return True

		if self.settings.zfeed != x:
			self.settings.zfeed = x
			self.settings.setModified()		
		return True
	
	def validFeed(self, fv, axis):
		try:
			x = int(fv)
		except:
			self.log.logMsg("Value for %s feed rate not a valid integer" % axis)
			return None

		if x <=0 or x >MAXFEED:
			self.log.logMsg("Value for %s feed rate out of range(0-5000)" % axis)
			return None
		
		return x
	
	def allMotorsOff(self):
		if self.app.printerAvailable(cmd="M84"):
			self.printer.send_now("M84")	

	def OnMotion(self, e):
		for i in range(len(imageGeometry)):
			if boundBy((e.x, e.y), imageGeometry[i][0]):
				self.setHilite(i)
				return
		if self.hilite != None:
			self.clearHilite()

	def OnEnter(self, e):
		self.clearHilite()

	def OnLeave(self, e):
		self.clearHilite()

	def setHilite(self, i):
		if i != self.hilite:
			self.canvas.delete("HILITE")
			self.canvas.create_rectangle(imageGeometry[i][0], outline="#C85E5D", width=3, fill="gray", stipple="gray50", tags="HILITE")
			self.hilite = i
			if self.hilitemask:
				self.canvas.itemconfig(self.hilitemask, state=HIDDEN)
				
			if imageGeometry[i][2]:
				self.hilitemask = imageGeometry[i][2]
				self.canvas.itemconfig(self.hilitemask, state=NORMAL)
				
				
	def clearHilite(self):
		self.canvas.delete("HILITE")
		self.hilite = None
		self.hilitemask = None
		for m in imageMasks:
			self.canvas.itemconfig(m[1], state=HIDDEN)
		
	def OnLeftDown(self, e):
		if self.app.printerAvailable(cmd="G1"):
			for g in imageGeometry:
				if boundBy((e.x, e.y), g[0]):
					if "G1" in g[1]:
						if "X" in g[1]:
							feed = self.settings.xyfeed
						elif "Y" in g[1]:
							feed = self.settings.xyfeed
						elif "Z" in g[1]:
							feed = self.settings.zfeed
						else:
							feed = 100
						self.printer.send_now("G91")
						self.printer.send_now(g[1] + " F" + str(feed))
						self.printer.send_now("G90")
					else:
						self.printer.send_now(g[1])
					break
Ejemplo n.º 34
0
class Plotter(GenericPlotter):
    def __init__(self, windowTitle='TopoVis', params=None):
        GenericPlotter.__init__(self, params)
        self.nodes = {}
        self.links = {}
        self.nodeLinks = {}
        self.lineStyles = {}
        self.shapes = {}
        self.windowTitle = windowTitle
        self.prepareCanvas()
        self.lastShownTime = 0

    ###################
    def prepareCanvas(self):
        self.tk = Tk()
        self.tk.title(self.windowTitle)
        self.canvas = Canvas(self.tk, width=850, height=850)
        self.canvas.pack(fill=BOTH, expand=YES)
        self.createText('time', 0, 0, text="time=0.0 seconds")

    ###################
    def setTime(self, time):
        if time - self.lastShownTime > 0.00001:
            self.updateText('time', text='Time: %.5f seconds' % time)
            self.lastShownTime = time

    ###################
    def updateNodePosAndSize(self, ident):
        p = self.params
        c = self.canvas
        if ident not in self.nodes.keys():
            node_tag = c.create_oval(0, 0, 0, 0)
            label_tag = c.create_text(0, 0, text=str(ident))
            self.nodes[ident] = (node_tag, label_tag)
        else:
            (node_tag, label_tag) = self.nodes[ident]

        node = self.scene.nodes[ident]
        nodesize = node.scale * p.nodesize
        x1 = node.pos[0] - nodesize
        y1 = node.pos[1] - nodesize
        (x2, y2) = (x1 + nodesize * 2, y1 + nodesize * 2)
        c.coords(node_tag, x1, y1, x2, y2)
        c.coords(label_tag, node.pos)

        for link in self.nodeLinks[ident]:
            self.updateLink(*link)

    ###################
    def configLine(self, tagOrId, style):
        config = {}
        config['fill'] = colorStr(style.color)
        config['width'] = style.width
        config['arrow'] = arrowMap[style.arrow]
        config['dash'] = style.dash
        self.canvas.itemconfigure(tagOrId, **config)

    ###################
    def configPolygon(self, tagOrId, lineStyle, fillStyle):
        config = {}
        config['outline'] = colorStr(lineStyle.color)
        config['width'] = lineStyle.width
        config['dash'] = lineStyle.dash
        config['fill'] = colorStr(fillStyle.color)
        self.canvas.itemconfigure(tagOrId, **config)

    ###################
    def createLink(self, src, dst, style):
        if src == dst:
            raise RuntimeError('Source and destination are the same node')
        p = self.params
        c = self.canvas
        (x1, y1, x2, y2) = computeLinkEndPoints(self.scene.nodes[src],
                                                self.scene.nodes[dst],
                                                p.nodesize)
        link_obj = c.create_line(x1, y1, x2, y2, tags='link')
        self.configLine(link_obj, self.scene.lineStyles[style])
        return link_obj

    ###################
    def updateLink(self, src, dst, style):
        p = self.params
        c = self.canvas
        link_obj = self.links[(src, dst, style)]
        (x1, y1, x2, y2) = computeLinkEndPoints(self.scene.nodes[src],
                                                self.scene.nodes[dst],
                                                p.nodesize)
        c.coords(link_obj, x1, y1, x2, y2)

    ###################
    def node(self, ident, x, y):
        self.nodeLinks[ident] = []
        self.updateNodePosAndSize(ident)
        self.tk.update()

    ###################
    def nodemove(self, ident, x, y):
        self.updateNodePosAndSize(ident)
        self.tk.update()

    ###################
    def nodecolor(self, ident, r, g, b):
        (node_tag, label_tag) = self.nodes[ident]
        self.canvas.itemconfig(node_tag, outline=colorStr((r, g, b)))
        self.canvas.itemconfigure(label_tag, fill=colorStr((r, g, b)))
        self.tk.update()

    ###################
    def nodewidth(self, ident, width):
        (node_tag, label_tag) = self.nodes[ident]
        self.canvas.itemconfig(node_tag, width=width)
        self.tk.update()

    ###################
    def nodescale(self, ident, scale):
        # scale attribute has been set by TopoVis
        # just update the node
        self.updateNodePosAndSize(ident)
        self.tk.update()

    ###################
    def nodelabel(self, ident, label):
        (node_tag, label_tag) = self.nodes[ident]
        self.canvas.itemconfigure(label_tag,
                                  text=self.scene.nodes[ident].label)
        self.tk.update()

    ###################
    def addlink(self, src, dst, style):
        self.nodeLinks[src].append((src, dst, style))
        self.nodeLinks[dst].append((src, dst, style))
        self.links[(src, dst, style)] = self.createLink(src, dst, style)
        self.tk.update()

    ###################
    def dellink(self, src, dst, style):
        self.nodeLinks[src].remove((src, dst, style))
        self.nodeLinks[dst].remove((src, dst, style))
        self.canvas.delete(self.links[(src, dst, style)])
        del self.links[(src, dst, style)]
        self.tk.update()

    ###################
    def clearlinks(self):
        self.canvas.delete('link')
        self.links.clear()
        for n in self.nodes:
            self.nodeLinks[n] = []
        self.tk.update()

    ###################
    def circle(self, x, y, r, ident, linestyle, fillstyle):
        if ident in self.shapes.keys():
            self.canvas.delete(self.shapes[ident])
            del self.shapes[ident]
        self.shapes[ident] = self.canvas.create_oval(x - r, y - r, x + r,
                                                     y + r)
        self.configPolygon(self.shapes[ident], linestyle, fillstyle)
        self.tk.update()

    ###################
    def line(self, x1, y1, x2, y2, ident, linestyle):
        if ident in self.shapes.keys():
            self.canvas.delete(self.shapes[ident])
            del self.shapes[ident]
        self.shapes[ident] = self.canvas.create_line(x1, y1, x2, y2)
        self.configLine(self.shapes[ident], linestyle)
        self.tk.update()

    ###################
    def rect(self, x1, y1, x2, y2, ident, linestyle, fillstyle):
        if ident in self.shapes.keys():
            self.canvas.delete(self.shapes[ident])
            del self.shapes[ident]
        self.shapes[ident] = self.canvas.create_rectangle(x1, y1, x2, y2)
        self.configPolygon(self.shapes[ident], linestyle, fillstyle)
        self.tk.update()

    ###################
    def createText(self, ident, *args, **kwargs):
        self.shapes[ident] = self.canvas.create_text(*args,
                                                     anchor=NW,
                                                     **kwargs)

    ###################
    def updateText(self, ident, text):
        self.canvas.itemconfigure(self.shapes[ident], text=text)

    ###################
    def delshape(self, ident):
        if ident in self.shapes.keys():
            self.canvas.delete(self.shapes[ident])
            self.tk.update()
Ejemplo n.º 35
-2
class NvimTk(object):

    """Wraps all nvim/tk event handling."""

    def __init__(self, nvim):
        """Initialize with a Nvim instance."""
        self._nvim = nvim
        self._attrs = {}
        self._nvim_updates = deque()
        self._canvas = None
        self._fg = '#000000'
        self._bg = '#ffffff'

    def run(self):
        """Start the UI."""
        self._tk_setup()
        t = Thread(target=self._nvim_event_loop)
        t.daemon = True
        t.start()
        self._root.mainloop()

    def _tk_setup(self):
        self._root = Tk()
        self._root.bind('<<nvim_redraw>>', self._tk_nvim_redraw)
        self._root.bind('<<nvim_detach>>', self._tk_nvim_detach)
        self._root.bind('<Key>', self._tk_key)

    def _tk_nvim_redraw(self, *args):
        update = self._nvim_updates.popleft()
        for update in update:
            handler = getattr(self, '_tk_nvim_' + update[0])
            for args in update[1:]:
                handler(*args)

    def _tk_nvim_detach(self, *args):
        self._root.destroy()

    def _tk_nvim_resize(self, width, height):
        self._tk_redraw_canvas(width, height)

    def _tk_nvim_clear(self):
        self._tk_clear_region(0, self._height - 1, 0, self._width - 1)

    def _tk_nvim_eol_clear(self):
        row, col = (self._cursor_row, self._cursor_col,)
        self._tk_clear_region(row, row, col, self._scroll_right)

    def _tk_nvim_cursor_goto(self, row, col):
        self._cursor_row = row
        self._cursor_col = col

    def _tk_nvim_cursor_on(self):
        pass

    def _tk_nvim_cursor_off(self):
        pass

    def _tk_nvim_mouse_on(self):
        pass

    def _tk_nvim_mouse_off(self):
        pass

    def _tk_nvim_insert_mode(self):
        pass

    def _tk_nvim_normal_mode(self):
        pass

    def _tk_nvim_set_scroll_region(self, top, bot, left, right):
        self._scroll_top = top
        self._scroll_bot = bot
        self._scroll_left = left
        self._scroll_right = right

    def _tk_nvim_scroll(self, count):
        top, bot = (self._scroll_top, self._scroll_bot,)
        left, right = (self._scroll_left, self._scroll_right,)

        if count > 0:
            destroy_top = top
            destroy_bot = top + count - 1
            move_top = destroy_bot + 1
            move_bot = bot
            fill_top = move_bot + 1
            fill_bot = fill_top + count - 1
        else:
            destroy_top = bot + count + 1
            destroy_bot = bot
            move_top = top
            move_bot = destroy_top - 1
            fill_bot = move_top - 1
            fill_top = fill_bot + count + 1

        # destroy items that would be moved outside the scroll region after
        # scrolling
        # self._tk_clear_region(destroy_top, destroy_bot, left, right)
        # self._tk_clear_region(move_top, move_bot, left, right)
        self._tk_destroy_region(destroy_top, destroy_bot, left, right)
        self._tk_tag_region('move', move_top, move_bot, left, right)
        self._canvas.move('move', 0, -count * self._rowsize)
        self._canvas.dtag('move', 'move')
        # self._tk_fill_region(fill_top, fill_bot, left, right)

    def _tk_nvim_highlight_set(self, attrs):
        self._attrs = attrs

    def _tk_nvim_put(self, data):
        # choose a Font instance
        font = self._fnormal
        if self._attrs.get('bold', False):
            font = self._fbold
        if self._attrs.get('italic', False):
            font = self._fbolditalic if font == self._fbold else self._fitalic
        # colors
        fg = "#{0:0{1}x}".format(self._attrs.get('foreground', self._fg), 6)
        bg = "#{0:0{1}x}".format(self._attrs.get('background', self._bg), 6)
        # get the "text" and "rect" which correspond to the current cell
        x, y = self._tk_get_coords(self._cursor_row, self._cursor_col)
        items = self._canvas.find_overlapping(x, y, x + 1, y + 1)
        if len(items) != 2:
            # caught part the double-width character in the cell to the left,
            # filter items which dont have the same horizontal coordinate as
            # "x"
            predicate = lambda item: self._canvas.coords(item)[0] == x
            items = filter(predicate, items)
        # rect has lower id than text, sort to unpack correctly
        rect, text = sorted(items)
        self._canvas.itemconfig(text, fill=fg, font=font, text=data or ' ')
        self._canvas.itemconfig(rect, fill=bg)
        self._tk_nvim_cursor_goto(self._cursor_row, self._cursor_col + 1)

    def _tk_nvim_bell(self):
        self._root.bell()

    def _tk_nvim_update_fg(self, fg):
        self._fg = "#{0:0{1}x}".format(fg, 6)

    def _tk_nvim_update_bg(self, bg):
        self._bg = "#{0:0{1}x}".format(bg, 6)

    def _tk_redraw_canvas(self, width, height):
        if self._canvas:
            self._canvas.destroy()
        self._fnormal = Font(family='Monospace', size=13)
        self._fbold = Font(family='Monospace', weight='bold', size=13)
        self._fitalic = Font(family='Monospace', slant='italic', size=13)
        self._fbolditalic = Font(family='Monospace', weight='bold',
                                 slant='italic', size=13)
        self._colsize = self._fnormal.measure('A')
        self._rowsize = self._fnormal.metrics('linespace')
        self._canvas = Canvas(self._root, width=self._colsize * width,
                              height=self._rowsize * height)
        self._tk_fill_region(0, height - 1, 0, width - 1)
        self._cursor_row = 0
        self._cursor_col = 0
        self._scroll_top = 0
        self._scroll_bot = height - 1
        self._scroll_left = 0
        self._scroll_right = width - 1
        self._width, self._height = (width, height,)
        self._canvas.pack()

    def _tk_fill_region(self, top, bot, left, right):
        # create columns from right to left so the left columns have a
        # higher z-index than the right columns. This is required to
        # properly display characters that cross cell boundary
        for rownum in range(bot, top - 1, -1):
            for colnum in range(right, left - 1, -1):
                x1 = colnum * self._colsize
                y1 = rownum * self._rowsize
                x2 = (colnum + 1) * self._colsize
                y2 = (rownum + 1) * self._rowsize
                # for each cell, create two items: The rectangle is used for
                # filling background and the text is for cell contents.
                self._canvas.create_rectangle(x1, y1, x2, y2,
                                              fill=self._background, width=0)
                self._canvas.create_text(x1, y1, anchor='nw',
                                         font=self._fnormal, width=1,
                                         fill=self._foreground, text=' ')

    def _tk_clear_region(self, top, bot, left, right):
        self._tk_tag_region('clear', top, bot, left, right)
        self._canvas.itemconfig('clear', fill=self._bg)
        self._canvas.dtag('clear', 'clear')

    def _tk_destroy_region(self, top, bot, left, right):
        self._tk_tag_region('destroy', top, bot, left, right)
        self._canvas.delete('destroy')
        self._canvas.dtag('destroy', 'destroy')

    def _tk_tag_region(self, tag, top, bot, left, right):
        x1, y1 = self._tk_get_coords(top, left)
        x2, y2 = self._tk_get_coords(bot, right)
        self._canvas.addtag_overlapping(tag, x1, y1, x2 + 1, y2 + 1)

    def _tk_get_coords(self, row, col):
        x = col * self._colsize
        y = row * self._rowsize
        return x, y

    def _tk_key(self, event):
        if 0xffe1 <= event.keysym_num <= 0xffee:
            # this is a modifier key, ignore. Source:
            # https://www.tcl.tk/man/tcl8.4/TkCmd/keysyms.htm
            return
        # Translate to Nvim representation of keys
        send = []
        if event.state & 0x1:
            send.append('S')
        if event.state & 0x4:
            send.append('C')
        if event.state & (0x8 | 0x80):
            send.append('A')
        special = len(send) > 0
        key = event.char
        if _is_invalid_key(key):
            special = True
            key = event.keysym
        send.append(SPECIAL_KEYS.get(key, key))
        send = '-'.join(send)
        if special:
            send = '<' + send + '>'
        nvim = self._nvim
        nvim.session.threadsafe_call(lambda: nvim.input(send))

    def _nvim_event_loop(self):
        self._nvim.session.run(self._nvim_request,
                               self._nvim_notification,
                               lambda: self._nvim.attach_ui(80, 24))
        self._root.event_generate('<<nvim_detach>>', when='tail')

    def _nvim_request(self, method, args):
        raise Exception('This UI does not implement any methods')

    def _nvim_notification(self, method, args):
        if method == 'redraw':
            self._nvim_updates.append(args)
            self._root.event_generate('<<nvim_redraw>>', when='tail')