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

Plattformunabhängige GUIs mit wxWidgets.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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.
tordmor
User
Beiträge: 100
Registriert: Donnerstag 20. November 2008, 10:29
Wohnort: Stuttgart

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.
http://www.felix-benner.com
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Es gibt ja extra ein Präzisionskreuz als Mauszeiger, wenn man pixelgenau arbeiten möchte. In CSS wäre das "cursor:crosshair"
Bottle: Micro Web Framework + Development Blog
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

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?
Antworten