Program ausführen lassen

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.
Antworten
Cr4cky

Hi@all
ich hab die suchfunktion und google n paar mal benutzt... leider nichts gefunden. deshalb muss ich euch jetzt wohl oder übel mit meinem (für euch wahrscheinlich) kinderkram nerven... :)

also ich habe mehrere python scripts geschrieben. jetzt hab ich noch eins geschrieben, das mit Tkinter ne liste von den programmen anzeigt. wie kann ich das jetzt realisieren, dass das jeweils aktive objekte in der liste ausgeführt wird.
aaaalso ich hab die dateien alle in einem ordner. uuund wenn ich zum beispiel das hier mache:

Code: Alles auswählen

import bruchtk #das ist eine der dateien
bruchtk()         # hier wird sie ausgeführt
... dann funktioniert das ( der öffnet die datei bruchtk.py) ... aaaber wenn ich das so mache:

Code: Alles auswählen

import bruchtk
from Tkinter import *
root=Tk()
def ende():
    root.destroy()
def ausw():
    x=li.get('active')
    if x=='*****':
        bruchtk()
    elif x=='######':
        root.destroy()
    else:
        root.destroy()
li=Listbox(root,height=0,width=30,bg='lightblue')
li.insert(END,"*****")
li.insert(END,"######")
li.insert(END,"*under construction*")
li.insert(END,"*under construction*")
li.pack()
accept=Button(root,text='OK', command=ausw)
accept.pack(side=LEFT)
ende=Button(root,text='Exit', command=ende)
ende.pack(side=LEFT)
... funktioniert das nicht, und der fehler wird ausgegeben:

Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python23\lib\lib-tk\Tkinter.py", line 1345, in __call__
return self.func(*args)
File "C:\******\mrechner.py", line 9, in ausw
bruchtk()
TypeError: 'module' object is not callable


ich bin ratlos.. hab schon jede menge ausprobiert.
wär echt total nett wenn ihr mir schnell helfen könntet.
dankö schon mal ;)

mfg Cr4cky
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Code: Alles auswählen

import bruchtk
bruchtk()
Das funktioniert? Du bekommst doch da sicher auch die Fehlermeldung, TypeError: 'module' object is not callable, oder?
Wie sieht die Datei bruchtk überhaupt aus? Wenn z.B. einfach nur print "hello" drin steht, reicht import bruchtk, und Du siehst "hello" auf der Console. Sind aber Funktionen enthalten, musst Du sie mit

Code: Alles auswählen

bruchtk.funktionsname()
aufrufen.

Gruß, mawe
Cr4cky

nein, wenn ich das so mache also mit

import bruchtk
bruchtk()

dann startet der die datei bruchtk.py als wenn ich sie direkt starte.... ganz merkwürdig.

die datei bruchtk.py sieht so aus:

Code: Alles auswählen

from Tkinter import *

def ende():
    root.destroy()
def ggt(a,b):
    if a < b: a,b = b,a
    if b==0:
        return a
    while a%b != 0:
        a,b = b,a%b
    return b
def fehler():
    anz1["text"]='Fehler!'
    anz2["text"]='Nenner'
    anz3["text"]='ist Null!'
def plus():
    a=int(e1.get())
    b=int(e2.get())
    c=int(e3.get())
    d=int(e4.get())
    if b==0 or d==0:
        fehler()
    elif b==0 and d==0:
        fehler()
    else:
        x=a*d
        y=c*b
        z=b*d
        p=x+y
        ggt1=ggt(p,z)
        anz1["text"]=(p)/ggt1
        anz2["text"]='_'
        anz3["text"]=z/ggt1
def minus():
    a=int(e1.get())
    b=int(e2.get())
    c=int(e3.get())
    d=int(e4.get())
    if b==0 or d==0:
        fehler()
    elif b==0 and d==0:
        fehler()
    else:
        x=a*d
        y=c*b
        z=b*d
        p=x-y
        ggt1=ggt(p,z)
        anz1["text"]=(p)/ggt1
        anz2["text"]='-'
        anz3["text"]=z/ggt1
def mal():
    a=int(e1.get())
    b=int(e2.get())
    c=int(e3.get())
    d=int(e4.get())
    if b==0 or d==0:
        fehler()
    elif b==0 and d==0:
        fehler()
    else:
        x=a*c
        y=b*d
        ggt1=ggt(x,y)
        anz1["text"]=(x)/ggt1
        anz2["text"]='-'
        anz3["text"]=y/ggt1
def durch():
    a=int(e1.get())
    b=int(e2.get())
    c=int(e3.get())
    d=int(e4.get())
    if b==0 or c==0:
        fehler()
    elif b==0 and c==0:
        fehler()
    else:
        x=a*d
        y=b*c
        ggt1=ggt(x,y)
        anz1["text"]=(x)/ggt1
        anz2["text"]='-'
        anz3["text"]=y/ggt1
def rechnen():
    ausw=li.get("active")
    if ausw=="Plus":
        plus()
    elif ausw=="Minus":
        minus()
    elif ausw=="Mal":
        mal()
    else:
        durch()
root=Tk()
root.title('Bruchrechnen')
flinks = Frame(root,width=100)
flinks.pack(expand=YES, fill=BOTH,side=LEFT)
lb1=Label(flinks, text='Zaehler1:')
lb1.pack()
e1=Entry(flinks,width=10)
e1.pack()
lb2=Label(flinks, text='Nenner1:')
lb2.pack()
e2=Entry(flinks,width=10)
e2.pack()
lb2=Label(flinks,text=' Zaehler2:')
lb2.pack()
e3=Entry(flinks,width=10)
e3.pack()
lb4=Label(flinks, text='Nenner2:')
lb4.pack()
e4=Entry(flinks,width=10)
e4.pack()
lb5=Label(flinks, text='Ergebnis:')
lb5.pack()
anz1=Label(flinks,text='', bg='grey80', fg='red', height='1', width='6',font = ('Front Courier', 12,  'bold'))
anz1.pack(expand=YES,fill=BOTH)
anz2=Label(flinks,text='', bg='grey80', fg='red', height='1', width='6',font = ('Front Courier', 12,  'bold'))
anz2.pack(expand=YES,fill=BOTH)
anz3=Label(flinks,text='', bg='grey80', fg='red', height='1', width='6',font = ('Front Courier', 12,  'bold'))
anz3.pack(expand=YES,fill=BOTH)
fspacer=Frame(root,width=50)
fspacer.pack(side=LEFT)
frechts = Frame(root,width=50)
frechts.pack(expand=YES, fill=BOTH,side=RIGHT)
lb6=Label(frechts,text='Rechenart:')
lb6.pack()
li=Listbox(frechts,height=0,width=7)
li.insert(END,"Plus")
li.insert(END,"Minus")
li.insert(END,"Mal")
li.insert(END,"Geteilt")
li.pack()
accept=Button(frechts,text='OK', command=rechnen)
accept.pack(side=LEFT)
exit=Button(frechts,text='Exit',command=ende)
exit.pack(side=LEFT)
root.mainloop()
(unübersichtilich aber gut zu verstehen)
is n projekt für die schule...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Also ich bekomm eine Fehlermeldung! Schau mal genau, nachdem Du auf Exit drückst, stehts auf der Console.
Das Programm wird schon bei import bruchtk gestartet :wink:.

Pack mal einfach alles in bruchtk zwischen root=Tk() und root.mainloop() in eine Funktion, also

Code: Alles auswählen

def gui():
    root = Tk()
    ...
    root.mainloop()
und ruf das Ganze dann aus Deinem Programm mit bruchtk.gui() auf (musst dann allerdings noch einige Variablen global machen, oder gleich eine Klasse schreiben, was sicher das Beste wäre :wink:).

Gruß, mawe
Cr4cky

danke funktioniert soweit :) coole sache..
wie meinste das mit variablen global machen?
sry, wennsch dumme fragn stell, aba hab erst seit kurzem angefangen mich mit python zu beschäftigen...
nochmal cr4cky weil iched

ps.: bei mir kam echt kein fehler ..... :)
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Na zum Beispiel wenn Du jetzt auf Exit drückst, bekommst Du die Fehlermeldung NameError: global name 'root' is not defined (und sag mir jetzt nicht Du bekommst keine :D).
Was heisst das? Du erzeugst mit root = Tk() die Variable root als lokale Variable, das heisst sie ist nur in der Subroutine gui() sichtbar. Du rufst aber beim Exit-Button die Subroutine ende() auf, die auf die Variable root zugreifen will. Kann sie aber nicht, weil sie die nicht "sieht". Du kannst sie global sichtbar mache, wenn Du

Code: Alles auswählen

def ende():
    global root
    ...
def gui():
    global root
schreibst. Naja, globale Variablen sind halt keine tolle Sache, darum is es besser (meiner Meinung nach), Du schreibst das alles in einer Klasse (das erklär ich Dir jetzt aber nicht mehr :wink:).

Gruß, mawe
Cr4cky

ehm...sry, aber ich bekomm echt KEINE fehlermeldung....
nein musse mir nicht erklären... ich bastel mir da schon was schönes :)
danke für die hilfe... schökes

mfg cr4cky
Antworten