GetPosition ungenau?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Code: Alles auswählen

    def MakeMenu(self):
        self.PopUpMenu = wx.Menu()
        self.new = self.PopUpMenu.Append(-1, 'Neu', 'Fügt zur Tabelle eine Neue Zeile hinzu')
        self.edit =self.PopUpMenu.Append(-1, 'Löschen', 'Löschen sie die Selektionierte Zeile')

        self.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.OnShowPopup)

    def OnShowPopup(self, event):
        """Popup Menü anzeigen"""
        pos = event.GetPosition()
        pos = self.ScreenToClient(pos)
        self.PopupMenu(self.PopUpMenu, pos)
Dann zeichnet er mir das Menü ganz an einem falschen ort :roll:

Bild
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

DatenMetzgerX hat geschrieben:Dann zeichnet er mir das Menü ganz an einem falschen ort
Hi DMX!

So wie es aussieht, gibt das Event "EVT_GRID_CELL_RIGHT_CLICK" schon die korrekte Position zurück. Du musst sie nicht mehr mit "ScreenToClient" umwandeln.

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx
import wx.grid


class MyFrame(wx.Frame):

    def __init__(self, parent = None, id = -1, title = "Popuptest"):
        wx.Frame.__init__(self, parent, id, title, size = (600, 400))
        
        self.grid = wx.grid.Grid(self)
        self.grid.CreateGrid(50, 50)
        
        self.popup_menu = wx.Menu()
        self.mnu_p_new = self.popup_menu.Append(
            -1, u'Neu', u'Fügt zur Tabelle eine Neue Zeile hinzu'
        )
        self.mnu_p_edit = self.popup_menu.Append(
            -1, u'Löschen', u'Löschen sie die Selektionierte Zeile'
        )
        
        self.grid.Bind(wx.grid.EVT_GRID_CELL_RIGHT_CLICK, self.show_popup_menu)
    
    
    def show_popup_menu(self, event):
        pos = event.GetPosition()
        self.PopupMenu(self.popup_menu, pos)


def main():
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
tomate
User
Beiträge: 48
Registriert: Sonntag 5. August 2007, 12:07

Kann mir jemand erklären, was diese Zeile macht:

Code: Alles auswählen

 self.PopupMenu(self.popup_menu, pos)
Was ist self.PopupMenu?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

tomate hat geschrieben:Kann mir jemand erklären, was diese Zeile macht:

Code: Alles auswählen

self.PopupMenu(self.popup_menu, pos)
Was ist self.PopupMenu?
Hallo tomate!

Aber jetzt mal im Ernst! Warum probierst du das Beispiel nicht aus?

``self`` ist in der Klasse ``MyFrame`` die Klasseninstanz selber. Diese wurde von ``wx.Frame`` abgeleitet.

Und wenn im Quellcode ``PopupMenu()`` nicht überschrieben wird, dann ist damit ``wx.Frame.PopupMenu`` gemeint. Und das findest du in der Hilfe.

Wenn du hier http://wxwidgets.org/manuals/stable/wx_classref.html nach "wxFrame" suchst, dann wirst du die Seite zu "wxFrame" finden. Achte aber darauf, dass in der wxWidgets-Hilfe kein Punkt zwischen "wx" und "Frame" steht. Suche dort nach "PopupMenu". Wenn du dort "PopupMenu" nicht findest, dann musst du in den Objekten suchen, die auf dieser Seite unter "Derived from" stehen. Also in "wxTopLevelWindow", in "wxWindow", in "wxEvtHandler" oder in "wxObject".

Finden wirst du es in "wxWindow" --> http://wxwidgets.org/manuals/stable/wx_wxwindow.html

http://wxwidgets.org/manuals/stable/wx_ ... wpopupmenu

Noch leichter findest du eine Erklärung, wenn du in der, bei der Installation von wxPython unter Windows, installierten wxWidgets-Hilfedatei nach PopupMenu suchst.

Du kannst aber auch Debuggen. Also einfach das Programm in WingIDE ausführen lassen und dort in der Zeile 29 einen Haltepunkt setzen. Dann kannst du mit help(self.PopupMenu) Hilfe dazu anfordern. Du kannst aber auch mit der rechten Maustaste darauf klicken und mit dem Menüpunkt "Gehe zur Definition", direkt dorthin springen. Dann wärst du direkt bei der Funktion und würdest das hier sehen:

Code: Alles auswählen

    def PopupMenu(*args, **kwargs):
        """
        PopupMenu(self, Menu menu, Point pos=DefaultPosition) -> bool

        Pops up the given menu at the specified coordinates, relative to this window,
        and returns control when the user has dismissed the menu. If a menu item is
        selected, the corresponding menu event is generated and will be processed as
        usual.  If the default position is given then the current position of the
        mouse cursor will be used.
        """
        return _core_.Window_PopupMenu(*args, **kwargs)
Ich glaube das wars. ;-)

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten