2016-08-05 1 views
3

Я изучаю базовый Python. В настоящее время я пытаюсь создать простую программу калькулятора, которая имеет только сложение и вычитание. У меня есть один вопрос. Я не уверен, как добавить текст в свой ярлык Python при нажатии кнопки. Прямо сейчас, нажав кнопку «1», моя программа изменит ярлык дисплея на текст «1». Тем не менее, я хочу, чтобы моя программа добавляла текст, а не устанавливала его.Как мне изменить/добавить текст в tkinter.Label?

Например, если я нажимаю кнопку «1» 5 раз, в настоящее время он будет сбрасывать текст ярлыка 5 раз, и результат будет равен единице. 1. Я хочу, чтобы он добавлял номер на этикетку при нажатии, а не замене.

Текущий результат после нажатия на кнопку 5 раз:
Запрошенный результат после нажатия на кнопку 5 раз:

Вот мой текущий код программы. Если что-то неясно, просто спросите; Благодарю.

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

Просто удалите все предыдущие текст надписи, а затем добавить новый текст. –

+0

Используйте переменную для управления значением текста ярлыка. –

ответ

2

Для этого вам следует использовать StringVar. И ваш обратный вызов должен получить текущее содержимое StringVar, изменить его и использовать модифицированную строку для установки нового значения StringVar. Как это:

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, вы должны попытаться сделать вашу программу немного более компактной, используя for петли, чтобы создать и выложить свои кнопки, в соответствии с принципом DRY.

Также не рекомендуется использовать from tkinter import *. Он импортирует более 130 имен в пространство имен, что упрощает создание коллизий имен, если вы случайно используете имя Tkinter для одной из ваших собственных переменных или функций.

+1

Я бы не сказал: «_should_ использовать' StringVar'; _can_ будет более точным. Вы можете сделать это с помощью или без 'StringVar'. –

+0

Спасибо, отлично работает. Что вы предлагаете мне изменить для импорта? конкретный проект? (Вместо: из импорта tkinter *) – jxshu

+0

Хорошая точка, @BryanOakley. Я просто понял, что немного проще использовать StringVar и друзей. :) –

0

Это то, что вы ищете:

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

Вы можете определить add_one вроде следующего, чтобы сначала получить существующее значение, а затем добавить новое значение к нему:

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