Seite 1 von 1
Textfeld mit Text befüllen
Verfasst: Samstag 14. März 2009, 15:47
von vogti
Hallo,
ich habe hier eine Datei format.py, die ein Textfeld erstellt. format.py greift auf Funktionen der Datei arbeit.py zu. arbeit.py enthält eine Funktion rechne(), welche das Ergebnis in eine Variable "Ergebnis" speichert.
Wie kann ich jetzt von format.py auf die Variable "Ergebnis" zugreifen und in das Textfeld schreiben, bzw. von arbeit.py direkt in das Textfeld schreiben?
Ich hoffe ich konnte mich verständlich ausdrücken :/
lg,
vogti
Verfasst: Samstag 14. März 2009, 17:39
von DasIch
Lass rechne dass Ergebnis zurückgeben und lies direkt danach ein Tutorial (außer dass openbook dass gibt Minuspunkte).
Verfasst: Samstag 14. März 2009, 17:54
von problembär
Code: Alles auswählen
import Kristallkugel
import arbeit
Textfeld.insert(Tkinter.END, str(arbeit.Ergebnis))
Ich hoffe ich konnte mich verständlich ausdrücken
Verfasst: Samstag 14. März 2009, 18:00
von DasIch
@problembär Diese Lösung ist trotzdem scheisse.
Verfasst: Samstag 14. März 2009, 18:03
von problembär
Besser als gar keine Lösung.
Verfasst: Samstag 14. März 2009, 18:16
von DasIch
Du legst aber hohe Qualitätsansprüche an.
Verfasst: Montag 16. März 2009, 18:13
von vogti
Naja, aber so einfach ist das leider nicht... Hier mal etwas beispiel code.
format.py:
Code: Alles auswählen
# -*- coding: cp1252 -*-
from Tkinter import *
import rechner
f=Tk()
f.geometry('500x500')
f.title('Test')
#Menüleiste erstellen
mle=Menu(master=f)
f.config(menu=mle)
#Menü erstellen
m1=Menu(master=mle)
mle.add_cascade(label='Datei', menu=m1)
m1.add_command(label='Rechne', command=rechner.rechne)
m1.add_command(label='Beenden', command=f.destroy)
textfeld = Text(f, width=50, height=10)
textfeld.pack(side=RIGHT, padx=2, pady=2)
f.mainloop()
rechner.py:
Ich möchte, dass wenn ich den Button "Rechne" drücke, er in rechner.rechne() springt, dort das Ergebnis ermittelt und dieses Ergebnis dann in das Textfeld von format.py rein schreibt. Aber irgendwie stell ich mich zu blöd an oder habe schlicht weg noch nicht genug gelesen (bzw. finde nichts dazu?) um das gelöst zu bekommen.
Anfangs dachte ich, es genügt, wenn ich bei rechner.py einfach auch ein "import format", so dass das dann etwa so aussehen würde:
Code: Alles auswählen
import format
def rechne():
a = 1
b = 2
Ergebnis = a+b
format.textfeld.insert(END,Ergebnis)
Naja, geht aber eben nicht. Kann mir das jemand kurz erklären?
Verfasst: Montag 16. März 2009, 18:39
von wuf
Hallo vogti
Zum ausprobieren:
Code: Alles auswählen
# -*- coding: cp1252 -*-
# Skriptname fill_textfield_01_01.py (wuf)
from Tkinter import *
#import rechner
def rechne():
a = 1
b = 2
Ergebnis = a+b
textfeld.insert(END,Ergebnis)
f=Tk()
f.geometry('500x500')
f.title('Test')
#Menüleiste erstellen
mle=Menu(master=f)
f.config(menu=mle)
#Menü erstellen
m1=Menu(master=mle)
mle.add_cascade(label='Datei', menu=m1)
m1.add_command(label='Rechne', command=rechne)
m1.add_command(label='Beenden', command=f.destroy)
textfeld = Text(f, width=50, height=10)
textfeld.pack(side=RIGHT, padx=2, pady=2)
f.mainloop()
Gruss wuf
Verfasst: Montag 16. März 2009, 18:42
von vogti
Vielen Dank für deine Mühe! Aber es kann doch nich die Lösung sein, einfach alles in eine Datei zu packen? Zummal ich eigentlich das Interface von den Funktionen trennen wollte...
Verfasst: Montag 16. März 2009, 18:50
von lunar
Das ist auch nicht die Lösung. Die Lösung besteht im korrekten Verwenden von Funktionen und insbesondere von Rückgabewerte von Funktionen. Offenbar scheint dir dieses essentielle Python-Grundwissen aber zu fehlen, daher kann ich die Empfehlung von DasIch nur wiederholen: Lies bitte den Abschnitt über Funktionen im offiziellen Python-Tutorial.
Verfasst: Montag 16. März 2009, 19:43
von busfahrer
Hallo
ich bin ja auch noch eher jungfräulich in Python,daher meine Frage
wäre das der richtige ansatz?
Funktionieren tuts auf jeden Fall
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf8 -*-
import Tkinter as tk
root = tk.Tk()
def rechne():
a = 1
b = 2
ergebnis = a + b
return ergebnis
def ergebnis_einfuegen():
entry.insert(tk.END,rechne())
entry = tk.Entry(root)
entry.grid(row=0,column=0)
button = tk.Button(root,text="Ergebnis",command=ergebnis_einfuegen)
button.grid(row=1,column=0)
root.mainloop()
Gruß...busfahrer
Verfasst: Montag 16. März 2009, 19:49
von lunar
Jau
Verfasst: Montag 16. März 2009, 20:34
von DasIch
Verfasst: Montag 16. März 2009, 21:32
von vogti
DasIch hat geschrieben:
Geht übrigens auch.
Die Sache mit dem return ist die mir einzige bekannte sache um Werte aus einer Funktion zurückzugeben. Gemäß dem Fall ich mach das wirklich so "return Ergebnis" (in rechner.py) - wie kriege ich das in der ANDEREN DATEI (format.py) in das Textfeld? Ist rechne() und das Textfeld alles in einer Datei ist das doch überhaupt kein Problem.
Auch die Lösung vom Busfahrer beruht darauf, dass alles in einer Datei ist...
Verfasst: Montag 16. März 2009, 21:35
von DasIch
Code: Alles auswählen
from rechner import rechne
# irgendwelcher code
textfeld.insert(Tkinter.END, rechne())
Verfasst: Montag 16. März 2009, 21:42
von vogti
So wird das doch aber schon beim start aufgerufen! Ich möchte die möglichkeit haben auch von anderen Funktionen aus ins Textfeld zu schreiben.
Was wenn ich in rechner.py noch eine Funktion habe, die etwas ganz anderes rechnet (z.b. rechne2). Derjenige, der format.py aufruft entscheidet sich zwischen rechne und rechne2. Je nach Entscheidung wird die Funktion aufgerufen und sollte das Ergebnis dann ins Textfeld schreiben. Bei deiner Lösung, DasIch, würde die Funktion Rechne doch schon beim Programm start geöffnet werden, ohne dass ich da irgendwas wählen kann.
rechner.py
Code: Alles auswählen
def rechne():
a = 1
b = 2
Ergebnis = a+b
def rechne2():
a=1
b=2
Ergebnis = a*b
(format.py wird eben dementsprechend geändert, dass man zwischen rechne und rechne2 wählen kann...)
Verfasst: Montag 16. März 2009, 21:57
von DasIch
Dafür gibt es Bedingungen usw. aber dass wirst du ja wohl selbst hinbekommen. Du solltest auf jedenfall nochmal ein Tutorial durcharbeiten.
Verfasst: Dienstag 17. März 2009, 08:06
von wuf
Hallo vogti
Hier nochmal etwas zum ausprobieren:
Code: Alles auswählen
# Skriptname fill_textfield_01_02.py (wuf)
import Tkinter as tk
import rechner
def add():
a = 1
b = 2
task = "%d + %d = %d" % (a, b, rechner.add(a, b))
insert_task(task)
def multiply():
a = 15
b = 18
task = "%d * %d = %d" % (a, b, rechner.multiply(a, b))
insert_task(task)
def insert_task(task):
textfeld.insert(tk.END, task + '\n')
f = tk.Tk()
f.geometry('500x500')
f.title('Test')
#Menuleiste erstellen
mle = tk.Menu(master=f)
f.config(menu=mle)
#Menu erstellen
m1 = tk.Menu(master=mle)
mle.add_cascade(label='Datei', menu=m1)
m1.add_command(label='Addiere', command=add)
m1.add_command(label='Multipliziere', command=multiply)
m1.add_command(label='Beenden', command=f.destroy)
textfeld = tk.Text(f, width=50, height=10)
textfeld.pack(side=tk.RIGHT, padx=2, pady=2)
f.mainloop()
Code: Alles auswählen
# Modul rechner.py
def add(a, b):
"""Addieren"""
return a + b
def multiply(a, b):
"""Multiplizieren"""
return a * b
Gruss wuf
Verfasst: Freitag 20. März 2009, 01:45
von yipyip
Hier meine Version:
http://paste.pocoo.org/show/108761/
Das Verteilen der Klassen auf mehrere Dateien
sollte dann auch kein Problem mehr sein.
yipyip