2016-08-05 41 views
3

Ich bin dabei, grundlegende Python zu lernen. Ich versuche gerade, ein einfaches Taschenrechnerprogramm zu erstellen, das nur Addition und Subtraktion hat. Ich habe jedoch ein Problem. Ich bin mir nicht sicher, wie ich nach dem Drücken der Taste Text zu meinem Python-Label hinzufügen würde. Jetzt, wenn ich die '1' Taste drücke, ändert mein Programm die Anzeigebezeichnung auf den Text "1". Ich möchte jedoch, dass mein Programm Text hinzufügt, nicht gesetzt.Wie würde ich Text zu einem tkinter.Label ändern/hinzufügen?

Zum Beispiel, wenn ich 'Taste 1' 5 Mal, wird es derzeit den Etikettentext 5 Mal zurückgesetzt und wird mit einer einzigen 1. Ich möchte es die Nummer auf das Etikett beim Drücken, nicht ersetzen ersetzen.

Aktuelles Ergebnis nach Drücken der Taste 5 mal:
Gewünscht Ergebnis nach Taste 5-mal drücken:

Hier ist mein aktueller Code für das Programm. Wenn etwas unklar ist, fragen Sie einfach; Vielen Dank.

from tkinter import * 

window = Tk() 

# Creating main label 
display = Label(window, text="") 
display.grid(row=0, columnspan=3) 

def add_one(): 
    display.config(text='1') 

# Creating all number buttons 
one = Button(window, text="1", height=10, width=10, command=add_one) 
two = Button(window, text="2", height=10, width=10) 
three = Button(window, text="3", height=10, width=10) 
four = Button(window, text="4", height=10, width=10) 
five = Button(window, text="5", height=10, width=10) 
six = Button(window, text="6", height=10, width=10) 
seven = Button(window, text="7", height=10, width=10) 
eight = Button(window, text="8", height=10, width=10) 
nine = Button(window, text="9", height=10, width=10) 
zero = Button(window, text="0", height=10, width=10) 

# Placing all number buttons 
one.grid(row=1, column=0) 
two.grid(row=1, column=1) 
three.grid(row=1, column=2) 
four.grid(row=2, column=0) 
five.grid(row=2, column=1) 
six.grid(row=2, column=2) 
seven.grid(row=3, column=0) 
eight.grid(row=3, column=1) 
nine.grid(row=3, column=2) 

# Creating all other buttons 
add = Button(window, text="+", height=10, width=10) 
subtract = Button(window, text="-", height=10, width=10) 
equal = Button(window, text="=", height=10, width=10) 

# Placing all other buttons 
add.grid(row=4, column=0) 
subtract.grid(row=4, column=1) 
equal.grid(row=4, column=2) 

window.mainloop() 
+0

einfach alle vorherigen Etikettentext löschen und dann neuen Text hinzufügen. –

+0

Verwenden Sie eine Variable, um den Wert des Beschriftungstexts zu steuern. –

Antwort

2

Sie sollten hierfür eine StringVar verwenden. Und Ihr Callback muss den aktuellen Inhalt der StringVar abrufen, ihn ändern und die geänderte Zeichenfolge verwenden, um den neuen Wert der StringVar festzulegen. Wie folgt aus:

import tkinter as tk 

window = tk.Tk() 

# Creating main label 
display_text = tk.StringVar() 
display = tk.Label(window, textvariable=display_text) 
display.grid(row=0, columnspan=3) 

def add_one(): 
    s = display_text.get() 
    s += '1' 
    display_text.set(s) 

one = tk.Button(window, text="1", height=10, width=10, command=add_one) 
one.grid(row=1, column=0) 

window.mainloop() 

BTW, sollten Sie versuchen, Ihr Programm ein wenig kompakten, indem Sie for Schleifen zu erstellen und das Layout Ihre Tasten, in Übereinstimmung mit dem DRY Prinzip zu machen.

Es ist auch keine gute Idee, from tkinter import * zu verwenden. Es importiert mehr als 130 Namen in Ihren Namespace, sodass Sie Namenskollisionen leicht erstellen können, wenn Sie versehentlich einen Tkinter-Namen für eine Ihrer eigenen Variablen oder Funktionen verwenden.

+1

Ich würde nicht sagen "_should_ verwenden eine' StringVar'; _can_ wäre genauer. Sie können es mit oder ohne eine 'StringVar' machen. –

+0

Danke, funktioniert perfekt. Was schlagen Sie vor, dass ich meine Importe für diese ändern spezifisches Projekt? (Statt: von tkinter import *) – jxshu

+0

Guter Punkt, @BryanOakley.Ich dachte nur, es ist ein bisschen einfacher StringVar & Freunde zu verwenden :) –

0

Ist das, was Sie suchen:

from tkinter import * 
root = Tk() 

var = StringVar() 

def f1(): 
    var.set(" ") 
    var.set("1") 

def f2(): 
    var.set(" ") 
    var.set("2") 

label = Label(root, textvariable=var) 
label.pack() 

button1 = Button(root, text="One", command=f1) 
button1.pack() 

button2 = Button(root, text="Two", command=f2) 
button2.pack() 

?

1

Sie können add_one wie die folgenden, definieren, um zunächst den vorhandenen Wert und dann einen neuen Wert anhängen:

def add_one(): 
    current_value = display.cget("text") 
    new_value = current_value + "1" 
    display.config(text=new_value)