Neuling sucht Rat
-
- User
- Beiträge: 318
- Registriert: Dienstag 26. Februar 2013, 18:39
Ich benutze dies: http://www.amazon.de/Hello-World-Progra ... 3446421440 und finde es sehr gut
Ich würde ja sagen: Lest weniger Bücher und sprecht bzw schreibt einfach die Sprache. Guckt euch *echten* Code an und nicht den, wie er in Büchern steht. Findet heraus, welche Projekte gut und welche Projekte weniger gut lesbar sind. So erkennt man sehr schön, wie man verständlichen Code schreiben kann.
Im Allgemeinen haben mich Programmiersprachen-bezogene Bücher noch nie so vom Hocker gehauen. Wenn ich was gut finde, dann sind es Bücher, die sprachunabhängig gewisse Konzepte erklären. Seien es Algorithmen oder Best Practices. Die Übertragung auf "seine" Sprache sollte man da idealerweise selbst machen können. Sprachbezogene Bücher kauen einem einfach viel zu viel vor - und meist ist es nicht mal was Gutes. Achja: Ausnahmen bestätigen die Regel.
Im Allgemeinen haben mich Programmiersprachen-bezogene Bücher noch nie so vom Hocker gehauen. Wenn ich was gut finde, dann sind es Bücher, die sprachunabhängig gewisse Konzepte erklären. Seien es Algorithmen oder Best Practices. Die Übertragung auf "seine" Sprache sollte man da idealerweise selbst machen können. Sprachbezogene Bücher kauen einem einfach viel zu viel vor - und meist ist es nicht mal was Gutes. Achja: Ausnahmen bestätigen die Regel.
Das ist genau der Punkt, welcher beschreibt, dass GUI-Programmierung nicht zu den Basics gehört.
Neben der OOP, welche man beherrschen sollte, kommen nun Dinge wie "Ereignisbasierte Programmierung" und Nebenläufigkeit hinzu.
Es genügt gerade nicht, gerade zu wissen, wie Funktionen funktionieren.
Zumal das "Wie" vom GUI-Toolkit bestimmt wird (obwohl die alle recht ähnlich ticken).
Was Bücher angeht, gebe ich snafu vollkommen recht. Es gab bis jetzt nur zwei Bücher, deren Kauf ich nicht bereue (beide englisch und themenspezifisch).
Grüße ... bwbg
Neben der OOP, welche man beherrschen sollte, kommen nun Dinge wie "Ereignisbasierte Programmierung" und Nebenläufigkeit hinzu.
Es genügt gerade nicht, gerade zu wissen, wie Funktionen funktionieren.
Zumal das "Wie" vom GUI-Toolkit bestimmt wird (obwohl die alle recht ähnlich ticken).
Was Bücher angeht, gebe ich snafu vollkommen recht. Es gab bis jetzt nur zwei Bücher, deren Kauf ich nicht bereue (beide englisch und themenspezifisch).
Grüße ... bwbg
Zuletzt geändert von bwbg am Samstag 13. April 2013, 07:09, insgesamt 1-mal geändert.
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Ein Python-"Buch", welches ich gerne empfehle: http://tutorial.pocoo.org/
Ereignisorientierte Programmierung bedeutet Funktionen/Methoden zu schreiben, die von anderer Stelle dann aufgerufen werden, wenn ein bestimmtes Ereignis auftritt: z.B. ein Mausklick, eine Tatstatureingabe oder ein Request. Mit diesen Konzepten kommst Du in Kontakt, wenn Du beispielsweise ein GUI- oder Web-Framework verwendest. Das ist Programmieren a la "Don't call us, we call you". Es ist ein Programmkonstrukt, das via einer Hauptschleife (main event loop) auf Ereignisse wartet und bei eintreten solcher zuvor registrierte Funktionen aufruft. Diese Funktionen schreibst und registriert Du. Das ist ereignisorientierte Programmierung.Tengel hat geschrieben:Wo bekomme ich den Infos zur ereignisorientierten Programmierung?
@Tengel: Es gibt eine Wikipediaseite zum Begriff Ereignis in der Programmierung. „How To Think Like A Computer Scientist” hat auch ein Kapitel über Event-Driven Programming.
Kann mir jemand sagen was
File "D:/Phyton/testie.py", line 31, in <module>
google["image"]= bild
File "D:\Phyton\lib\tkinter\__init__.py", line 1237, in __setitem__
self.configure({key: value})
File "D:\Phyton\lib\tkinter\__init__.py", line 1230, in configure
return self._configure('configure', cnf, kw)
File "D:\Phyton\lib\tkinter\__init__.py", line 1221, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
bedeutet?
File "D:/Phyton/testie.py", line 31, in <module>
google["image"]= bild
File "D:\Phyton\lib\tkinter\__init__.py", line 1237, in __setitem__
self.configure({key: value})
File "D:\Phyton\lib\tkinter\__init__.py", line 1230, in configure
return self._configure('configure', cnf, kw)
File "D:\Phyton\lib\tkinter\__init__.py", line 1221, in _configure
self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
_tkinter.TclError: image "pyimage1" doesn't exist
bedeutet?
@Tengel: Du hast wahrscheinlich nirgends eine Referenz auf das Bild behalten und dadurch wurde der Speicher dafür frei gegeben, weil `Tk` halt eine „eigene Welt” ist und Python nichts darüber weiss was auf der `Tk`-Seite noch gebraucht wird und was nicht. Du musst bei Bildern also immer dafür sorgen, dass die auch von Python aus solange erreichbar sind, wie sie von `Tk` benutzt werden. In der Regel in dem man das Bild-Objekt an das Exemplar der Klasse bindet in dem man es erstellt hat oder verwendet.
Code: Alles auswählen
def ende():
main.destroy()
def google():
webbrowser.open("www.google.de",2)
def schach():
webbrowser.open("www.schach.de",2)
def manuell():
wahl=auswahl.get()
wahl=str(wahl)
webbrowser.open("www."+str(wahl)+".de",2)
def close():
menu.close()
main=tkinter.Tk()
tkinter.Label(main, text="Hallo wo möchten sie hin?").pack()
google=tkinter.Button(main,command=google)
bild=tkinter.PhotoImage(file="google.gif")
google["image"]= bild
google.pack()
tkinter.Button(main,text="Schach",command=schach).pack()
tkinter.Button(main,text="Auf gehts",command=manuell).pack()
auswahl=tkinter.Entry(main)
auswahl.pack()
tkinter.Button(main,text="Ende",command=ende).pack()
aber wenn ich vor der main noch ein
root= tkinter.Tk()
tkinter.Button(root).pack einfüge geht es nichtmehr - sry - aber so ganz versteh ich das immer noch nicht
@Tengel: Es darf immer nur ein `Tk`-Objekt geben, denn da hängt der Tk-Interpreter und das Hauptfenster dran. Wenn man mehr davon erstellt, dann kann alles mögliche passieren. Wozu möchtest Du denn ein zweites Exemplar haben?
Was Deinem Programm noch fehlt ist der Aufruf der Tk-Hauptschleife, denn so wie es jetzt ist, beendet es sich ja sofort wieder.
Die `close()`-Funktion wird nicht verwendet, kann also wegfallen. Wenn man sie aufrufen *würde* bekäme man ja eine Fehlermeldung weil `menu` nicht definiert ist.
Die `ende()`-Funktion ist eigentlich überflüssig, weil man an ihrer Stelle auch gleich `main.destroy` verwenden könnte.
`manuell()` verwendet unnötigerweise die `str()`-Funktion. Und das auch noch zwei mal hintereinander auf den selben Wert, der bereits eine Zeichenkette *ist*.
Leicht abgeändert (und ungetestet):
Was Deinem Programm noch fehlt ist der Aufruf der Tk-Hauptschleife, denn so wie es jetzt ist, beendet es sich ja sofort wieder.
Die `close()`-Funktion wird nicht verwendet, kann also wegfallen. Wenn man sie aufrufen *würde* bekäme man ja eine Fehlermeldung weil `menu` nicht definiert ist.
Die `ende()`-Funktion ist eigentlich überflüssig, weil man an ihrer Stelle auch gleich `main.destroy` verwenden könnte.
`manuell()` verwendet unnötigerweise die `str()`-Funktion. Und das auch noch zwei mal hintereinander auf den selben Wert, der bereits eine Zeichenkette *ist*.
Leicht abgeändert (und ungetestet):
Code: Alles auswählen
import tkinter as tk
import webbrowser
def open_google_webpage():
webbrowser.open('www.google.de', 2)
def open_schach_de_webpage():
webbrowser.open('www.schach.de', 2)
def open_webpage(domain):
webbrowser.open('www.' + domain + '.de', 2)
def main():
root = tk.Tk()
tk.Label(root, text='Hallo wo möchten sie hin?').pack()
google_image = tk.PhotoImage(file='google.gif')
tk.Button(root, command=open_google_webpage, image=google_image).pack()
tk.Button(root, text='Schach', command=open_schach_de_webpage).pack()
tk.Button(
root, text='Auf gehts', command=lambda: open_webpage(auswahl.get())
).pack()
auswahl = tk.Entry(root)
auswahl.pack()
tk.Button(root, text='Ende', command=root.destroy).pack()
root.mainloop()
if __name__ == '__main__':
main()
Nichts bestimmtes - hab einfach ein wenig rumprobiert und dachte das ich so evtl. von einem Startmenü in ein "anderes Menü" wechseln kann - aber das ist wohl programmiertechnischer doch um einiges aufwändiger.Wozu möchtest Du denn ein zweites Exemplar haben?
main=tkinter.Tk() ist das nicht der Aufruf?Was Deinem Programm noch fehlt ist der Aufruf der Tk-Hauptschleife, denn so wie es jetzt ist, beendet es sich ja sofort wieder.
Mir ist schon aufgefallen das hier im Forum root=.. benutzt wird- im Buch wird das jedenfalls wie von mir angegeben gehandhabt - warum auch immer
Das es sich nicht sofort beendet wundert mich auch - normalerweise steht unten noch ein
main.mainloop()
hab das mal beim rumprobieren weg lassen und es läuft trotzdem wie vorher?!
Ja - da wollte ich mit der zweiten .Tk rumspielen - wobei ich eigentlich auch nur geschaut hab ob es .close gibt - da mir .destroy irgendwie ..ka ..."hart" vorkommtDie `close()`-Funktion wird nicht verwendet, kann also wegfallen. Wenn man sie aufrufen *würde* bekäme man ja eine Fehlermeldung weil `menu` nicht definiert ist.
Hm - wird im Buch bei jedem Beispiel mit angegeben - evtl. um einfach die Buttonthematik öfters zu bringen, k.a.^^Die `ende()`-Funktion ist eigentlich überflüssig, weil man an ihrer Stelle auch gleich `main.destroy` verwenden könnte.
Ja ....hmm - seit ich damals ewig versucht hab Daten zu öffnen/schreiben - hab ich irgendwie den totalen str() Wahn`manuell()` verwendet unnötigerweise die `str()`-Funktion. Und das auch noch zwei mal hintereinander auf den selben Wert, der bereits eine Zeichenkette *ist*
@Tengel: Zusätzliche Fenster zum Hauptfenster kann man mit `tkinter.Toplevel` erstellen.
`tkinter.Tk()` ruft nicht die Hauptschleife auf, sondern erstellt und initialisiert den Tk-Interpreter und das Hauptfenster. Danach muss man ja noch eigenen Code ausführen, der das Hauptfenster mit Inhalt füllt und Funktionen registriert, die bei bestimmten Ereignissen aufgerufen werden, bevor man dann die Kontrolle an Tk abgibt, in dem man `mainloop()` aufruft. Die Funktion blockiert ja, dass heisst dieser Aufruf kehrt erst zurück wenn das Hauptfenster geschlossen wurde.
Das sich das Programm bei Dir ohne den `mainloop()`-Aufruf nicht sofort beendet, lässt mich vermuten, dass Du es nicht als eigenständiges Programm startest, sondern aus einer IDE wie IDLE heraus. Das ist einer der Gründe warum ich Programme in IDEs laufen lassen nicht mag — sie verhalten sich oft anders als unter realen Bedingungen.
„Destroy” ist eine übliche, konventionelle Bezeichnung in einigen Programmiersprachen für Funktionen oder Methoden die Speicher wieder frei geben. Hauptsächlich in solchen Sprachen wo der Programmierer sich selbst um die Speicherverwaltung kümmern muss oder zumindest klar ist, dass beim oder nach dem Aufruf deterministisch Speicher freigegeben wird. Da sich in Python die Laufzeitumgebung um die Speicherverwaltung kümmert und es keinen von der Sprachspezifikation garantierten Zeitpunkt gibt, an dem der Speicher von einem Objekt wieder freigegeben wird, sieht man so einen Namen(szusatz) in Python selten.
Die `destroy()`-Methode beseitigt das Fenster komplett und beendet beim `Tk`-Objekt die Hauptschleife. Das ist also auch relativ „hart” und „drastisch”. Weniger hart wäre zum Beispiel die `withdraw()`-Methode, die nur das Fenster unsichtbar macht, aber auch die Hauptschleife nicht beendet. Die ist also nicht geeignet um das Programm zu beenden.
`tkinter.Tk()` ruft nicht die Hauptschleife auf, sondern erstellt und initialisiert den Tk-Interpreter und das Hauptfenster. Danach muss man ja noch eigenen Code ausführen, der das Hauptfenster mit Inhalt füllt und Funktionen registriert, die bei bestimmten Ereignissen aufgerufen werden, bevor man dann die Kontrolle an Tk abgibt, in dem man `mainloop()` aufruft. Die Funktion blockiert ja, dass heisst dieser Aufruf kehrt erst zurück wenn das Hauptfenster geschlossen wurde.
Das sich das Programm bei Dir ohne den `mainloop()`-Aufruf nicht sofort beendet, lässt mich vermuten, dass Du es nicht als eigenständiges Programm startest, sondern aus einer IDE wie IDLE heraus. Das ist einer der Gründe warum ich Programme in IDEs laufen lassen nicht mag — sie verhalten sich oft anders als unter realen Bedingungen.
„Destroy” ist eine übliche, konventionelle Bezeichnung in einigen Programmiersprachen für Funktionen oder Methoden die Speicher wieder frei geben. Hauptsächlich in solchen Sprachen wo der Programmierer sich selbst um die Speicherverwaltung kümmern muss oder zumindest klar ist, dass beim oder nach dem Aufruf deterministisch Speicher freigegeben wird. Da sich in Python die Laufzeitumgebung um die Speicherverwaltung kümmert und es keinen von der Sprachspezifikation garantierten Zeitpunkt gibt, an dem der Speicher von einem Objekt wieder freigegeben wird, sieht man so einen Namen(szusatz) in Python selten.
Die `destroy()`-Methode beseitigt das Fenster komplett und beendet beim `Tk`-Objekt die Hauptschleife. Das ist also auch relativ „hart” und „drastisch”. Weniger hart wäre zum Beispiel die `withdraw()`-Methode, die nur das Fenster unsichtbar macht, aber auch die Hauptschleife nicht beendet. Die ist also nicht geeignet um das Programm zu beenden.
So - es ist wohl mal wieder an der Zeit das ich gesteinigt werde^^
Nachdem man mir hier nicht sagen wollte wie ich an Rückgabewerte von Funktionen die per Button aufgerufen werde komme hab ich ein wenig rumprobiert.
http://pastebin.com/LGKUyUeM
So dann feuer frei und teil mir mit was alles falsch ist
Frage 1:
Als ich mehr oder weniger "fertig" war - viel mir auf - der Ablauf natürlich nicht zwangsläufig beeinhalten das man zuerst den Verbrauch abfrägt - diese Abfrage nahm ich anfänglich aber allein um Fehler mit der .txt abzufangen - also - musste auch beim direkten neuen Wert eingeben - mögliche Fehler abgefangen werden.
Nur:
Die anzeige["text"] funktionieren nicht da die ja quasi "instant" vom neuen Wert überschrieben wird.
Ich hab versucht da mit time.sleep eine kurze "Pause" dazwischen zu schieben um kurz die Info - das 0 verwendet wird gelesen werden kann - aber das Label wollte den Text einfach nicht zeigen - zusätzlich dazu ist time.seep - irgendwie "fürchterlich" . .... das sieht aus als würde sich das Programm gerade aufhängen.
Das erklärt auch noch den import time - der jetzt natürlich überflüssig ist weil er nirgends wirklich gebraucht wird - werde ich noch entfernen.
Frage 2:
Wenn ich direkt einen neuen Wert berechnen lasse und davor absichtlich - qweljaöclsjh - oder sonstigen Text in die .txt schreibe, gibt er beim ersten drücken "Falsche Eingabe. Bitte eine Zahl eingeben" an und beim 2ten Button drücken funktioniert es.
Warum kommt beim ersten mal die Anzeige das die Eingabe nicht stimmt? Obwohl ja der Inhalt der .txt nicht stimmt?
Frage 3:
Das ich in meinen Funktionen an sich "zuviel" mache und diese nicht übersichtlich sind liegt daran - das ich es irgendwie lauffähig bekommen musste - ohne zu wissen wie ich Rückgabewerte bekomm.
Frage 4:
Wenn ich das über das .py starte - öffnet sich zusätzlich die Konsole - lässt sich das verhindern?
Ich weiß - es ist wieder 99% mies und schlecht und falsch - aber sollte ich diesesmal irgendwas richtig - oder zumindest besser gemacht habe wäre diese Info auch mal "schön" ..und evtl. etwas aufmunternd .
Gruß
Tengel
Nachdem man mir hier nicht sagen wollte wie ich an Rückgabewerte von Funktionen die per Button aufgerufen werde komme hab ich ein wenig rumprobiert.
http://pastebin.com/LGKUyUeM
So dann feuer frei und teil mir mit was alles falsch ist
Frage 1:
Als ich mehr oder weniger "fertig" war - viel mir auf - der Ablauf natürlich nicht zwangsläufig beeinhalten das man zuerst den Verbrauch abfrägt - diese Abfrage nahm ich anfänglich aber allein um Fehler mit der .txt abzufangen - also - musste auch beim direkten neuen Wert eingeben - mögliche Fehler abgefangen werden.
Nur:
Die anzeige["text"] funktionieren nicht da die ja quasi "instant" vom neuen Wert überschrieben wird.
Ich hab versucht da mit time.sleep eine kurze "Pause" dazwischen zu schieben um kurz die Info - das 0 verwendet wird gelesen werden kann - aber das Label wollte den Text einfach nicht zeigen - zusätzlich dazu ist time.seep - irgendwie "fürchterlich" . .... das sieht aus als würde sich das Programm gerade aufhängen.
Das erklärt auch noch den import time - der jetzt natürlich überflüssig ist weil er nirgends wirklich gebraucht wird - werde ich noch entfernen.
Frage 2:
Wenn ich direkt einen neuen Wert berechnen lasse und davor absichtlich - qweljaöclsjh - oder sonstigen Text in die .txt schreibe, gibt er beim ersten drücken "Falsche Eingabe. Bitte eine Zahl eingeben" an und beim 2ten Button drücken funktioniert es.
Warum kommt beim ersten mal die Anzeige das die Eingabe nicht stimmt? Obwohl ja der Inhalt der .txt nicht stimmt?
Frage 3:
Das ich in meinen Funktionen an sich "zuviel" mache und diese nicht übersichtlich sind liegt daran - das ich es irgendwie lauffähig bekommen musste - ohne zu wissen wie ich Rückgabewerte bekomm.
Frage 4:
Wenn ich das über das .py starte - öffnet sich zusätzlich die Konsole - lässt sich das verhindern?
Ich weiß - es ist wieder 99% mies und schlecht und falsch - aber sollte ich diesesmal irgendwas richtig - oder zumindest besser gemacht habe wäre diese Info auch mal "schön" ..und evtl. etwas aufmunternd .
Gruß
Tengel
-
- User
- Beiträge: 68
- Registriert: Sonntag 10. März 2013, 21:14
http://www.amazon.de/Programmieren-lern ... ren+lernen
Dort wird auch Tkinter besprochen. Ist die deutsche Übersetzung von "How to think like a computer scientist". Da wird nicht großartig rumgeschwafelt sondern leicht verständlich alles erklärt, Übungsaufgaben sind auch dabei. Kannst dir ja noch die eine rezension durchlesen.
Gruß
Dort wird auch Tkinter besprochen. Ist die deutsche Übersetzung von "How to think like a computer scientist". Da wird nicht großartig rumgeschwafelt sondern leicht verständlich alles erklärt, Übungsaufgaben sind auch dabei. Kannst dir ja noch die eine rezension durchlesen.
Gruß
Sehr schön, dass du Funktionen schreibst und diese benutzt.Tengel hat geschrieben: Das ich in meinen Funktionen an sich "zuviel" mache und diese nicht übersichtlich sind liegt daran - das ich es irgendwie lauffähig bekommen musste - ohne zu wissen wie ich Rückgabewerte bekomm.
Ich persönlich würde abfragen, ob die Datei "testtraffic.txt" existiert, dann öffnen und den Wert lesen. Wenn an irgend einer Stelle etwas falsch laufen würde, so würde ich mit einem "Basiswert" weiterrechnen, ihn aber noch nicht wieder in die Datei schreiben. Der Teil, bei dem du Basiswerte in die Datei schreibst, kommt sehr oft vor. Er braucht aber nur genau ein Mal vorzukommen.
Tk kenne ich nicht gut genug, um dabei zu helfen, aber unter http://wiki.python.org/moin/TkInter findest du bestimmt das Eine oder Andere Tutorial.
Xe