Seite 1 von 1
Anfänger hat Fragen
Verfasst: Mittwoch 18. August 2010, 20:07
von mcdaniels
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()
Re: Anfänger hat Fragen
Verfasst: Mittwoch 18. August 2010, 20:22
von cofi
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

.
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.
Re: Anfänger hat Fragen
Verfasst: Mittwoch 18. August 2010, 21:48
von Francesco
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.
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 05:53
von mcdaniels
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
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 06:37
von Pekh
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

Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 08:34
von Rebecca
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.
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 08:41
von mcdaniels
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
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 10:38
von 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:

Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 10:53
von jbs
Also das grün ist nicht so meins

Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 11:25
von mcdaniels
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

Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 11:29
von Pekh
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.
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 11:37
von mcdaniels
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
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 14:27
von Pekh
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.
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 18:04
von mcdaniels
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
Re: Anfänger hat Fragen
Verfasst: Donnerstag 19. August 2010, 18:27
von Pekh
Lass es langsam angehen und nimm dir viel Zeit zum experimentieren. Es heißt nicht umsonst Programmier
sprache. 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.
Re: Anfänger hat Fragen
Verfasst: Freitag 20. August 2010, 09:09
von Rebecca
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.

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.
Re: Anfänger hat Fragen
Verfasst: Freitag 20. August 2010, 10:51
von mcdaniels
Hallo!
Danke für die netten Worte. Ich werde mich jedenfalls weiterhin bemühen. Hatte gestern wohl nicht unbedingt einen guten Tag
