Anfänger hat Fragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo zusammen!
Ich habe vor ca. einer Woche angefangen mich für die Programmierung mit Python zu interessieren. Hab früher mal ein bisschen da und dort (PHP, C++) reingeschnuppert, bin aber immer wieder irgendwann gescheitert, weil ichs einfach nicht mehr verstanden habe.

Grundsätzlich scheint mir Python etwas klarer und nicht ganz so kompliziert zu sein. Dennoch gibt es immerwieder Dinge, die ich nicht so ganz verstehe.

Habe mir gedacht, learning by doing wird wohl das Beste sein. :-) Habe mir mittels wxPython ein Fenster gebastelt mit einigen wenigen Menüs. Exit hat eine Funktion.

Fragen:
Wozu wird das self verwendet bzw. wann ist dies zu verwenden?
Wieso wird class MyApp(wxApp): mittels ->> def OnInit(self): initialisiert und wxFrame.__init__() mit __init__?
class MyFrame(wxFrame) stellt ja das Hauptfenster dar, wieso wird das erst am Ende des Programmcodes aufgerufen?

Danke!

Code: Alles auswählen

# -*- coding: cp1252 -*-
from wxPython.wx import *

ID_EXIT  = 102
ID_OPEN  = 103

class MyFrame(wxFrame):
    def __init__(self, parent, ID, title):
        wxFrame.__init__(self, parent, ID, title,
                         wxDefaultPosition, wxSize(800, 600))
        self.CreateStatusBar()
        self.SetStatusText("This is the statusbar")

###Definition der Variablennamen für die Menues
        
        menubar = wxMenuBar()
        menu1 = wxMenu()
        menu2 = wxMenu()
        menu3 = wxMenu()
       

###Hauptmenueeintraege hinzufuegen
        
        menubar.Append(menu1, "&Datei");
        menubar.Append(menu2, "&Bearbeiten");
        menubar.Append(menu3, "&Info");

###Den Hauptmenueeintraegen Eintraege hinzufuegen
        
        menu1.Append(ID_OPEN,"Öffnen")
        menu1.Append(ID_EXIT,"Beenden")

###Das Menue anzeigen
        
        self.SetMenuBar(menubar)

###Menueevents erstellen

        EVT_MENU(self, ID_EXIT,  self.TimeToQuit)
        
###Eventprozeduren erstellen
        
    def TimeToQuit(self, event):
        self.Close(true)

class MyApp(wxApp):
    def OnInit(self):
        frame = MyFrame(NULL, -1, "Erstellung von Menues")
        frame.Show(true)
        self.SetTopWindow(frame)
        return true

app = MyApp(0)
app.MainLoop()
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen im Forum!
mcdaniels hat geschrieben:Wozu wird das self verwendet bzw. wann ist dies zu verwenden?
Das `self` ist nicht magisch in dem Sinne, dass es `self` heissen muss. Methoden (`def`s in Klassen) unterscheiden sich von Funktionen (`def`s ausserhalb von Klassen) nur dadurch, dass das bei der Erstellung eines Exemplars der Klasse (`instance = Class()`) dieses Exemplar als erstes Argument an die Methoden gebunden wird, egal wie das 1. Argument in der Definition heisst.
Im Klartext: Das erste Argument bei Methoden sollte `self` heissen, das hat sich als Konvention eingebuergert (ebenso wie die Formatierung nach PEP 8).

Zu den wx Fragen kann ich dir nicht viel sagen, aber das muss man vor dem Hintergrund sehen, dass wxPython nur eine anbindung an wxWidgets ist und sich an dessen Konventionen haelt und nicht unbedingt pythonisch ist, in dem konkreten Fall erbst du `__init__` von `wxApp` und definierst nur die Methode neu, die nach der Initialisierung aufgerufen wird.

`MyFrame` wird sogar als erstes (in `app = MyApp(0)`) aufgerufen, alles was davor kam waren nur Definitionen.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Du musst du ein ziemlich altes Beispiel gefunden haben. Das war glaube ich bis wxPython 2.4 so (der wx import und das EVT_MENU). Zuerst wäre einmal eine Beschäftigung mit Python selbst einfacher und zielführender, als gleich in die GUI Python Programmierung einzusteigen.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hey Cofi!
Danke für die Infos.

Hallo Francesco!

Ich hab mich einige Tage lang abseits der GUI Programmierung aufgehalten. Schleifen, Input/Output, Variablen etc.

Dinge in Richtung GUI sind (zumindest in meinem Kopf) einfach greifbarer. Vielleicht liegt es daran, dass eine GUI heutzutage so gut wie Standard ist.

Also haltest du es für sinnlos, mit GUI weiterzumachen?

LG
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Sinnlos ist es mit Sicherheit nicht, aber wohl noch zu früh. wxPython zwingt einen aufgrund seiner C-Herkunft manchmal auf Wege, die eigentlich nicht so besonders "pythonisch" sind. Auch schleppt man immer eine Menge Ballast mit, der einem die Sicht auf die eigentliche Struktur verstellt. Ich denke, bevor du dich weiter mit wxPython quälst / beschäftigst, solltest du noch mal einen eingehenden Blick auf die objektorientierte Seite von Python werfen und dich mit den gängigen Konventionen (z.B. PEP 8 ) beschäftigen.

Daneben gibts noch ein paar fortgeschrittene Themen, bei denen ich mir nicht ganz sicher bin, ob man nicht vorher mal den Karren gegen die Wand gesetzt haben muß, um sie voll würdigen zu können:

- Unittests und Code Coverage
- UI-Entwurfsmuster wie MVC oder MVP
- Kaffee :lol:
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Ich wuerde auch eher dazu raten, erstmal noch zumindest die Objektorientierte Programmierung ohne GUI zu behandeln und mal ein paar typische Anfaengerprogramme zu schreiben (kommandozeilenorientiertes Addressbuch etc.).

Ich stimme Pekhs Aussage ueber unnoetigen Ballast definitiv zu! Ausserdem sind GUI-Programme, dadurch dass sie Event-Driven sind und nicht im herkoemmlichen Sinne "linear" durchlaufen werden, schwieriger zu verstehen.

Wenn du dann bei wxPython weitermachen willst, kann ich dir auf jeden Fall das Buch "wxPython in Action" empfehlen.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo nochmals!
Danke euch für die bisherigen Rückmeldungen. Ich werde mich also wieder "back to the roots" begeben. Ihr habt sicher recht.

Wahrscheinlich werd ich euch auch so mit genügend Fragen nerven :-)

LG
BlackJack

Trotzdem nochmal was zum Ausgangsbeitrag:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf-8
import wx


class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (800, 600))
        self.CreateStatusBar()
        self.SetStatusText('This is the statusbar.')
        
        menubar = wx.MenuBar()
        file_menu = wx.Menu()
        edit_menu = wx.Menu()
        help_menu = wx.Menu()
        
        menubar.Append(file_menu, '&Datei')
        menubar.Append(edit_menu, '&Bearbeiten')
        menubar.Append(help_menu, '&Info')
        
        open_menu_item = file_menu.Append(wx.ID_OPEN, u'Öffnen')
        exit_menu_item = file_menu.Append(wx.ID_EXIT, 'Beenden')
        
        self.SetMenuBar(menubar)

        self.Bind(wx.EVT_MENU, self.TimeToQuit, exit_menu_item)

    def TimeToQuit(self, _event):
        self.Close(True)


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, wx.ID_ANY, u'Erstellung von Menüs')
        frame.Show()
        self.SetTopWindow(frame)
        return True


def main():
    app = MyApp(False)
    app.MainLoop()


if __name__ == '__main__':
    main()
Wenn man für Standardoperationen die Konstanten von `wxWidgets` verwendet, statt eigene zu definieren, können die entsprechenden Menüpunkte oder Schaltflächen automatisch an die Umgebung angepasst werden. Also zum Beispiel mit den üblichen Icons und Tastenkürzeln belegt werden:

Bild
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Also das grün ist nicht so meins :D
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Danke für die Überarbeitung meines "Programmes" :)

Ich bewege mich - wie erwähnt - wieder abseits des GUI. Hier habe ich das Problem, dass mir nichts Produktives als Problemstellung einfällt... Schlimm ists mit mir :)
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Was wäre denn die "produktive" Aufgabenstellung des GUI-Programms gewesen? Vielleicht wäre es möglich, das Programm zunächst einmal mit einem Konsolen-Interface zu versehen und dieses später durch eine grafische Oberfläche zu ersetzen. Ein Paradigma der Programmentwicklung lautet ja, daß Oberfläche und Programmlogik strikt getrennt werden sollten. Die Oberfläche greift also nur auf eine (ggf. interne) Schnittstelle zu und ist damit austauschbar.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Grundsätzlich wollte ich per "GUI" einfach mal eine Textdatei öffnen und anzeigen lassen. Öffnen natürlich über das entsprechende Menü. Wenn das dann funktioniert, wäre der nächste Schritt ändern der Textdatei bzw. speichern gewesen.

Vielleicht mach ich aber schon wieder viel zu große Sprünge (was mir leider in Sachen programmieren lernen oft passiert), selbst wenn mein Vorhaben abseits der GUI realisierbar ist.

LG
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Dann mach doch folgendes: Abfrage eines Pfadnamens, Anzeige in der Konsole.

Im nächsten Schritt dann:
  • Eingabe eines Quell-Datei-Namens
    Eingabe eines Ziel-Datei-Namens
    Eingabe eines kurzen Textes, durch den ein definierter Platzhalter in der Datei ersetzt wird.
Beachten:
  • Die Quelldatei darf nur gelesen und nicht überschrieben werden.
    Um mit den Pfaden zu hantieren (Zusammensetzen, etc.), bediene dich der Methoden im Modul os.path
    Fürs Ersetzen des Platzhalters kannst du die replace-Methode von String-Objekten nehmen, oder, wenns anspruchsvoller werden soll, das re-Modul.
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Danke für die Anregung. Ich merke grade dass ich damit wohl doch schon überfordert bin. Hab jetzt einiges gelesen aber verstehen tu ich es nicht wirklich.

Irgendwo kommen mir schon wieder Zweifel und auch der Gedanke "Lass es, du bist zu dumm fürs programmieren, egal in welcher Hochsprache". Und dabei soll Python im Verhältnis zu andren Sprachen "einfach" sein...

LG
Pekh
User
Beiträge: 482
Registriert: Donnerstag 22. Mai 2008, 09:09

Lass es langsam angehen und nimm dir viel Zeit zum experimentieren. Es heißt nicht umsonst Programmiersprache. Die wenigsten scheitern dabei an den Vokabeln (den Befehlen, der Syntax). Weitaus mehr Schwierigkeiten bereitet das strukturierte Herangehen und die saubere Beschreibung einer Problemstellung. Und das lernt man leider auch nicht aus Büchern sondern nur durch beständige Auseinandersetzung mit Problemen, die einen Hauch über den eigenen Fertigkeiten liegen. Das dauert. Aber nur so lernt man es halt richtig. Irgendwann wirst du merken, daß du die Herangehensweisen, die du dir aneignest, auch auf andere Lebensbereiche überträgst. Und spätestens ab dem Zeitpunkt hat sich die Mühe gelohnt.

Ein paar Tipps:
  • Lies soviel wie möglich hier im Forum mit und versuche, es nachzuvollziehen. Oft beginnen nach einer Weile "Wettbewerbe" um die schönste / kürzeste / effizienteste Lösung eines Problems. Eine super Gelegenheit, Neues kennenzulernen und mal über den Tellerrand zu schauen.

    Stelle deinen Code hier im Forum vor und frage nach Verbesserungsmöglichkeiten. Du wirst dir wahrscheinlich einiges anhören müssen, aber wenn du die Tipps beherzigst, wirst du ebenfalls rasante Fortschritte machen.

    Es gibt ein paar Grundkonstrukte, die man immer wieder braucht. Schleifen und Bedingungen gehören natürlich dazu. Aber auch bestimmte Datentypen wie Listen und Dictionaries. Diese mußt du im Schlaf beherrschen, so daß du dir bereits im Kopf grobe Lösungen für Teilprobleme zurechtlegen kannst. Es gibt bestimmte Muster (meistens so zwei - fünf Zeilen), die braucht man in Abwandlung immer wieder. Welche das sind, wirst du durch Mitlesen und Ausprobieren schnell herausbekommen. Das alles ist dein Werkzeug. Lerne es kennen und sicher zu gebrauchen.

    Hab keine Scheu, bei Problemen hier nachzufragen. Egal wie trivial sie sein mögen: Wir helfen grundsätzlich gern. Zumindest so lange ein gewisses Maß an Eigeninitiative erkennbar ist.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Wichtig ist, dass du nicht nur liest, sondern auch immer gleich versuchst, kleine Programme zu schreiben. Programmieren lernt man nur duch programmieren, genauso, wie man zum Autofahren auch praktische Fahrstunden braucht. Fange wirklich ganz klein an! Erst ein Hello World-Programm, dann ein Programm, dass eine Eingabe vom Benutzer entgegennimmt und diese ausgibt, dann ein Programm, das etwas mit der Benutzereingabe macht (kleine Berechnungen etc). Hoert sich vielleicht doof an, aber so haben wir alle angefangen. :wink: Ausserdem ist das Lernen ein iterativer Prozess. Man liest einen Abschnitt, versteht vlt. erstmal nur einen Teil davon, programmiert etwas dazu und macht viele Fehler, liest den Abschnitt nochmal und versteht ihn besser als vorher...

Wenn du das ein wenig gemacht hast, schau dir noch einmal die heruntergebrochene Version des "Text-Editors" in Pekhs Post an und arbeite die Punkte Schritt fuer Schritt durch. Es ist naemlich beim Programmieren auch wichtig, ein Problem in Teilprobleme zerlegen zu koennen, die man Schritt fuer Schritt implementiert. Wenn du mit einem Programm anfaengst, ist es nicht unbedingt noetig, dass du schon am Anfang das Gefuehl hast, du weisst, wie du jedes Teilproblem loesen kannst, also lass dich da nicht abschrecken! Brich das Problem auf so kleine Einheiten herunter, dass du mit etwas anfangen kannst, und probiere dann weiter.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
mcdaniels
User
Beiträge: 168
Registriert: Mittwoch 18. August 2010, 19:53

Hallo!
Danke für die netten Worte. Ich werde mich jedenfalls weiterhin bemühen. Hatte gestern wohl nicht unbedingt einen guten Tag :)
Antworten