Esempio n. 1
0
File: gui.py Progetto: wairton/grafo
    def novo(self):
        """Criar um novo arquivo. Checa se o grafo atual foi editado."""
        if self.modificado:
            yesOrNo = askquestion("","Salvar o grafo atual?")
            if yesOrNo == "yes":
                self.salvar()

        self.desenho = DesenhaGrafo(self.canvas, self.opcoes)
Esempio n. 2
0
File: gui.py Progetto: wairton/grafo
 def carregar(self):
     """Diálogo de abertura de arquivo."""
     arquivo = fDialog.askopenfile(parent=self.raiz,filetypes=[('grafo','*.grafo')],title='Carregar...')
     if arquivo != None:
         data = arquivo.read().split()
         self.desenho = DesenhaGrafo(self.canvas,self.opcoes)
         self.desenho.carregar(data)
         #print 'data: ', data
         arquivo.close()
Esempio n. 3
0
File: gui.py Progetto: wairton/grafo
    def __init__(self, raiz):
        #variáveis representando o comportamento da janela
        self.raiz = raiz
        self.status = -1
        self.isMove = False

        self.selecionado = -1
        self.mousePos = (0,0)
        self.modificado = False

        #menu principal
        self.frameMenu = Frame(raiz)
        self.frameMenu.pack(fill=X, expand=True)

        self.menu = Menu(self.frameMenu, **common_config)
        self.raiz.config(menu=self.menu)

        self.menuArquivo = Menu(self.menu, **common_config)
        self.menu.add_cascade(label="Arquivo", menu=self.menuArquivo)
        self.menuArquivo.add_command(label="Novo", command=self.novo)
        self.menuArquivo.add_command(label="Carregar", command=self.carregar)
        self.menuArquivo.add_command(label="Salvar", command=self.salvar)
        self.menuArquivo.add_command(label="Sair", command=self.sair)
        #menu configuração
        self.menuConfiguracao = Menu(self.menu, **common_config)
        self.menu.add_cascade(label="Configurar", menu=self.menuConfiguracao)
        self.menuConfiguracao.add_command(label='Prefer\xc3\xaancias', command=self.configurarAparencia)
        #barra de opções
        self.frameOpcoes = Frame(raiz, **common_config)
        foo = Label(self.frameOpcoes, text=" " * 50, **common_config).grid(row=0, column=0)
        self.checaLabel = IntVar()
        Checkbutton(self.frameOpcoes, text="Label", variable=self.checaLabel, **common_config).grid(row=0, column=1)
        self.checaPeso = IntVar()
        Checkbutton(self.frameOpcoes, text="Pesos", variable=self.checaPeso, **common_config).grid(row=0, column=2)
        self.checaDirecionado = IntVar()
        Checkbutton(self.frameOpcoes, text="Direcionado", variable=self.checaDirecionado, **common_config).grid(row=0, column=3)
        self.frameOpcoes.pack(fill=BOTH, expand=True)
        #barra de atalhos
        self.frameAcoes = Frame(raiz, **common_config)
        images_names = ["vertice.gif", "aresta.gif", "mover.gif", "remover.gif",
                        "bfs.gif", "dfs.gif", "dijkstra.gif", "bellman.gif",
                        "agmprim.gif", "agmkruskal.gif", "cor.gif"]
        self.images = [PhotoImage(file=os.path.join(os.getcwd(),"img", img)) for img in images_names]
        button_common_config = common_config.copy()
        button_common_config['width'] = 50
        button_common_config['height'] = 50
        button_common_config['justify'] = LEFT
        button_common_config['borderwidth'] = 1
        self.buttons = [Button(self.frameAcoes, image=image,
                        **button_common_config) for i, image in enumerate(self.images)]
        for i, button in enumerate(self.buttons):
            button.config(command=lambda i=i: self.atualizaEstado(i))
            button.grid(row=0, column=i)
        self.frameAcoes.pack()
        #Canvas
        self.frameCanvas = Frame(raiz, **common_config)
        self.canvas = Canvas(self.frameCanvas,  height=480, width = 720, highlightthickness=2)
        self.canvas.pack()
        self.frameCanvas.pack()
        #bindings
        self.canvas.bind("<Button-1>", self.checaclick)
        self.canvas.bind("<Motion>",self.atualizaPos)
        self.raiz.bind_all("<Up>", lambda foo:self.atualizaPos(foo, (0,-8)))
        self.raiz.bind_all("<Right>", lambda foo:self.atualizaPos(foo, (8,0)))
        self.raiz.bind_all("<Down>", lambda foo:self.atualizaPos(foo, (0,8)))
        self.raiz.bind_all("<Left>", lambda foo:self.atualizaPos(foo, (-8,0)))
        #desenhar grafo
        #ponto de conexão entre as camadas GUI e Desenho.
        self.desenho = DesenhaGrafo(self.canvas, self.opcoes)
Esempio n. 4
0
File: gui.py Progetto: wairton/grafo
class MainWindow(object):
    """
    Representa a janela principal do aplicativo. Esta classe se comunica com
    desenhaGrafo que por sua vez se comunica com o grafo propriamente dito.
    """
    def __init__(self, raiz):
        #variáveis representando o comportamento da janela
        self.raiz = raiz
        self.status = -1
        self.isMove = False

        self.selecionado = -1
        self.mousePos = (0,0)
        self.modificado = False

        #menu principal
        self.frameMenu = Frame(raiz)
        self.frameMenu.pack(fill=X, expand=True)

        self.menu = Menu(self.frameMenu, **common_config)
        self.raiz.config(menu=self.menu)

        self.menuArquivo = Menu(self.menu, **common_config)
        self.menu.add_cascade(label="Arquivo", menu=self.menuArquivo)
        self.menuArquivo.add_command(label="Novo", command=self.novo)
        self.menuArquivo.add_command(label="Carregar", command=self.carregar)
        self.menuArquivo.add_command(label="Salvar", command=self.salvar)
        self.menuArquivo.add_command(label="Sair", command=self.sair)
        #menu configuração
        self.menuConfiguracao = Menu(self.menu, **common_config)
        self.menu.add_cascade(label="Configurar", menu=self.menuConfiguracao)
        self.menuConfiguracao.add_command(label='Prefer\xc3\xaancias', command=self.configurarAparencia)
        #barra de opções
        self.frameOpcoes = Frame(raiz, **common_config)
        foo = Label(self.frameOpcoes, text=" " * 50, **common_config).grid(row=0, column=0)
        self.checaLabel = IntVar()
        Checkbutton(self.frameOpcoes, text="Label", variable=self.checaLabel, **common_config).grid(row=0, column=1)
        self.checaPeso = IntVar()
        Checkbutton(self.frameOpcoes, text="Pesos", variable=self.checaPeso, **common_config).grid(row=0, column=2)
        self.checaDirecionado = IntVar()
        Checkbutton(self.frameOpcoes, text="Direcionado", variable=self.checaDirecionado, **common_config).grid(row=0, column=3)
        self.frameOpcoes.pack(fill=BOTH, expand=True)
        #barra de atalhos
        self.frameAcoes = Frame(raiz, **common_config)
        images_names = ["vertice.gif", "aresta.gif", "mover.gif", "remover.gif",
                        "bfs.gif", "dfs.gif", "dijkstra.gif", "bellman.gif",
                        "agmprim.gif", "agmkruskal.gif", "cor.gif"]
        self.images = [PhotoImage(file=os.path.join(os.getcwd(),"img", img)) for img in images_names]
        button_common_config = common_config.copy()
        button_common_config['width'] = 50
        button_common_config['height'] = 50
        button_common_config['justify'] = LEFT
        button_common_config['borderwidth'] = 1
        self.buttons = [Button(self.frameAcoes, image=image,
                        **button_common_config) for i, image in enumerate(self.images)]
        for i, button in enumerate(self.buttons):
            button.config(command=lambda i=i: self.atualizaEstado(i))
            button.grid(row=0, column=i)
        self.frameAcoes.pack()
        #Canvas
        self.frameCanvas = Frame(raiz, **common_config)
        self.canvas = Canvas(self.frameCanvas,  height=480, width = 720, highlightthickness=2)
        self.canvas.pack()
        self.frameCanvas.pack()
        #bindings
        self.canvas.bind("<Button-1>", self.checaclick)
        self.canvas.bind("<Motion>",self.atualizaPos)
        self.raiz.bind_all("<Up>", lambda foo:self.atualizaPos(foo, (0,-8)))
        self.raiz.bind_all("<Right>", lambda foo:self.atualizaPos(foo, (8,0)))
        self.raiz.bind_all("<Down>", lambda foo:self.atualizaPos(foo, (0,8)))
        self.raiz.bind_all("<Left>", lambda foo:self.atualizaPos(foo, (-8,0)))
        #desenhar grafo
        #ponto de conexão entre as camadas GUI e Desenho.
        self.desenho = DesenhaGrafo(self.canvas, self.opcoes)

    def opcoes(self):
        """Método para ser usado como callback para obter o valor das opcoes(peso, label)"""
        return self.checaPeso.get(), self.checaDirecionado.get(), self.checaLabel.get()

    def obterInformacao(self, evento, mensagem):
        """Chama a classe CaixaEntrada."""
        d = CaixaEntrada(self.raiz, evento, mensagem)
        self.raiz.wait_window(d.top)
        return d.get()

    def atualizaPos(self,event, direcao=None):
        """Atualiza a posição do mouse."""
        if self.status == 2:
            if self.selecionado != -1:
                self.desenho.setVerticePos(self.selecionado,(event.x,event.y))
                self.desenho.desenhaGrafo()
            elif direcao != None:
                self.desenho.moverTodos(direcao)

    def checaclick(self, evento):
        """Método que trata da interação com o mouse."""
        if self.status == 0:
            label = None
            if self.checaLabel.get() == 1:
                label = self.obterInformacao(evento, 'Label')
            self.desenho.desenhaVertice((evento.x, evento.y), label)
        elif self.status == 1:
            if self.selecionado != -1:
                peso = 0
                direcionado = self.checaDirecionado.get()
                if self.checaPeso.get() == 1:
                    peso = self.obterInformacao(evento, 'Peso')
                self.selecionado = (self.desenho.selecionaVertice((evento.x, evento.y),int(peso), dir = direcionado))
            else:
                self.selecionado = (self.desenho.selecionaVertice((evento.x, evento.y)))
        elif self.status == 2:
            self.selecionado = (self.desenho.selecionaVertice((evento.x, evento.y)))
        elif self.status == 3:
            self.desenho.apagaVertice((evento.x, evento.y))
            self.desenho.apagaAresta((evento.x,evento.y))
        elif self.status == 4:
            self.buscaLargura(evento)
        elif self.status == 5:
            self.buscaProfundidade(evento)
        elif self.status == 6:
            if self.selecionado == -1:
                self.selecionado = self.desenho.selecionaVertice((evento.x,evento.y),add = False)
            else:
                segundoSelecionado = self.desenho.selecionaVertice((evento.x,evento.y), add = False)
                if segundoSelecionado != -1:
                    self.minDijkstra(self.selecionado,segundoSelecionado)
                else:
                    self.selecionado = -1
        elif self.status == 7:
            if self.selecionado == -1:
                self.selecionado = self.desenho.selecionaVertice((evento.x,evento.y),add = False)
            else:
                segundoSelecionado = self.desenho.selecionaVertice((evento.x,evento.y), add = False)
                if segundoSelecionado != -1:
                    self.minBellman(self.selecionado,segundoSelecionado)
                else:
                    self.selecionado = -1
        elif self.status == 8:
            self.agmPrim(evento)
        elif self.status == 9:
            self.agmKruskal(evento)
        elif self.status == 10:
            self.colorir(evento)
        self.modificado = True

    def buscaProfundidade(self, evento):
        """Chama a busca em profundidade da classe Desenho."""
        self.desenho.buscaProfundidade((evento.x, evento.y))

    def buscaLargura(self, evento):
        """Chama a busca em largura da classe Desenho."""
        self.desenho.buscaLargura((evento.x, evento.y))

    def agmPrim(self, evento):
        """Chama a AGM Prim da classe Desenho."""
        self.desenho.agmPrim()

    def agmKruskal(self,evento):
        """Chama a AGM Kruskal da classe Desenho."""
        self.desenho.agmKruskal()

    def minDijkstra(self, origem, destino):
        """Chama a Dijkstra da classe Desenho."""
        self.desenho.minDijkstra(origem, destino)

    def minBellman(self, origem, destino):
        """Chama a Bellman-Ford da classe Desenho."""
        self.desenho.minBellman(origem, destino)

    def colorir(self,evento):
        """Chama o método de coloração de grafos da classe Desenho."""
        self.desenho.colorir()

    def atualizaEstado(self,valor):
        """Coordena o estado dos botões."""
        if self.status != -1:
            self.buttons[self.status].config(relief = RAISED)
        if valor != self.status:
            self.buttons[valor].config(relief = SUNKEN)
            self.status = valor
        else:
            self.status = -1
        print '@', self.status

    def carregar(self):
        """Diálogo de abertura de arquivo."""
        arquivo = fDialog.askopenfile(parent=self.raiz,filetypes=[('grafo','*.grafo')],title='Carregar...')
        if arquivo != None:
            data = arquivo.read().split()
            self.desenho = DesenhaGrafo(self.canvas,self.opcoes)
            self.desenho.carregar(data)
            #print 'data: ', data
            arquivo.close()

    def salvar(self):
        """Diálogo de salvamento de arquivo."""
        nomeArq = fDialog.asksaveasfilename(parent=self.raiz, filetypes=[('grafo','*.grafo')], title='Salvar...')
        if len(nomeArq) > 0:
            if not '.grafo' in nomeArq:
                nomeArq += '.grafo'
            #print nomeArq
            arquivo = open(nomeArq, "w")
            info = self.desenho.info()
            for x in info:
                arquivo.write(str(x) + ' ')
            arquivo.close()
            self.modificado = False
        else:
            showwarning( "Atencao", "O arquivo nao foi salvo!!!")

    def novo(self):
        """Criar um novo arquivo. Checa se o grafo atual foi editado."""
        if self.modificado:
            yesOrNo = askquestion("","Salvar o grafo atual?")
            if yesOrNo == "yes":
                self.salvar()

        self.desenho = DesenhaGrafo(self.canvas, self.opcoes)

    def sair(self):
        """Sair do programa. Checa se o grafo atual foi editado."""
        if self.modificado:
            yesOrNo = askquestion("","Salvar antes de sair?")
            if yesOrNo == "yes":
                self.salvar()

        self.raiz.quit()

    def configurarAparencia(self):
        JanelaConfiguracao(self.raiz)

    def exclama(self, evento):
        """Método experimental. Inútil para o trabalho."""
        self.desenho.tremerGrafo()

    def foo(self, evento):
        """Método utilizado em testes"""
        print 'foo', evento