Button soll Entry,Label etc verändern (Bsp. Taschenrechner)

Fragen zu Tkinter.
Antworten
Lucifer

Hallo zusammen!
Ich hoffe ihr könnt mir helfen, ich bin gerade dabei n kleinen Taschenrechner zu proggen, habe dafür ein Entry oben und viele Buttons mit beschriftung 0-9 und +-*/ etc.
Jetzt habe ich aber ein Problem:
Wie krieg ichs mittels einer Funktion hin, das ich in dem Entry einen Text einfüge?

So sieht z.Z. mein Code aus:

Code: Alles auswählen

from types import*
from Tkinter import *

#def addition():
#    return
#
#def subtraktion():
#    return
#
#def multiplikation():
#    return
#
#def division():
#    return
#

def zahldruck(zahl):
      entry1.insert(END,zahl)


root=Tk()
root.title("Taschenrechner")
entry1=Entry(root,width=30)
entry1.grid(row=1,column=1,columnspan=4)
button1=Button(root,text="1",width=6,fg="blue",command=zahldruck(1))
button2=Button(root,text="2",width=6,fg="blue",command=zahldruck(2))
button3=Button(root,text="3",width=6,fg="blue",command=zahldruck(3))
button4=Button(root,text="4",width=6,fg="blue",command=zahldruck(4))
button5=Button(root,text="5",width=6,fg="blue",command=zahldruck(5))
button6=Button(root,text="6",width=6,fg="blue",command=zahldruck(6))
button7=Button(root,text="7",width=6,fg="blue",command=zahldruck(7))
button8=Button(root,text="8",width=6,fg="blue",command=zahldruck(8))
button9=Button(root,text="9",width=6,fg="blue",command=zahldruck(9))
button0=Button(root,text="0",width=6,fg="blue",command=zahldruck(0))
buttonplus=Button(root,text="+",width=6,fg="red")
buttonminus=Button(root,text="-",width=6,fg="red")
buttonmal=Button(root,text="*",width=6,fg="red")
buttongeteilt=Button(root,text="/",width=6,fg="red")
buttonplusminus=Button(root,text="+/-",width=6,fg="red")
buttonkomma=Button(root,text=",",width=6,fg="red")
button1.grid(row=2,column=1)
button2.grid(row=2,column=2)
button3.grid(row=2,column=3)
button4.grid(row=3,column=1)
button5.grid(row=3,column=2)
button6.grid(row=3,column=3)
button7.grid(row=4,column=1)
button8.grid(row=4,column=2)
button9.grid(row=4,column=3)
button0.grid(row=5,column=2)
buttonplus.grid(row=2,column=4)
buttonminus.grid(row=3,column=4)
buttonmal.grid(row=4,column=4)
buttongeteilt.grid(row=5,column=4)
buttonplusminus.grid(row=5,column=1)
buttonkomma.grid(row=5,column=3)
root.mainloop()
ich übergebe halt die Zahl der Funktion zahldruck und will die Zahl halt ins Entry reinbringen, aber wen ich jetzt auf eine der Buttons klicke, passiert einfach nix... im Normalfalle stehen im Entry meist am Anfang schon die zahlen von 0-9, warum hab ich kein plan.
Auch wenn ich die zahl bei

Code: Alles auswählen

buttonx=Button(root,text="x",width=6,fg="blue",command=zahldruck(x))
in anführungszeichen setze, also:

Code: Alles auswählen

buttonx=Button(root,text="x",width=6,fg="blue",command=zahldruck("x"))
passiert genau das selbe... Was mache ich falsch?

p.s.: Bitte keine Klassen oder sowas als lösung schicken, habe kein Plan davon ^ ^
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Es liegt an der Definition des Buttons. Da soll als command eine Funktion übergeben werden, übergeben wird aber ein Funktionsaufruf und somit ein fester Wert. Da kann also nix passieren, wenn man den Button drückt. Über die Forensuche hab ich mal im Prinzip dieselbe Frage rausgekramt (mit Lösung): http://python.sandtner.org/viewtopic.ph ... ambda+none

mfG Milan
Lucifer

hm... erstmal danke für die schnelle Antwort Milan :D
Aber das stört mich schon extremst, das bei jedem teil jetzt dieses lambda entry1.insert bla bla bla
hinschreiben muss....
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!

Du brauchst das lambda nur bei den commands:

Code: Alles auswählen

button1=Button(root,text="1",width=6,fg="blue",command=lambda: zahldruck(1))
Wenn dir das zu mühsam ist, erzeuge doch die Buttons in einer Schleife, dann brauchst Du's nur einmal schreiben :wink:

EDIT: BTW, dem Rechner fehlt ein = :wink:

Gruß, mawe
Lucifer

mawe hat geschrieben:Hi!

Du brauchst das lambda nur bei den commands:

Code: Alles auswählen

button1=Button(root,text="1",width=6,fg="blue",command=lambda: zahldruck(1))
Wenn dir das zu mühsam ist, erzeuge doch die Buttons in einer Schleife, dann brauchst Du's nur einmal schreiben :wink:

EDIT: BTW, dem Rechner fehlt ein = :wink:

Gruß, mawe
Naja eben nicht, weil die funktion zahlendruck funktioniert ja gar nicht erst, deswegen muss ich einzeln machen, und in ne Schleife kann ichs auch nit machen weil sonst das mit der Anordnung n bissel falsch wär (und wär mit jetzt zu anstrengend n paar zählvariablen zu erstellen damit ich das mit row und column richtig hinkriege).
Es gibt leute die packen bei sowas nit alles untereinander sondern bringen struktur rein :D

btw: Das "," wurde jetzt durch das "=" ersetzt, is mir lieber ^^
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Hi!
Lucifer hat geschrieben: Naja eben nicht, weil die funktion zahlendruck funktioniert ja gar nicht erst, deswegen muss ich einzeln machen
Hä?
Lucifer hat geschrieben: Bitte keine Klassen oder sowas als lösung schicken, habe kein Plan davon ^ ^
Ich mach's trotzdem. Vielleicht hilfts dir ja doch :)

Code: Alles auswählen

from Tkinter import *

class MyButton(Button):
	def __init__(self,text):
		self.text = text
		Button.__init__(self,text=text,width=6)
		# Farben
		if text in ['+','-','*','/','+/-','=']:
			self.configure(fg='red')
		else:
			self.configure(fg='blue')
		# Commands
		if text == '=':
			self.configure(command=self.evaluate)
		elif text == '+/-':
			self.configure(command=self.pm)
		else:
			self.configure(command=self.click)

	def pm(self):
		if entry1.get()[0] == '-':
			entry1.delete(0,1)
		else:
			entry1.insert(0,'-')

	def evaluate(self):
		result = eval(entry1.get())
		entry1.delete(0,END)
		entry1.insert(END,result)
	
	def click(self):
		entry1.insert(END,self.text)


root=Tk()
root.title("Taschenrechner")
entry1=Entry(root,width=30)
entry1.grid(row=1,column=1,columnspan=4)
buttons = []
for i in [1,2,3,'+',4,5,6,'-',7,8,9,'*','+/-',0,'=','/']:
	buttons.append(MyButton(str(i)))

row, col = 2, 1
for i in range(len(buttons)):
	buttons[i].grid(row=row,column=col)
	if col == 4:
		row += 1
		col = 1
	else:
		col += 1
	
root.mainloop() 
Verbesserungen überlasse ich dir :)

Gruß, mawe
Gast

Verbesserungsvorschlag: Einfach alles weglassen ^^

nene also ich hab jetzt ne lösung gefunden, mache halt manuell das die zeichen rein kommen mit der lambda funktion, das klappt jetzt ^^

wegen dem das die funktion nicht funktioniert:

nun es ist mir ja eigentlich egal ob im Entry nun alle zahlen von 0-9 erscheinen, aber das problem war, wenn ich aufn button gekilickt habe, passierte NIX, heißt also die funktion, die da die zahl reinschreiben sollte, hat einfach nicht funktioniert und NÜCHTS gemacht ^^
Antworten