Python und Gui Neuling

Fragen zu Tkinter.
Antworten
bonito
User
Beiträge: 4
Registriert: Samstag 20. Juni 2009, 17:16

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!!! :D :D

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]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
bonito
User
Beiträge: 4
Registriert: Samstag 20. Juni 2009, 17:16

there is an error in your programm: invalid syntax

und dabei markirt er mir das letzte "r" von root.mainloop
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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?
Benutzeravatar
kaytec
User
Beiträge: 608
Registriert: Dienstag 13. Februar 2007, 21:57

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
bonito
User
Beiträge: 4
Registriert: Samstag 20. Juni 2009, 17:16

Hey danke für eure guten Antworten....
Thank You
Zemo
User
Beiträge: 10
Registriert: Sonntag 11. Januar 2009, 11:26

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

Code: Alles auswählen

#import tkMessageBox
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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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
Zemo
User
Beiträge: 10
Registriert: Sonntag 11. Januar 2009, 11:26

Danke nun geht es :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Zemo: Das Encoding-Cookie (Zeile 1) solltest du unter Python 3 nicht mehr nutzen, da UTF-8 dort Standard ist.
Zemo
User
Beiträge: 10
Registriert: Sonntag 11. Januar 2009, 11:26

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.
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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
Antworten