Probleme mit Variablen und tkinter

Fragen zu Tkinter.
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Probleme mit Variablen und tkinter

Beitragvon kaytec » Mittwoch 14. Februar 2007, 17:36

Hallo Ihr !!!

ich möchte einen Taschenrechner programmieren und habe eine Variable, die die Tastureingabe als String enthält und später zum Berechnen ausgelesen wird.

Hier ist die Eingabe, die man auf dem EntryFeld sieht bei "drücken" der Tasten:

Code: Alles auswählen

      def eingabeeins(self):
                 
            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"1",)

      def eingabezwei(self):

            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"2")
                 
      def eingabedrei(self):

            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"3")


Bei Betätigung der "-" Taste soll der Inhalt ausgelesen werden und in den String gelesen werden:

Code: Alles auswählen

      def eingabeminus(self):

            self.speicher = self.ausgabe.get() + "-"
           
            self.ausgabe.delete(0,END)


Der Inhalt und das Minuszeichen wird auch in den String gelesen, doch bei neuem Durchlauf wird die Variable self.speicher auf "leer" gesetzt, denn ich musste Ihr ja einen Anfangswert geben und das habe ich so gemacht:

Code: Alles auswählen

class Rechner (Frame):
     
      def __init__(self, master=None):
            self.speicher = ""


die Lösung ist bestimmt sehr einfach, doch ich suche in meinem Buch und auf eurer Seite, doch ich kann einfache keine Antwort finden.


gruss frank
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Re: Probleme mit Variablen und tkinter

Beitragvon schlangenbeschwörer » Mittwoch 14. Februar 2007, 17:43

Hi kaytec!
kaytec hat geschrieben:

Code: Alles auswählen

      def eingabeeins(self):
                 
            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"1",)
# ...



Was ist das? Ich versteh nicht so ganz was du da machst oder machen willst. Wieso nimmst du nicht einfach ein Entry? Und wenn du das nicht willst, nimmst du "bind". Und wo ist jetzt genau dein Problem?
Gruß, jj
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Mittwoch 14. Februar 2007, 17:48

was ist bind ????
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Mittwoch 14. Februar 2007, 17:54

damit kannst du funktionen bzw. methoden an events binden. Wenn du hier oder anderswo suchst, findest du sicher mehr.
Im ge-packt ist's auch recht gut erklärt.
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Mittwoch 14. Februar 2007, 18:01

Ich zeige euch mal den code zum Probieren evt. versteht ihr mein Problem!

Code: Alles auswählen

# -*- coding: iso-8859-15 -*-
from Tkinter import *


class Rechner (Frame):
     
      def __init__(self, master=None):
            self.speicher = ""
           
            Frame.__init__(self, master,)
            self.pack()
            self.createWidgets()

      def createWidgets(self):

           

            self.buttonsieben = Button(self, text="7",width=3, command=self.eingabesieben)
            self.buttonsieben.grid(row=7, column=1,padx=10)
            self.buttonacht = Button(self,text="8",width=3, command=self.eingabeacht)
            self.buttonacht.grid(row=7, column=2)
            self.buttonneun = Button(self, text="9",width=3, command=self.eingabeneun)
            self.buttonneun.grid(row=7, column=3,padx=10)
            self.buttonneun = Button(self, text="/",width=3, command=self.eingabedivi)
            self.buttonneun.grid(row=7, column=4)
            self.buttonquadrat = Button(self, text="qua",width=3, command=self.eingabequadrat)
            self.buttonquadrat.grid(row=7, column=5,padx=10)

            self.buttonvier = Button(self, text="4",width=3, command=self.eingabevier)
            self.buttonvier.grid(row=8, column=1,pady=10)
            self.buttonfuenf = Button(self, text="5",width=3, command=self.eingabefuenf)
            self.buttonfuenf.grid(row=8, column=2)
            self.buttonsechs = Button(self, text="6",width=3, command=self.eingabesechs)
            self.buttonsechs.grid(row=8, column=3,)
            self.buttonmulti = Button(self, text="X",width=3, command=self.eingabemulti)
            self.buttonmulti.grid(row=8, column=4)
            self.buttonprozent = Button(self, text="%",width=3, command=self.eingabeprozent)
            self.buttonprozent.grid(row=8, column=5,)

            self.buttoneins = Button(self, text="1",width=3, command=self.eingabeeins)
            self.buttoneins.grid(row=9, column=1)
            self.buttonzwei = Button(self, text="2",width=3, command=self.eingabezwei)
            self.buttonzwei.grid(row=9, column=2)
            self.buttondrei = Button(self, text="3",width=3, command=self.eingabedrei)
            self.buttondrei.grid(row=9, column=3)
            self.buttonminus = Button(self, text="-",width=3, command=self.eingabeminus)
            self.buttonminus.grid(row=9, column=4)
            self.buttonwurzel = Button(self, text="Wu",width=3, command=self.eingabewurzel)
            self.buttonwurzel.grid(row=9, column=5)

            self.buttonnull = Button(self, text="0",width=3, command=self.eingabenull)
            self.buttonnull.grid(row=10, column=1,pady=10)
            self.buttonplusminus = Button(self, text="+/-",width=3, command=self.eingabevorzeichen)
            self.buttonplusminus.grid(row=10, column=2,)
            self.buttonkomma = Button(self, text=",",width=3, command=self.eingabekomma)
            self.buttonkomma.grid(row=10, column=3)
            self.buttonplus = Button(self, text="+",width=3, command=self.eingabeplus)
            self.buttonplus.grid(row=10, column=4)
            self.buttongleich = Button(self, text="=",width=3, command=self.eingabegleich)
            self.buttongleich.grid(row=10, column=5)

     
            self.labelframe=Frame(self)
            self.labelframe.grid(row=0,column=1,pady=15)
            self.ausgabe = Entry(self,width=29,justify="right",)
            self.ausgabe.grid(row=0, column=0,columnspan=6,)


      def eingabeeins(self):
                 
            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"1",)

      def eingabezwei(self):

            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"2")
                 
      def eingabedrei(self):

            ausgabe = self.ausgabe.get()
            self.ausgabe.insert(50,"3")

      def eingabeminus(self):

            self.speicher = self.ausgabe.get() + "-"
           
            self.ausgabe.delete(0,END)
            print self.speicher
           
      def eingabewurzel(self):
            print "Wu"

      def eingabenull(self):
            print 0

      def eingabevorzeichen(self):
            print "+/-"
           
      def eingabekomma(self):
            print ","
                       
      def eingabeplus(self):
            print "+"

      def eingabegleich(self):
            print "="

      def eingabevier(self):
            print 4

      def eingabefuenf(self):
            print 5

      def eingabesechs(self):
            print 6

      def eingabemulti(self):
            print "x"

      def eingabeprozent(self):
            print "%"

      def eingabegleich(self):
            print "="

      def eingabesieben(self):
            print 7

      def eingabeacht(self):
            print 8

      def eingabeneun(self):
            print 9

      def eingabedivi(self):
            print "/"

      def eingabequadrat(self):
            print "qua"
     
     
           


     
     
root = Tk()
root.title('mudda`s Rechner 1.0')
root.config(cursor='crosshair')
Rechner(root).mainloop()


Die print-Anweisungen sind nur, um die Funktion zu prüfen.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Mittwoch 14. Februar 2007, 18:34

Code: Alles auswählen

# versuchs mal so oder so ähnlich (ungetestet):
        self.buttons=[]
#...
        for i in range (9):
            b=Button(self,text=str(i+1), command=lambda:self.eingabe(zahl))
            b.grid()
            self.buttons.append(b)
   
    def eingabe(self,zahl):
        ausgabe = self.ausgabe.get()
        self.ausgabe.insert(50,zahl)

Das mit den grid-zahlen krigst du mit ein bisschen Mathe auch hin.
Gruß, jj
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Mittwoch 14. Februar 2007, 18:44

Also so ??!!! Ich soll eine Schleife bilden, die mir die einzelnen Tasten 1-9 in einem Vorgang bildet - ok - habe ich vertsanden - nur das Problem mit der Variable ist irgendwie für mich nicht gelöst !?
BlackJack

Beitragvon BlackJack » Mittwoch 14. Februar 2007, 18:53

Ich verstehe das Problem nicht so ganz. Bzw. was Du da überhaupt machen willst.

Wenn der Rechner Punkt vor Strich-Rechnung berücksichtigen soll, könntest Du zum Beispiel Stacks für bisher eingegebene Zahlen und Operationen verwalten. Oder Du implementierst einen RPN Rechner, das ist viel einfacher.

Vielleicht solltest Du den Taschenrechner erst einmal unabhängig von der GUI implementieren. Dann hast Du vorerst nur eine Front, an der Du Dich herumschlagen musst, und nicht die Logik und die GUI gleichzeitig.
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Beitragvon schlangenbeschwörer » Mittwoch 14. Februar 2007, 18:55

kaytec hat geschrieben:nur das Problem mit der Variable ist irgendwie für mich nicht gelöst !?

Das hab ich auch noch nicht verstanden.
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Mittwoch 14. Februar 2007, 19:05

das mit gui ist nicht das Problem (glaube ich mal) mache ich nur zu aufwendig. Die Tkinteroberfläche ist ja da, doch sollte die Speichervariable self.speicher die komplette Einagbe speichern, um sie später auszulesen. Das klappt ja auch, doch gebe ich erneut die Zahlen ( bei mir bis jetzt 1,2,3) ein und möchte dann subtrahieren gebe ich ein "-" String dazu. Das Eingabefeld wird gelöscht und nun könnte ich (bei mir bis jetzt 1,2,3 oder auch andere Kombination eingeben) eine neue Zahl eingeben. Danach sollte die Speichervarable den Inhalt (z.B. :123 -123) haben (bei mir wird sie auf "leer" gesetzt und sie hat den Inhalt 123-) . Würde ich nun das Kommando "=" ausführen sollte eine Berechnung stattfinden. alles klar ?!

danke frank
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Donnerstag 15. Februar 2007, 10:45

Ich habe das mit der Variable gelöst:

Code: Alles auswählen

def eingabeminus(self):

            set(self.speicher)
            self.speicher = self.speicher + self.ausgabe.get() + "-"
            self.ausgabe.delete(0,END)
BlackJack

Beitragvon BlackJack » Donnerstag 15. Februar 2007, 11:15

Was macht die erste Zeile in der Methode?
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Donnerstag 15. Februar 2007, 11:39

set(self.speicher)
übergibt den unteren Teil der Variable - Ich habe es in einer Reihe geschrieben und da ging es nicht !?
Benutzeravatar
kaytec
User
Beiträge: 540
Registriert: Dienstag 13. Februar 2007, 21:57

Beitragvon kaytec » Donnerstag 15. Februar 2007, 11:48

Das mit dem Kommando "=" habe ich über eval gelöst - jetzt rechnet er schon ! Doch manchmal macht er noch komische Sachen :-).

Code: Alles auswählen

def eingabegleich(self):
           
            ergebnis = eval (self.speicher + self.ausgabe.get())
            self.ausgabe.delete(0,END)
            self.ausgabe.insert(50,ergebnis)
BlackJack

Beitragvon BlackJack » Donnerstag 15. Februar 2007, 13:07

kaytec hat geschrieben:set(self.speicher)
übergibt den unteren Teil der Variable - Ich habe es in einer Reihe geschrieben und da ging es nicht !?


:?: Also hauptsächlich Frage ich deshalb weil `set()` der Name eines (mittlerweile) eingebauten Datentyps ist und damit diese Zeile sinnlos ist. Hast Du Dir selbst eine `set()`-Funktion definiert?

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder