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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

5383閲覧

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

kinopi

総合スコア16

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/07/28 04:59

#pythonのtkinterで電卓をつくってみているのですが電卓のAC(一文字削除)のやり方を教えてください! 
###出来れば=(イコール)もこまっているので=のプログラムのやり方も教えてください!
あと初心者で勉強中なのでそのプログラムの説明も教えてくださるとうれしいです!
注文が多いようですがまだ完成しておりませんが現状のプログラムを添付しておりますのでアドバイスがあればお願いします!

python

1import tkinter 2import tkinter as tk 3from tkinter import messagebox as mbox 4 5win = tk.Tk() 6#タイトル 7win.title("電卓") 8#各ボタンが押された時に入力 9def func(v): 10 text.insert(tkinter.END,v) 11#ラベル作成 12label = tk.Label(win,text ='電卓',font=("",20)) 13label.pack() 14#テキストボックス作製 15text = tk.Entry(win) 16text.pack() 17 18 19#0ボタン作成 20btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0) 21btn_0.pack() 22 23#1ボタン作成 24btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1) 25btn_1.pack() 26 27#2ボタン作成 28btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1) 29btn_2.pack() 30 31#3ボタン作成 32btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1) 33btn_3.pack() 34 35#4ボタン作成 36btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2) 37btn_4.pack() 38 39#5ボタン作成 40btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2) 41btn_5.pack() 42 43#6ボタン作成 44btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2) 45btn_6.pack() 46 47#7ボタン作成 48btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3) 49btn_7.pack() 50 51#8ボタン作成 52btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3) 53btn_8.pack() 54 55#9ボタン作成 56btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3) 57btn_9.pack() 58 59#+ボタン作成 60btn_p = tk.Button(win, text="+", command=lambda: func("+")) 61btn_p.pack() 62 63#-ボタン作成 64btn_m = tk.Button(win, text="-", command=lambda: func("-")) 65btn_m.pack() 66 67#×ボタン作成 68btn_k = tk.Button(win, text="×", command=lambda: func("*")) 69btn_k.pack() 70 71#÷ボタン作成 72btn_w = tk.Button(win, text="÷", command=lambda: func("/")) 73btn_w.pack() 74 75#.ボタン作成 76btn_s = tk.Button(win, text=".", command=lambda: func(".")) 77btn_s.pack() 78 79 80#=ボタンを押された時の反応 81def equr_click(): 82 answer = text.get() 83 text.insert(tkinter.END,"=") 84 85#=ボタン作成 86btn_i = tk.Button(win, text="=", command=equr_click) 87btn_i.pack() 88 89 90#Cボタンを押された時の反応 91def del_click(): 92 text.delete(0, tkinter.END) 93 94#Cボタン作成 95CButton = tk.Button(win, text='C', command=del_click) 96CButton.pack() 97#実行 98win.mainloop()

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

-追記-

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

python

1import tkinter 2import tkinter as tk 3from tkinter import messagebox as mbox 4import math 5 6win = tk.Tk() 7 8#タイトル 9win.title("電卓") 10 11#各ボタンが押された時に,テキストボックスに入力 12def func(v): 13 text.insert(tkinter.END,v) 14 15#Cボタンを押された時の反応(1文字削除) 16def delfunc(): 17 pos_end_prev = len(text.get())-1#終わりの1つ前 18 text.delete(pos_end_prev,tkinter.END) 19 20#=ボタンを押された時の反応(計算結果を表示) 21def equr_click(): 22 answer = eval(text.get())#計算結果取得 23 24 #テキストボックス内を更新 25 text.delete(0, tkinter.END) 26 text.insert(tkinter.END,str(answer)) 27 28#ACボタンを押された時の反応(全文字削除) 29def del_click(): 30 text.delete(0, tkinter.END) 31 32#ラベル作成 33label = tk.Label(win,text ='電卓',font=("",20)) 34label.place(x=50,y=50) 35 36#テキストボックス作成 37text = tk.Entry(win,width=10) 38text.place(x=50,y=0) 39 40#0~9ボタン作成 41btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0) 42btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1) 43btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1) 44btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1) 45btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2) 46btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2) 47btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2) 48btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3) 49btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3) 50btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3) 51 52#記号ボタン作成 53btn_p = tk.Button(win, text="+", command=lambda: func("+")).grid(column=0, row=5) #+ 54btn_m = tk.Button(win, text="-", command=lambda: func("-")).grid(column=1, row=5) #- 55btn_k = tk.Button(win, text="×", command=lambda: func("*")).grid(column=2, row=5) #* 56btn_w = tk.Button(win, text="÷", command=lambda: func("/")).grid(column=3, row=5) #/ 57btn_i = tk.Button(win, text="=", command=equr_click).grid(column=5, row=5) #= 58btn_s = tk.Button(win, text=".", command=lambda: func(".")) #小数点 59 60btn_AC = tk.Button(win, text='AC', command=del_click).grid(column=4, row=4) #AC 61btn_C = tk.Button(win, text="C", command=lambda: delfunc()).grid(column=3, row=4) #C 62 63#実行 64win.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のみを使うのがいいと思います。

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

python

1#0~9(数字)ボタン作成 2btn_0 = tk.Button(win, text="0", command=lambda: func("0")).grid(column=0, row=0) 3btn_1 = tk.Button(win, text="1", command=lambda: func("1")).grid(column=0, row=1) 4btn_2 = tk.Button(win, text="2", command=lambda: func("2")).grid(column=1, row=1) 5btn_3 = tk.Button(win, text="3", command=lambda: func("3")).grid(column=2, row=1) 6btn_4 = tk.Button(win, text="4", command=lambda: func("4")).grid(column=0, row=2) 7btn_5 = tk.Button(win, text="5", command=lambda: func("5")).grid(column=1, row=2) 8btn_6 = tk.Button(win, text="6", command=lambda: func("6")).grid(column=2, row=2) 9btn_7 = tk.Button(win, text="7", command=lambda: func("7")).grid(column=0, row=3) 10btn_8 = tk.Button(win, text="8", command=lambda: func("8")).grid(column=1, row=3) 11btn_9 = tk.Button(win, text="9", command=lambda: func("9")).grid(column=2, row=3) 12 13#記号ボタン作成 14btn_p = tk.Button(win, text="+", command=lambda: func("+")).grid(column=0, row=5)#+ 15btn_m = tk.Button(win, text="-", command=lambda: func("-")).grid(column=1, row=5)#- 16btn_k = tk.Button(win, text="×", command=lambda: func("*")).grid(column=2, row=5)#* 17btn_w = tk.Button(win, text="÷", command=lambda: func("/")).grid(column=3, row=5)#/ 18btn_i = tk.Button(win, text="=", command=equr_click).grid(column=5, row=5)#= 19btn_s = tk.Button(win, text=".", command=lambda: func("."))#小数点

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

投稿2019/08/01 02:14

編集2019/08/02 12:03
amahara_waya

総合スコア1029

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kinopi

2019/08/02 10:20

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

2019/08/04 05:23

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問