質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

tkinterのテキストボックスの内容を一文字だけ削除するボタンの作り方を教えてください!

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,586

score 16

pythonのtkinterで電卓をつくってみているのですが電卓のAC(一文字削除)のやり方を教えてください! 

出来れば=(イコール)もこまっているので=のプログラムのやり方も教えてください!

あと初心者で勉強中なのでそのプログラムの説明も教えてくださるとうれしいです!
注文が多いようですがまだ完成しておりませんが現状のプログラムを添付しておりますのでアドバイスがあればお願いします!

import tkinter
import tkinter as tk
from tkinter import messagebox as mbox

win = tk.Tk()
#タイトル
win.title("電卓")
#各ボタンが押された時に入力
def func(v):
    text.insert(tkinter.END,v)
#ラベル作成
label = tk.Label(win,text ='電卓',font=("",20))
label.pack()
#テキストボックス作製
text = tk.Entry(win)
text.pack()


#0ボタン作成
btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0)
btn_0.pack()

#1ボタン作成
btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1)
btn_1.pack()

#2ボタン作成
btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1)
btn_2.pack()

#3ボタン作成
btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1)
btn_3.pack()

#4ボタン作成
btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2)
btn_4.pack()

#5ボタン作成
btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2)
btn_5.pack()

#6ボタン作成
btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2)
btn_6.pack()

#7ボタン作成
btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3)
btn_7.pack()

#8ボタン作成
btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3)
btn_8.pack()

#9ボタン作成
btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3)
btn_9.pack()

#+ボタン作成
btn_p = tk.Button(win, text="+", command=lambda: func("+"))
btn_p.pack()

#-ボタン作成
btn_m = tk.Button(win, text="-", command=lambda: func("-"))
btn_m.pack()

#×ボタン作成
btn_k = tk.Button(win, text="×", command=lambda: func("*"))
btn_k.pack()

#÷ボタン作成
btn_w = tk.Button(win, text="÷", command=lambda: func("/"))
btn_w.pack()

#.ボタン作成
btn_s = tk.Button(win, text=".", command=lambda: func("."))
btn_s.pack()


#=ボタンを押された時の反応
def equr_click():
    answer = text.get()
    text.insert(tkinter.END,"=")

#=ボタン作成
btn_i = tk.Button(win, text="=", command=equr_click)
btn_i.pack()


#Cボタンを押された時の反応
def del_click():
    text.delete(0, tkinter.END)

#Cボタン作成
CButton = tk.Button(win, text='C', command=del_click)
CButton.pack()
#実行
win.mainloop()
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

-追記-

サンプルコードです。レイアウトに関してはテキトーです。

import tkinter
import tkinter as tk
from tkinter import messagebox as mbox
import math

win = tk.Tk()

#タイトル
win.title("電卓")

#各ボタンが押された時に,テキストボックスに入力
def func(v):
    text.insert(tkinter.END,v)

#Cボタンを押された時の反応(1文字削除)
def delfunc():
    pos_end_prev = len(text.get())-1#終わりの1つ前
    text.delete(pos_end_prev,tkinter.END)

#=ボタンを押された時の反応(計算結果を表示)
def equr_click():
    answer = eval(text.get())#計算結果取得

    #テキストボックス内を更新
    text.delete(0, tkinter.END)
    text.insert(tkinter.END,str(answer))

#ACボタンを押された時の反応(全文字削除)
def del_click():
    text.delete(0, tkinter.END)

#ラベル作成
label = tk.Label(win,text ='電卓',font=("",20))
label.place(x=50,y=50)

#テキストボックス作成
text = tk.Entry(win,width=10)
text.place(x=50,y=0)

#0~9ボタン作成
btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0)
btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1)
btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1)
btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1)
btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2)
btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2)
btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2)
btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3)
btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3)
btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3)

#記号ボタン作成
btn_p = tk.Button(win, text="+", command=lambda: func("+")).grid(column=0, row=5)  #+
btn_m = tk.Button(win, text="-", command=lambda: func("-")).grid(column=1, row=5)  #-
btn_k = tk.Button(win, text="×", command=lambda: func("*")).grid(column=2, row=5) #*
btn_w = tk.Button(win, text="÷", command=lambda: func("/")).grid(column=3, row=5) #/
btn_i = tk.Button(win, text="=", command=equr_click).grid(column=5, row=5)         #=
btn_s = tk.Button(win, text=".", command=lambda: func("."))                        #小数点

btn_AC = tk.Button(win, text='AC', command=del_click).grid(column=4, row=4)        #AC
btn_C = tk.Button(win, text="C", command=lambda: delfunc()).grid(column=3, row=4)  #C

#実行
win.mainloop()

-追記終わり-

勉強中とのことなので、コードではなく概念としてのヒントを。
コードが欲しかったらコメントしてください。

1文字削除のやり方

Cボタンの場合を応用してできます。Cボタンは全範囲削除でしたが、1文字削除の場合は削除範囲が「ENDの1つ前」から「END」になります。

問題は「ENDの1つ前」をどう定義するかです。tkinter.END-1だと型が合わずエラーになります。text.get関数で文字列を取り出し、文字列の長さ(len関数)-1を「ENDの1つ前」とするのが妥当なところでしょう。

=のプログラムのやり方

一見難しそうに見えますが、文字列を式として扱うeval関数を使えば簡単にできます。get関数でtext内容を文字列として取り出し、eval関数で計算した結果をtextに表示させれば良いでしょう。

その他アドバイス

・ボタン・ラベル・テキストボックスの配置方法について、gridとpackを併用するとエラーになる(私だけ?)ので、packは使わずgridかplaceのみを使うのがいいと思います。

・コメントはできるだけ付けたほうが見る人に対して良いとされていますが、数字ボタンに対していちいち改行・コメントをつけているとコードが冗長になり、かえって見づらくなってしまいます。なので、下記コードのようにまとめてしまって良いかと思います。

#0~9(数字)ボタン作成
btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0)
btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1)
btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1)
btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1)
btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2)
btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2)
btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2)
btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3)
btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3)
btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3)

#記号ボタン作成
btn_p = tk.Button(win, text="+", command=lambda: func("+")).grid(column=0, row=5)#+
btn_m = tk.Button(win, text="-", command=lambda: func("-")).grid(column=1, row=5)#-
btn_k = tk.Button(win, text="×", command=lambda: func("*")).grid(column=2, row=5)#*
btn_w = tk.Button(win, text="÷", command=lambda: func("/")).grid(column=3, row=5)#/
btn_i = tk.Button(win, text="=", command=equr_click).grid(column=5, row=5)#=
btn_s = tk.Button(win, text=".", command=lambda: func("."))#小数点

・単語の意味についてですが、「C(Clear)」が1文字削除、「AC(All Clear)」が全文字削除を表しています。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/02 19:20

    細かい指摘までありがとうございました!
    コードに関してはヒントで考えてみましたが、間違っていることもあると思うので一応コードをもらえるとうれしいです!

    キャンセル

  • 2019/08/04 14:23

    コード、ありがとうございました!
    質問が変わりますが、デザインに関してで
    テキストボックスやラベルの位置がこのままだと端っこに寄せなければいけないのですがのですが
    ボタンに位置を下にずらすことは出来ないのですか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る