Hilfe GUI geht nur durch idle

Fragen zu Tkinter.
Antworten
cptjack
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2014, 10:10

Also ich habe für die Schule ein kleines programm geschrieben und das gui erscheint auch wenn ich im idle F5 drücke jedoch wenn ich einen doppelklick auf die datei mache passiert nix :(

bitte nicht wegen dem wahrscheinlich schlechten programmierstil(globale variablen,usw.) beschweren auser wenn das das problem ist danke :)

Code: Alles auswählen

from Tkinter import *
import random
import math
import __future__ #für genaue nach komma stellen

#Legt Anzahl der zu berechnenden Terme fest
wdh = 10

#für zusatz funktion
r=0

def prog():
    global r
    global wdh
    
    aexit.config(text="Nächster")
    if wdh!=0:
    #Rechenarten bestimmen(falls sie potenzen mit einbeziehen wollen die oberen beiden als Kommentar
    #kennzeichnen und bei den unteren die Kennzeichnung als Kommentar entfernen
        ra1=random.randint(1,4)
        ra2=random.randint(1,4)
    #ra1=random.randint(1,5)
    #ra2=random.randint(1,5)

    #Erste Rechenart bestimmen
        if ra1 == 1:
            s1 = "+"
        if ra1 == 2:
            s1 = "-"
        if ra1 == 3:
            s1 = "/"
        if ra1 == 4:
            s1 = "*"
        if ra1 == 5:
            s1 = "^"

    #Zweite Rechenart bestimmen
        if ra2 == 1:
            s2 = "+"
        if ra2 == 2:
            s2 = "-"
        if ra2 == 3:
            s2 = "/"
        if ra2 == 4:
            s2 = "*"
        if ra2 == 5:
            s2 = "^"


    #Zahlen bsetimmen
        z1=random.randint(1,10)
        z2=random.randint(1,10)
        z3=random.randint(1,10)


    #Hier wird die rechnung in die Datei gschrieben und auf dem Interpreter ausgegeben
        rechnung = ("("+ str(z1) + (s1) + str(z2) + ")"+ (s2) + str(z3))
        logfile.write("Rechnung:" +(rechnung)+ "\n")
        t.config(text= (rechnung))

    #Das richtige Ergebnis wird in die Datei gesschrieben
        rierg = eval(((compile((rechnung),"string","eval",__future__.division.compiler_flag))))
        logfile.write("Richtiges Ergebnis:" + str(rierg)+ "\n")


    #Der Schüler gibt sein Ergebns ein welches in die Datei geschrieben wird
        eigerg=(eerg.get())
        logfile.write("Ergebnis von " + (j) +":" + str(eigerg)+"\n\n" )
        wdh = wdh - 1

    #kleiner zusatz
        if eigerg == rierg:
            r = r + 1
    else:
        logfile.write((j) + " hat" + str(r)+ "/10 richtig")
        aexit.config(text="Beenden",command=g.destroy)



#Interface Namens eingabe
f= Tk()
f.title("Test")
w=Label (master=f,text= "Name und vorname bitte?")
w.pack()
v = StringVar()
eA = Entry(master=f,textvariable=v)
eA.pack()
bexit = Button(master=f,text="Weiter",command =f.destroy)
bexit.pack()
f.mainloop()

#Es wird nach Name und Vorname gefragt und eine Datei mit dem Namen dieser Person erstellt
v.set("Name,Vorname")
j = v.get()

logfile = open("Test von " +(j) +".txt","a")




#Interface Rechnung
g = Tk()
g.title("Test")
t=Label (master=g,text= "Term:")
t.pack()
eerg = Entry(master=g)
eerg.insert(0,0)
eerg.pack()
aexit = Button(master=g,text="Start",command = prog)
aexit.pack()
g.mainloop()



logfile.close
#Ende

schonmal danke im vorraus
Mein erstes funktionierendes Skript Anspruch pur

Code: Alles auswählen

count = 0
ziel=int(input("endzahl:"))

while count != ziel:
    count = count + 1
    print ("ich habe schon bis"),(count),("gezählt")
    
else:
    print ("fertig")
    
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Was kommt denn für eine Meldung, wenn Du das Script aus einer Shell heraus startest?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@cptjack: Darf man sich darüber beschweren dass es nicht funktioniert wenn man den Fehler behebt der das Starten verhindert? ;-) Du hast das mit der Auswertungsreihenfolge nicht im Griff. So wie es jetzt läuft, muss man das Ergebnis raten bevor man den Ausdruck gesehen hat. Das heisst die 0 die ganz am Anfang in dem Texteingabefeld steht, wird als Ergebnis für den ersten Ausdruck verwendet, und das was man eingibt während der erste Ausdruck angezeigt wird, wird vom Programm als Ergebnis für den zweiten Ausdruck verwendet, und so weiter.

Ganz ehrlich, solange Du nicht Programme sinnvoll auf Funktionen aufteilen kannst *und* objektorientierte Programmierung in den Grundlagen beherrscht, solltest Du das als GUI-Programm gar nicht erst versuchen. Das kann sonst nichts ordentliches werden.

Schreib das erst mal als Konsolenprogramm, dafür dann aber ordentlich, also zum Beispiel ohne ``global``, mit Funktionen, und vor allem bitte mit anständigen Namen und nicht diese ganzen kryptischen Kürzel.

`eval()` kannst Du bei der Gelegenheit auch weglassen. Die ganzen Operatoren gibt es im `operator`-Modul in der Standardbibliothek als Funktionen. Es gibt also keinen Grund, ausser Bequemlichkeit, den Hack mit generieren von Quelltext zu machen.

Edit: Im Programm ist noch ein Fehler: Die Protokolldatei wird am Ende nicht geschlossen — Du musst die `close()`-Methode auch aufrufen und nicht nur vom Dateiobjekt abfragen.
cptjack
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2014, 10:10

@Hyperion: wenn ich doppelklick auf das Skript mache dann geht sie auf schreibt was und geht wieder und das so schnell dass man nichts lesen kann


@BlackJack: ich habe auch eine Version ohne GUI wo alles funktioniert auch ohne globale variablen die habe ich erst eingefügt als ich das gui gemacht habe und diese Meldung bekommen habe:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\lib\lib-tk\Tkinter.py", line 1470, in __call__
return self.func(*args)
File "F:\prog.py", line 15, in prog
if wdh!=0:
UnboundLocalError: local variable 'wdh' referenced before assignment
und durch das global wurde dieses Problem behoben das alles habe ich direkt durch den idle Editor gestartet und alles hat funktioniert....



trotzdem danke für die mühe :)
Mein erstes funktionierendes Skript Anspruch pur

Code: Alles auswählen

count = 0
ziel=int(input("endzahl:"))

while count != ziel:
    count = count + 1
    print ("ich habe schon bis"),(count),("gezählt")
    
else:
    print ("fertig")
    
BlackJack

@cptjack: Deswegen hat Hyperion ja vorgeschlagen das mal in einer Konsole zu starten, also *nicht* per Doppelklick. Dann siehst Du auch was da als Fehlermeldung ausgegeben wird.

Die Version ohne GUI ist aber ziemlich sicher kein ordentliches Programm, es sei denn Du hast bei der GUI-Version plötzlich alles vergessen was ein gut lesbares und wartbares Programm ausmacht. Ich denke *das* ist wichtiger als irgendwie eine GUI hinzuwurschteln.
cptjack
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2014, 10:10

Hi ok hab ich jetzt auch gemacht und da kam raus:
Traceback <most recent call last>:
File "<stdin>" , line 1, inn <module>
File "C:\Python27\prog.py",line 4
SyntaxError:Non-ASCII character '\xfc' in file "C:\Python27\prog.py" on line 4,b
ut no encoding declared ; see http://www.python.org/peps/pep-0263.html for detail
s
Ich vermute mal es mag die unterstriche nicht aber bevor ich da jetzt was ändere mache würde ich es doch gerne wissen


Danke das ihr so geduldig mit mir seid obwohl ich nixht der Könner Bin :)

Edit:das hier von Black Jack angesprochene Problem habe ich inzwischen gelöst.
So wie es jetzt läuft, muss man das Ergebnis raten bevor man den Ausdruck gesehen hat. Das heisst die 0 die ganz am Anfang in dem Texteingabefeld steht, wird als Ergebnis für den ersten Ausdruck verwendet, und das was man eingibt während der erste Ausdruck angezeigt wird, wird vom Programm als Ergebnis für den zweiten Ausdruck verwendet, und so weiter.
Mein erstes funktionierendes Skript Anspruch pur

Code: Alles auswählen

count = 0
ziel=int(input("endzahl:"))

while count != ziel:
    count = count + 1
    print ("ich habe schon bis"),(count),("gezählt")
    
else:
    print ("fertig")
    
BlackJack

@cptjack: Welche Unterstriche? Hast Du das PEP angeschaut das dort verlinkt wird? Weil die Webseite gerade umgebaut wird landet man auf der PEP-Indexseite. Hier ist der direkte Link: http://legacy.python.org/dev/peps/pep-0263/
cptjack
User
Beiträge: 4
Registriert: Donnerstag 20. Februar 2014, 10:10

Ja hab ich grade und hab s auch zum laufen bekommen mit

Code: Alles auswählen

#-*- Coding: cp1252 -*-
Als erster Zeile


Danke für Die Hilfe vor allem für den Hinweis mit der 0 die am Anfang da steht und die Eingabe verschiebt
Mein erstes funktionierendes Skript Anspruch pur

Code: Alles auswählen

count = 0
ziel=int(input("endzahl:"))

while count != ziel:
    count = count + 1
    print ("ich habe schon bis"),(count),("gezählt")
    
else:
    print ("fertig")
    
Antworten