Seite 1 von 1
Python und Gui Neuling
Verfasst: Montag 31. August 2009, 16:43
von bonito
Hallo Leute,
ich bín 13 jahre alt und programmiere in meiner freizeit. Letztens habe ich begonnen mit Tkinter zu programmieren habe aber noch vile probleme: Ich wollte ein kleines Programm schreiben , das wenn man auf den button klickt ein "showinfo"fenster erscheint und dies ein Text anzeigt. Er zeigt mir immer ein Fehlermeldung an,allerdings ohne Begründung!
Ich würde mich sehr freuen wnn ihr weiterhelfen könntet!!!
Code: Alles auswählen
#Programm zum aufrufen von Texten
from Tkinter import*
import tkMessageBox
def antwort_christine():
tkMessageBox.showinfo("Christine","Christine ist Weiblich")
def antwort_benni():
tkMessageBox.showinfo("Benni","Benni ist Männlich")
def antwort_paul():
tkMessageBox.showinfo("Paul","Paul ist Männlich")
root=Tk()
but_christine=Button(root,text="""Christine
""",command=antwort_christine)
but_christine.pack()
but_paul=Button(root,text="""Paul
""",command=antwort_paul)
but_paul.pack()
but_benni=Button(root,text="""Benni
"""coomand=antwort_benni)
but_benni.pack()
root.mainloop()
[/url]
Verfasst: Montag 31. August 2009, 17:29
von EyDu
Hallo und willkommen im Forum!
Ich habe deinen Code jetzt nicht ausgeführt, aber ich vermute den Fehler in Zeile 28. Dort hast du statt "command" nämlich "coomand" geschrieben. Bei deinem nächsten Post solltest du die angezeigte Fehlermeldung posten, inklusive des ganzen Tracebacks. Nur weil dir die Fehlermeldung nichts sagt, heißt es nicht, dass sie anderen nichts sagt
Vielleicht noch ein paar Hinweise, die dir das Leben (mit Python) einfacher machen:
- Mache keine *-Import, sondern besser "import Tkinter as tk" und greife dann qualifiziert auf die Elemente des Moduls zu. Zum Beispiel "tk.Button". Mit *-Importen hast du auf einmal sehr viele Namen in deinem Modul von denen du nichts weißt. Dies führt mit Sicherheit zu Konflikten mit anderen Namen und unerwarteten Fehlern. Außerdem kannst du bei *-Import nicht mehr nachvollziehen, aus welchem Modul etwas kommt. Bei so einem kleinen Beispiel geht das noch, aber irgendwann (sehr schnell!) wird es zu unübersichtlich.
- Die triple-quoted Strings beim Erzeugen der Buttons sind überflüssig. Nimm dort besser ganz normale Strings.
- Da du auf die Buttons nicht zugreifst, brauchst du diese nicht an verschiedene Namen binden. In diesem Fall brauchst du eigentlich gar keinen Namen:
Code: Alles auswählen
Button(root, text="Christine", command=antwort_christine).pack()
- Auch wenn du damit wahrscheinlich noch nicht viel anfangen kannst: die "antwort_..."-Funktionen könntest du zu einer zusammenfassen und mittels "lambda" oder dem Modul "functools", und der darin enthaltenen Funktion "partial", aufrufen.
- Im Großen und Ganzen sieht dein Code ganz vernünftig aus, ich weise dich aber trotzdem noch einmal auf PEP 8 hin, auch wenn du es fast vollständig einhältst.
Verfasst: Montag 31. August 2009, 18:04
von bonito
there is an error in your programm: invalid syntax
und dabei markirt er mir das letzte "r" von root.mainloop
Verfasst: Montag 31. August 2009, 18:10
von cofi
Das Problem ist das, worauf EyDu dich schon hingewiesen hat: Das fehlende Komma in Zeile 28, neben dem falschen Namen.
Python verschluckt sich naemlich dabei und weiss dann bei ``root.mainloop()`` nicht mehr weiter
Womit startest du das Programm denn, dass du so einen seltsamen Traceback bekommst?
Verfasst: Montag 31. August 2009, 18:47
von kaytec
Hallo bonito !
Code: Alles auswählen
# -*- coding: utf-8 -*-
import Tkinter as tk
import tkMessageBox
from functools import partial
TEXT = (("Christine" , "Christin ist ..."),
("Paul", "Paul ist ..."),
("Benni", "Benni ist ..."))
def zeige_antwort(frage, antwort):
tkMessageBox.showinfo(frage, antwort)
root=tk.Tk()
for frage, antwort in TEXT:
tk.Button(text=frage, command=partial(
zeige_antwort, frage, antwort)).pack()
root.mainloop()
Gruß Frank
Danke
Verfasst: Freitag 6. November 2009, 20:22
von bonito
Hey danke für eure guten Antworten....
Thank You
Tkinter und Python 3.1.1
Verfasst: Montag 4. Januar 2010, 17:54
von Zemo
Hallo ich versuche gerade mich mit Tkinter in Python 3.1.1 aus einander zu setzten, dabei benutze ich das Script 2 Post über mir mal als Test.
Mein Problem besteht nun darin das ich in IDLE das Script unten ohne Fehler zum laufen bekomme, aber in Scite nicht. Dort gibt er mir folgende Fehlermeldung:
AttributeError: 'module' object has no attribute 'messagebox'
Wenn ich allerdings die auskommentierte Zeile
wieder mit ins Script nehme sagt er mir, das es tkMessageBox nicht gibt. Das dann sowohl in IDLE als auch in Scite.
In help(tkinter) steht das messagebox schon im Modul tkinter drin ist. Kann mir einer bitte mal die Augen öffnen warum IDLE den Code ausführt und Scite nicht. Habe das Gefühl ich sehe den Wald vor lauter Bäumen nicht. Hier jetzt mal das Script das in IDLE läuft.
Code: Alles auswählen
# -*- coding: utf-8 -*-
import tkinter as tk
#import tkMessageBox
from functools import partial
TEXT = (("Christine" , "Christin ist ..."),
("Paul", "Paul ist ..."),
("Benni", "Benni ist ..."))
def zeige_antwort(frage, antwort):
tk.messagebox.showinfo(frage, antwort)
root=tk.Tk()
for frage, antwort in TEXT:
tk.Button(text=frage, command=partial(
zeige_antwort, frage, antwort)).pack()
root.mainloop()
Danke für die Hilfe
Gruß Zemo
Verfasst: Montag 4. Januar 2010, 19:13
von numerix
Gegenüber Python 2.x wurden in Python 3.x einige Modulnamen geändert, z.B.:
Code: Alles auswählen
Python 2.x Python 3.x
Tkinter tkinter
tkFont tkinter.font
tkSimpleDialog tkinter.simpledialog
tkMessageBox tkinter.messagebox
Verfasst: Montag 4. Januar 2010, 19:19
von Zemo
Danke nun geht es

Verfasst: Montag 4. Januar 2010, 20:00
von cofi
@Zemo: Das Encoding-Cookie (Zeile 1) solltest du unter Python 3 nicht mehr nutzen, da UTF-8 dort Standard ist.
Verfasst: Montag 4. Januar 2010, 20:10
von Zemo
cofi hat geschrieben:@Zemo: Das Encoding-Cookie (Zeile 1) solltest du unter Python 3 nicht mehr nutzen, da UTF-8 dort Standard ist.
Danke für den Hinweis.
Verfasst: Montag 4. Januar 2010, 23:41
von BlackJack
@cofi: Warum sollte man das nicht mehr benutzen? Es schadet doch nicht und macht für andere Programmierer, und eventuell auch für Editoren, explizit deutlich, dass der Quelltext UTF-8 kodiert ist.
Verfasst: Dienstag 5. Januar 2010, 13:25
von Leonidas
BlackJack hat geschrieben:@cofi: Warum sollte man das nicht mehr benutzen? Es schadet doch nicht und macht für andere Programmierer, und eventuell auch für Editoren, explizit deutlich, dass der Quelltext UTF-8 kodiert ist.
Nun, ich als Programmierer gehe davon aus dass Dateien in UTF-8 kodiert sind, und mein Editor tut das auch. Wozu also der Noise. Gerade das fehlen von Boilerplate sehe ich als Stärke von Python an.
Verfasst: Mittwoch 6. Januar 2010, 01:10
von cofi
Das sehe ich genauso.
Zur Zeit des Postens dachte ich allerdings, dass es eine Empfehlung waere darauf zu verzichten, beim Nachforschen hab ich es nicht mehr gefunden, vielleicht hat mein Gedaechtnis mir da auch nur einen Streich gespielt.
IMHO ist es aber wert darauf zu verzichten, da man das coding-cookie, dann als "Warnsignal" ansehen kann. Und natuerlich u.U. eine Zeile mehr, die man gleichzeitig auf dem Bildschirm sieht
