Neuling sucht Rat

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.
Gary123456
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 :)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Hm okay thx.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :)
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Wen ich eine Funktion habe die einen Wert zurückliefert weise ich das ja

zurückgegebenerWert= funktionDieEinenWertZurückgibt()
zu.

Wie mache ich das wenn ich eine Funktion über einen Button aufrufe?
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

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
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!"
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ein Python-"Buch", welches ich gerne empfehle: http://tutorial.pocoo.org/
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Wo bekomme ich den Infos zur ereignisorientierten Programmierung? In meinem Buch steht nur auf der ersten Seite des Kapitels das die ereignisorientierte Programmierung in den Vordergrund rückt.... -.-"
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Tengel hat geschrieben:Wo bekomme ich den Infos zur ereignisorientierten Programmierung?
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.
BlackJack

@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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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

@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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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()


Nur der "google" Block ist wichtig - der jetzt Funktioniert


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
BlackJack

@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):

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()
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Wozu möchtest Du denn ein zweites Exemplar haben?
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.

Was Deinem Programm noch fehlt ist der Aufruf der Tk-Hauptschleife, denn so wie es jetzt ist, beendet es sich ja sofort wieder.
main=tkinter.Tk() ist das nicht der Aufruf?
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?!
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.
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" vorkommt
Die `ende()`-Funktion ist eigentlich überflüssig, weil man an ihrer Stelle auch gleich `main.destroy` verwenden könnte.
Hm - wird im Buch bei jedem Beispiel mit angegeben - evtl. um einfach die Buttonthematik öfters zu bringen, k.a.^^
`manuell()` verwendet unnötigerweise die `str()`-Funktion. Und das auch noch zwei mal hintereinander auf den selben Wert, der bereits eine Zeichenkette *ist*
Ja ....hmm :( - seit ich damals ewig versucht hab Daten zu öffnen/schreiben - hab ich irgendwie den totalen str() Wahn
BlackJack

@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.
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

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
JonnyDamnnox
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ß
Tengel
User
Beiträge: 210
Registriert: Sonntag 17. März 2013, 12:29

Also is mein Code doch so schlimm ja?^^
xeike
User
Beiträge: 83
Registriert: Donnerstag 28. Februar 2013, 09:58

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.
Sehr schön, dass du Funktionen schreibst und diese benutzt.

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
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tengel: Idealer weise sollte nur an einer Stelle im Programm testtraffic.txt gelesen und an einer geschrieben werden.
Antworten