Seite 11 von 14
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 06:45
von snafu
Ein Python-"Buch", welches ich gerne empfehle:
http://tutorial.pocoo.org/
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 21:27
von Tengel
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.... -.-"
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 22:00
von kbr
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.
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 23:25
von 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.
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 23:27
von Tengel
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?
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 23:34
von 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.
Re: Neuling sucht Rat
Verfasst: Samstag 13. April 2013, 23:37
von Tengel
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
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 00:57
von 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()
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 02:29
von Tengel
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
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 09:30
von 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.
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 20:20
von Tengel
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
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 21:54
von JonnyDamnnox
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ß
Re: Neuling sucht Rat
Verfasst: Sonntag 14. April 2013, 23:28
von Tengel
Also is mein Code doch so schlimm ja?^^
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 07:15
von xeike
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
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 09:09
von Sirius3
@Tengel: Idealer weise sollte nur an einer Stelle im Programm testtraffic.txt gelesen und an einer geschrieben werden.
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 22:39
von Tengel
Dessen bin ich mir bewusst - nur hab ich immer noch nichts dazu gefunden wie ich Rückgabewerte von Funktionen die per Button aufgerufen werde bekomme - somit könnte ich höchstens versuchen mit globalen Variablen zu arbeiten - aber ich meine irgendwo gelesen zu haben das man etwas falsch macht wenn man auf globale Variablen angewiesen ist.
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 22:55
von BlackJack
@Tengel: Den Rückgabewert von Funktionen die durch Schaltflächen aufgerufen werden bekommst Du *gar nicht*, denn die Tk-Hauptschleife ruft die ja auf, und die schert sich nicht um die Rückgabewerte. Ich bin nach wie vor der Meinung das man objektorientierte Programmierung drauf haben sollte, bevor man sich mit GUI-Programmierung auseinander setzt, denn dann hätte man ja einen Weg Zustand über „Funktionsaufrufe” hinweg zu speichern, ohne das global machen zu müssen.
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 23:29
von Tengel
Das zeug zur OOP hab ich verstanden - zumindest das was es im Buch gab.
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 23:46
von snafu
@Tengel: Verstanden hast du es erst dann, wenn du es sinnvoll anwenden kannst. Diese Fähigkeit traue ich dir aufgrund deiner bisherigen Beiträge eher nicht zu. Du wärst IMHO aber auch ein ziemliches Wunderkind, wenn du nach der kurzen Zeit tatsächlich schon OOP in "ernstzunehmendem" Ausmaß drauf hättest...
Re: Neuling sucht Rat
Verfasst: Montag 15. April 2013, 23:48
von jerch
@Tengel:
Sorry, nein hast Du nicht

Du magst die Beispiele dort nachvollziehen können, aber der Sinn dahinter ist Dir noch verschlossen.
BlackJacks Aussagen zur Objektorientierung würde ich hier noch um den Punkt ereignisgesteuerte Programmierung verschärfen. Während Du im "klassischen" Ansatz den Hauptprogrammablauf selber steuerst, bringen GUI-Toolkits wie Tkinter den Ablauf per Ereignisschleife mit (bei Tkinter dieser mainloop-Aufruf). Um das entsprechend umzusetzen, muss man das Programm anders denken. Dafür ist objektorientierte Programmierung gut geeignet - ohne ein basales Verständnis von eben dieser objektorientierten Programmierung führt es nur zu "Hä?" und "keine Ahnung, was da passiert".
Betrachte Deinen Code doch mal aus 1m Abstand. Was fällt Dir auf? Dateioperationen auf derselben Datei noch und nöcher. Da würde ich anfangen zu optimieren
