• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Hugu

dúvida em script wxPython ( "showing the position of the mouse" )

12 mensagens neste tópico

Boas, preciso duma ajuda, tenho uma scrip que mostra o posicionamento do cursor do rato na tela da janela, assim:

wxpython1ln9.jpg

só que queria k as coordenadas fossem neste referencial:

wxpython2vn1.jpg

Como faço?

O codigo respectivo:

#!/bin/env python 
import wx 
class MyFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300)) 
        panel = wx.Panel(self, -1) 
        panel.Bind(wx.EVT_MOTION,  self.OnMove) 
        wx.StaticText(panel, -1, "Pos:", pos=(10, 12)) 
        self.posCtrl = wx.TextCtrl(panel, -1, "", pos=(40, 10)) 
    def OnMove(self, event): 
        pos = event.GetPosition() 
        self.posCtrl.SetValue("%s, %s" % (pos.x, pos.y)) 
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = MyFrame() 
    frame.Show(True) 
    app.MainLoop()

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol isso é o primeiro exemplo do "wxPython in Action", também ando a ler esse livro....

Em relação a tua pergunta a única maneira que estou a ver de se conseguir fazer isso é esta

EDIT:Como o tharis fez um repost da minha resposta decidir completar isto sem "bugs" loool

        podes redimencionar a janela a vontade que os valores vao ser sempre correctos....

#!/bin/env python 
import wx 
class MyFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300)) 
        panel = wx.Panel(self, -1) 
        panel.Bind(wx.EVT_MOTION,  self.OnMove)
        wx.StaticText(panel, -1, "Pos:", pos=(10, 12)) 
        self.posCtrl = wx.TextCtrl(panel, -1, "", pos=(40, 10)) 

    def OnMove(self, event): 
        pos = event.GetPosition()
        invert=self.GetSize()   #le o tamanha da janela no eixo Y
        self.posCtrl.SetValue("%s, %s" % (pos.x, invert[1]-pos.y)) #tamanho da janela menos posicao do rato da-te o valor pretendido mesmo que redimenciones a janela
        
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = MyFrame()
    frame.Show(True) 
    app.MainLoop()

Mas como é obvio se mudares o tamanho da janela isto passa a funcionar mal, a maneira correcta seria ter uma variável que lesse o tamanho da janela quando ela e redimencionada, mas não sei "ainda" fazer isso em wxPython e não me apeteceu procurar :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

#!/bin/env python 
import wx 
class MyFrame(wx.Frame): 
    def __init__(self): 
        wx.Frame.__init__(self, None, -1, "My Frame", size=(300, 300)) 
        panel = wx.Panel(self, -1) 
        panel.Bind(wx.EVT_MOTION,  self.OnMove) 
        wx.StaticText(panel, -1, "Pos:", pos=(10, 12)) 
        self.posCtrl = wx.TextCtrl(panel, -1, "", pos=(40, 10)) 
    def OnMove(self, event): 
        pos = event.GetPosition() 
        self.posCtrl.SetValue("%d, %d" % int(pos.x),300-int(pos.y) )) 
if __name__ == '__main__': 
    app = wx.PySimpleApp() 
    frame = MyFrame() 
    frame.Show(True) 
    app.MainLoop()

Fiz uma alteração tão pequena e matemática.

Vejamos:

Se for apresentada a posição default (original do wx) e estiveres no máximo valor de 'y' que podes, estaras no 0 do referencial que queres, logo, se fizeres o tamanho da Janela menos o valor da posição onde tás, vai-te dar o que tu queres.

ATENÇÃO: O valor máximo da área onde ele reconhece as coordenadas não é 300 como eu pus. Tens de ir ver quais são e substituir, visto os 300 incluir a área, barra e textctrl.

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol isso é o primeiro exemplo do "wxPython in Action", também ando a ler esse livro....

É! :)

..arranjei alguns pdf's sobre python e esse é um deles, mas ando a "lê-los" aos saltos, e nesse pdf achei piada ao 1º exemplo e lembrei pegar nessa script e fazê-lo como base pra uma brincadeira. (n tenho pachorra pra andar ler teoria atrás de teoria sem pegar logo na prática, prefiro começar pela prática e tentar perceber o k está por detrás de cada coisa indo atrás da teoria) por isso agradeço em redobrado qdo põe comentarios à frente das linhas de codigo!  :P

EDIT:Como o tharis fez um repost da minha resposta decidir completar isto sem "bugs" loool

        podes redimencionar a janela a vontade que os valores vao ser sempre correctos....

..eu ontem dpx qdo fui pra cama, tb pensei k podia fazer tipo (300-pos.y), mas depois lembrei que ia dar barraca qdo mudasse a dimensao da janela... lembrei k podia mudar para uma variavel, mas tb era coisa k n sabia fazer..

Mas obrigado a ambos! era mm isso!

Mais uma coisa, tb tenho duvidas nas dimensoes da janela (300, 300):

1º) 300 é em que medidas? milimetros ou pixeis?

2º) tb me apercebi que estas dimensoes sao da janela total e n da área em que ha contagem das coordenadas (barra, campo texto, campo box das coordenadas e bordos da janela no instante em k o cursor muda para a funçao de redimensionamento da janela), mas é possivel abrir uma caixa ou buraco dentro da janela, onde so fosse possivel haver contagem das coordenadas nesta boxe? e que a introduçao das dimensoes fosse desta boxe e dpx o redimensionamento da janela toda fosse em consequencia?

Obrigado mais uma vez!

Cumps

EDIT:tharis,  a tua script está c algum problema.. além de ter um parentises a mais, ela dpx só manda texto pra janela do IDLE e na boxe das coordenadas, nada aparece...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma coisa, tb tenho duvidas nas dimensoes da janela (300, 300):

1º) 300 é em que medidas? milimetros ou pixeis?

2º) tb me apercebi que estas dimensoes sao da janela total e n da área em que ha contagem das coordenadas (barra, campo texto, campo box das coordenadas e bordos da janela no instante em k o cursor muda para a funçao de redimensionamento da janela), mas é possivel abrir uma caixa ou buraco dentro da janela, onde so fosse possivel haver contagem das coordenadas nesta boxe? e que a introduçao das dimensoes fosse desta boxe e dpx o redimensionamento da janela toda fosse em consequencia?

1´ - 300 é a medida em pixeis

2´ - Nao precebi o que estas a perguntar... :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

2´ - Nao precebi o que estas a perguntar... :P

certo... sorry

vou explicar entao o que quero fazer:

tenho uma foto, p.exe. um ficheiro jpeg, e então quero carregar esta foto na janela "MyFrame", para poder "medir" os pixeis dessa foto, só que:

à partida eu n sei qual é o tamanho da foto, p.exe. se essa foto tiver 400 x 600 pixeis , qdo tentar abri-la na janela "MyFrame", que por defeito é so de 300x300, a foto vai ficar cortada.. então a ideia era, o programa ia ler, por trás, as dimensoes da foto e ia reajustar a janela "MyFrame" à foto, ou seja, em vez de abrir uma janela com 300x300, abriria uma janela com 500x700, p.exe para poder carregar a foto 400x600 na sua plenitude. Deu para entender a minha cena?..

Sei k para isto tenho de resolver 4 problemas:

o 1º é remarcar o referencial, p.exe. a 5 pixeis dos bordos, mas isso ja me ensinaram co faço, so tenho de fazer o mm pro referencial  X

2º como carregar uma imagem dentro da janela..

3º posicionar a foto no referencial de coordenadas

4º fazer com que a janela "MyFrame" se ajuste qdo "apanhar" fotos maiores..

Mas para ja tentava fazer isto funcionar com fotos pequenas.. um passo de cada vez certo? :)

Obrigado mais uma vez!

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu código tem um parêntesis a mais... Mas como o newbeen já te está a ajudar, não vou mudar... :|

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fica aqui o código para abrires a janela com o tamanho da imagem não importa qual seja....

Comentei o código na parte que "gere" a imagem....

import wx

class Frame(wx.Frame):
    
    def __init__(self,
                 image, #a imagem passada como parametro
                 parent=None,
                 id=-1,
                 pos=wx.DefaultPosition,
                 title='Photo'):

        temp = image.ConvertToBitmap()  #converte a imagem para poder ser mostrada
        size = temp.GetWidth()+100, temp.GetHeight()+100#obtem a altura e a largura da imagem mais 100 para ficar com uma margem a volta
        wx.Frame.__init__(self, parent, id, title, pos, size) #cria o frame com o tamanho da imagem
        self.bmp = wx.StaticBitmap(parent=self, bitmap=temp)#mostra a imagem na frame

        
class App(wx.App):
    
    def OnInit(self):
        image = wx.Image('nome_da_imagem.jpg', wx.BITMAP_TYPE_JPEG) #abre o arquivo da imagem
        self.frame = Frame(image)#chama a class frame passando a imagem como parametro
        self.frame.Show()#mostra a frame
        return True

    
def main():
    app = App()
    app.MainLoop()
    
if __name__ == '__main__':
    main()

Este exemplo foi tirado do livro wxPython in action....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este exemplo foi tirado do livro wxPython in action....

Sério?! lol em que página está?..ainda n cheguei lá.. :P

..mas dá-m um erro, a script...

Obrigado mais uma vez! e super agradecido por colocar os comentários! ;)

EDIT: ontem n tinha achado o exemplo no pdf e andava pelas paginas 350 e tal a tentar perceber se o probe era c a foto.. só dpx qdo ia dormir é k vi k o exemplo tava na pagina 16 :) ...ainda pus-me a comparar a script c a do exemplo do pdf e parecia-me k o copypaste tava tdo certo.. mas afinal n tava :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja agora que erro te da??

nao te esquecas de meter uma fotografica com e mudar o nome para o nome da tua foto no script...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja agora que erro te da??

nao te esquecas de meter uma fotografica com e mudar o nome para o nome da tua foto no script...

Dava um erro de "sintaxe" e assinalava a função def c background a vermelho...

Mas ja está resolvido, pelos vistos era problema de "indentação" (n sei se é assim k se diz/escreve) e pensei que tinha passado bem o programa, mas afinal o copypaste deturpou o programa..

Agora vou tratar de juntar o script nº1 c este 2º e continuar a fazer outras brincadeiras.. por isso I'll be back! ;)

Obrigado mais uma vez newbeen!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Minha nossa, n consigo convergir/misturar ambas as scripts...  :rant_01:

..entretanto tb tive outras ideias...  :), mas voltarei à luta com estas "gajas"  :biggrin: , so brb!..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora