Seite 1 von 1

y-Positionen nicht korrekt. Ein Bug, doofe Maus oder was?

Verfasst: Dienstag 2. März 2010, 11:19
von mutetella
Hallo,

ich verwende in einem Programm eine Liste mit den Koordinaten von gezeichneten Elementen. Soweit so gut. Wenn ich auf dem Window nun ein MouseEvent auslöse und die Liste mit den Mauskoordinaten des Events vergleiche, so ergibt sich eine Differenz der oberen y-Koordinate um 2 Pixel, der unteren y-Koordinate um 1 Pixel.

Ich habe ein Beispielprogramm angefügt:

Code: Alles auswählen

#!/usr/bin/python
#-*- coding: utf-8 -*-

import wx

class Frame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, pos=(550, 50), size=(300, 300))

        test = View(self)

class View():
    def __init__(self, parent):
        self.parent = parent
        self.parent.Bind(wx.EVT_PAINT, self.Do)
        self.parent.Bind(wx.EVT_LEFT_UP, self.Event)

    def Event(self, event):
        self.draw.DrawRectangle(15,150,100,100)
        self.draw.DrawText('MouseX: '+str(event.m_x), 20,180)
        self.draw.DrawText('MouseY: '+str(event.m_y), 20,200)
        print event.m_y
        self.draw.DrawLine(event.m_x, event.m_y, 
                           event.m_x + 100, event.m_y)

    def Do(self, event):
        print 'paint'
        self.draw = wx.PaintDC(self.parent)
        self.draw.DrawRectangle(15, 15, 100, 100)
        self.draw.DrawText('15,15', 15, 15)
        self.draw.DrawText('115,115', 115, 115)

class App(wx.App):
    
    def __init__(self):
        wx.App.__init__(self)
    
    def OnInit(self):
        frame = Frame()
        frame.Show(True)
        return True
    
    def OnExit(self):
        print 'OnExit'

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

Wenn Ihr versucht, die obere Linie des Vierecks (15,15) anzuklicken, werdet Ihr sehen, dass die y-Mausposition um 2 Pixel falsch wiedergegeben wird. Wenn die untere Seite des Vierecks (100,100) angeklickt wird, sind es noch 1 Pixel Unterschied zwischen Zeichnung und Mausposition.

Was ist hier falsch?

Irgendwie hoffe ich ja, dass es an meiner Maus liegt... :(

Gruß
mutetella

Nachtrag: Ich verwende wx 2.8.10, Ubuntu 9.10 (Gnome 2.28, Kernel 2.6.31) und liebe McRib mit extra Westernsauce.

Verfasst: Dienstag 2. März 2010, 11:31
von tordmor
der 1 Pixel unterschied erklärt sich dadurch, dass ein 100 Pixel hohes Rechteck, das bei y=15 Beginnt nur bis y=114 geht. 15 ist das 1. Pixel, also ist 114 das 100. Pixel.

Das Problem mit der ungenauen y Koordinate liegt daran, dass Mauszeiger einen Bestimmten Punkt haben, von dem aus die Koordinaten ermittelt werden und dieser eben nicht an der wahrgenommenen Spitze liegt, sondern zwei Pixel darunter.

Verfasst: Dienstag 2. März 2010, 11:43
von Defnull
Es gibt ja extra ein Präzisionskreuz als Mauszeiger, wenn man pixelgenau arbeiten möchte. In CSS wäre das "cursor:crosshair"

Verfasst: Dienstag 2. März 2010, 12:07
von mutetella
Soweit schon klar, nur wie ist es zu erklären, dass die Linie, die in meinem kleinen Beispielprogramm anhand der aktuellen Mausposition gezeichnet wird, 2 Pixel unter der Mausspitze liegt? Wenn ich in irgendeinem Zeichenprogramm eine Linie zeichne, dann erscheint diese doch an der Mausspitze. Geben diese Programme der Linienposition immer noch intern 2 Pixel extra dazu oder wie ist das zu erklären?