Textfeld mit Text befüllen

Fragen zu Tkinter.
Antworten
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Lass rechne dass Ergebnis zurückgeben und lies direkt danach ein Tutorial (außer dass openbook dass gibt Minuspunkte).
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:
Zuletzt geändert von problembär am Samstag 14. März 2009, 18:01, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@problembär Diese Lösung ist trotzdem scheisse.
problembär

Besser als gar keine Lösung.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Du legst aber hohe Qualitätsansprüche an.
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

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?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

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...
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.
busfahrer
User
Beiträge: 111
Registriert: Donnerstag 9. Oktober 2008, 17:42

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
Alles wird gut ;-)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

def rechne():
    return 1 + 2
Geht übrigens auch.
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

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...
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Code: Alles auswählen

from rechner import rechne
# irgendwelcher code
textfeld.insert(Tkinter.END, rechne())
vogti
User
Beiträge: 31
Registriert: Mittwoch 21. Januar 2009, 21:53
Kontaktdaten:

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...)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Dafür gibt es Bedingungen usw. aber dass wirst du ja wohl selbst hinbekommen. Du solltest auf jedenfall nochmal ein Tutorial durcharbeiten.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
yipyip
User
Beiträge: 418
Registriert: Samstag 12. Juli 2008, 01:18

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
Antworten