Seite 1 von 1

Program ausführen lassen

Verfasst: Sonntag 13. März 2005, 17:52
von 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

Verfasst: Sonntag 13. März 2005, 18:05
von mawe
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

Verfasst: Sonntag 13. März 2005, 18:10
von 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...

Verfasst: Sonntag 13. März 2005, 18:24
von mawe
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

Verfasst: Sonntag 13. März 2005, 18:39
von 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...

Verfasst: Sonntag 13. März 2005, 18:39
von nochmal cr4cky weil iched
ps.: bei mir kam echt kein fehler ..... :)

Verfasst: Sonntag 13. März 2005, 18:49
von mawe
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

Verfasst: Sonntag 13. März 2005, 18:58
von 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