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 :wink:

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:

Code: Alles auswählen

def rechne():
    a = 1
    b = 2
    Ergebnis = a+b
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 :wink:

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

Code: Alles auswählen

def rechne():
    return 1 + 2
Geht übrigens auch.

Verfasst: Montag 16. März 2009, 21:32
von vogti
DasIch hat geschrieben:

Code: Alles auswählen

def rechne():
    return 1 + 2
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 :wink:

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.

:wink:
yipyip