Entry Feld "sperren"? - Label löschen?

Fragen zu Tkinter.
Antworten
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Hallo,

entschuldigt erstmal, dass ich soviele Posts eröffne, aber das sind alles ein paar kleine Feinheiten, die ich so mit meinem Anfangswissen von Python noch nicht alleine lösen kann.
Ich habe mir einen individuellen Bruchrechner programmiert, in dem ich zur Eingabe jeweils 2 Entries übereinander habe. Wenn ich dann auf den Ausrechnen Button klicke, erscheint auch das Ergebnis, jedoch kann man da ja dann im Entry nch die Einträge verändern, sodass man quasi eine falsche Rechnung anzeigen könnte... Zu diesem Zweck würde ich gerne die Entry-Felder blocken, bis man auf den Button zum Neuberechnen klickt. Mit diesem werden dann auch die Entries gelöscht.

Kann man nun gleichzeitig auch mit einem Klick auf diesen Button das Ergebnis, welches ich hinter den Entries als Label ausgebe, löschen? So wie es bisher ist, kommt es bei manchen Zahlen im Ergebnis vor, dass das vorherige Label "durchscheint" da dessen Stellen nicht vollständig überschrieben wurden...

Ich poste hier mal noch den Code:

1) Entry-Felder

Code: Alles auswählen

fenster=Toplevel()
    fenster.title('Bruchrechnung')
    fenster.geometry('650x300')
    titel1=Label(fenster,text=u'Geben Sie nachfolgend die Zähler und Nenner der Brüche an und wählen Sie die gewünschte Rechenoperation!')
    titel1.place(x=10,y=10)
    titel2=Label(fenster,text=u'>>> HINWEIS: Sie müssen erst die Zahlen eingeben und dann den Button zur Auswahl der Operation betätigen! <<<')
    titel2.place(x=10,y=35)
    z1=Entry(fenster,width=8)
    z1.place(x=10,y=70)
    z2=Entry(fenster,width=8)
    z2.place(x=180,y=70)
    s1=Label(fenster,text=6*'_',font=('bold'))
    s1.place(x=7,y=99)
    s2=Label(fenster,text=6*'_',font=('bold'))
    s2.place(x=177,y=99)
    n1=Entry(fenster,width=8)
    n1.place(x=10,y=151)
    n2=Entry(fenster,width=8)
    n2.place(x=180,y=151)
    plus=Button(fenster,text=u' + ',font=('bold',12),command=addition)
    plus.place(x=85,y=85)
    plus.config(bg='grey93')
    minus=Button(fenster,text=u'  -  ',font=('bold',12))
    minus.place(x=125,y=85)
    minus.config(bg='grey93')
    mal=Button(fenster,text=u' x ',font=('bold',13))
    mal.place(x=85,y=125)
    mal.config(bg='grey93')
    durch=Button(fenster,text=u'  :  ',font=('bold',12))
    durch.place(x=125,y=125)
    durch.config(bg='grey93')
    # Button zum Löschen der Entry-Felder und evtl falls möglcih zum Löschen des Labels Ergebnis
    button=Button(fenster,text=u'Neu Berechnen!',command=delete_entry)
    button.place(x=10,y=200)
2) Ausgabe des Bruches

Code: Alles auswählen

ergebnis_pt1=Label(fenster,text=u'=',font=('bold',22))
            ergebnis_pt1.place(x=245,y=100)
            z3,n3=bruch_addieren(int(z1.get()),int(n1.get()),int(z2.get()),int(n2.get()))
            z4=Label(fenster,text=z3)
            z4.place(x=300,y=70)
            s4=Label(fenster,text=8*'_')
            s4.place(x=297,y=99)
            n4=Label(fenster,text=n3)
            n4.place(x=300,y=151)
3) Funktion mit der der Button "Neu Berrechnen belegt ist"

Code: Alles auswählen

def delete_entry():
        z1.delete(0,END)
        z2.delete(0,END)
        n1.delete(0,END)
        n2.delete(0,END)
        plus.config(bg='grey93')
Wäre schön, wenn jemand einen Rat hätte.

MFG evil4president
Zuletzt geändert von Evil4President am Freitag 11. April 2008, 13:28, insgesamt 1-mal geändert.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

habe jetzt mal eine Tkinter Referenz gefunden und darin im Entry-widget Teil durchgelesen... da steht, dass man mit der Option "state=DISABLED" bzw. "state=NORMAL" die Entry Felder auf aktiv bzw. inaktiv setzen kann, jedoch muss ich dies quasi als Parameter in der Klammer so setzen, also z.B. z1=Entry(fenster,state=DISABLED)
nur wie kann ich das machen, dass die Entries zuerst auf NORMAL stehen, und dann in einer anderen Funktion auf DISABLED gesetzt werden? Soweit ich mich bisher auskenne geht das doch nur, wenn man eine method anwenden würde, z.B. was wie z1.state... aber das geht nicht, habe ich bereits versucht....

Bitte um Hilfe
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Das Entry-Widget verfügt wie fast alle Widgets über eine Methode config, mit der man so etwas machen kann.

Guckst du hier: http://effbot.org/tkinterbook/entry.htm
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

JA, stimmt. An die Möglichkeit das über die config einzustellen habe ich nicht gedacht. Bin wie gesagt noch relativ neu in dem Gebiet...
Vielen Dank pütone ;-)
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Habe gerade doch noch was festgestellt... Bei den ENtry-Feldern funktioniert alles einwandfrei, jedoch kann ich mit label.config(state=DISABLED) kein Label "ausblenden" bzw. löschen.
Habe auch auf der von dir verlinkten Seite unter "Label Widget" keine config-Option gefunden, außer state mit Hilfe derer man soetwas machen könnte.

Hat vielleicht noch jemand einen Tipp?
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Manchmal hilft es auch, wenn man die Suchfunktion des Forums nutzt:

http://www.python-forum.de/topic-14190.html
Himalius
User
Beiträge: 10
Registriert: Freitag 2. Mai 2008, 15:34
Wohnort: Irgendwo im Nirgendwo
Kontaktdaten:

ich hab jetzt selbst noch ne frage:
ich weiß zwar jetzt wie man eingabefelder sperrt, das sie nicht mehr veränderbar sind, aber wie kann ich das machen, dass man das, was drinsteht trotzdem noch kopieren kann, sodass man das woanders benutzen kann.
ich hab nämlich ein chiffrierprogramm und will, dass der user den chiffrierten text einfach rauskopieren kann.
bitte um hilfe.

MfG Himalius
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Du musst state statt auf "disabled" auf "readonly" setzen:

Code: Alles auswählen

import Tkinter as tk
root = tk.Tk()
entry = tk.Entry(master=root)
entry.pack()
entry.insert(0,'Hallo')
entry.config(state='readonly')
root.mainloop()
Achtung: Während NORMAL und DISABLED definierte Tkinter-Konstanten sind, gilt das für READONLY nicht. Hier funktioniert nur die Zeichenkettenvariante!
Himalius
User
Beiträge: 10
Registriert: Freitag 2. Mai 2008, 15:34
Wohnort: Irgendwo im Nirgendwo
Kontaktdaten:

pütone hat geschrieben: Achtung: Während NORMAL und DISABLED definierte Tkinter-Konstanten sind, gilt das für READONLY nicht. Hier funktioniert nur die Zeichenkettenvariante!
versteh ich nich so ganz.
wie meinst du das.
vor allem das mit der Zeichenkettenvariante versteh ich nich.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Für zahlreiche Werte bringt Tkinter Konstanten mit, etwa zur Positionierung bei Verwendung eines Geometriemanagers oder zur Positionierung innerhalb eines Text- oder Entry-Widgets oder eben zur Zustandsfestlegung mittels state.

Für den Fall, dass Tkinter als tk importiert wurde, sind folgende Aufrufe gleichwertig:

Code: Alles auswählen

entry.config(state=tk.DISABLED)
entry.config(state='disabled') 
Das funktioniert in den meisten Fällen. Bei 'readonly' gibt es aber keine entsprechende Konstante tk.READONLY, so dass nur die Zeichenkettenvariante funktioniert.
Himalius
User
Beiträge: 10
Registriert: Freitag 2. Mai 2008, 15:34
Wohnort: Irgendwo im Nirgendwo
Kontaktdaten:

ja dat mit der zeichenkettenvariante versteh ich ja nich.
was meinst du damit?
Himalius
User
Beiträge: 10
Registriert: Freitag 2. Mai 2008, 15:34
Wohnort: Irgendwo im Nirgendwo
Kontaktdaten:

funktioniert jetzt.
danke nochmals
Antworten