我正在为学校制作一个带有GUI的python计算器。
我从互联网上获得了一些基本代码,我必须通过更改内容来自定义它。到目前为止,我添加了DEL
按钮,^2
按钮和sqrt()
按钮。
如果我在键盘上输入等式,我现在想要,例如“2 * 4”,然后按 Enter ,它将模拟为按下等号按钮。我无法找到如何让python注册我点击 Enter ,然后给我一个答案。
这是代码:
from __future__ import division
from math import *
from functools import partial
try:
# Python2
import Tkinter as tk
except ImportError:
# Python3
import tkinter as tk
class MyApp(tk.Tk):
def __init__(self):
# the root will be self
tk.Tk.__init__(self)
self.title("Magic")
# use width x height + x_offset + y_offset (no spaces!)
#self.geometry("300x150+150+50")
# or set x, y position only
self.geometry("+150+50")
self.memory = 0
self.create_widgets()
def create_widgets(self):
# this also shows the calculator's button layout
btn_list = [
'7', '8', '9', '*', 'AC',
'4', '5', '6', '/', 'x²',
'1', '2', '3', '-', '√x',
'0', '.', '=', '+', 'DEL' ]
rel = 'ridge'
# create all buttons with a loop
r = 1
c = 0
for b in btn_list:
# partial takes care of function and argument
cmd = partial(self.calculate, b)
tk.Button(self, text=b, width=5, relief=rel,
command=cmd).grid(row=r, column=c)
c += 1
if c > 4:
c = 0
r += 1
# use an Entry widget for an editable display
self.entry = tk.Entry(self, width=37, bg="white")
self.entry.grid(row=0, column=0, columnspan=5)
def undo():
new_string = whole_string[:-1]
print(new_string)
clear_all()
display.insert(0, new_string)
def calculate(self, key):
if key == '=':
# here comes the calculation part
try:
result = eval(self.entry.get())
self.entry.insert(tk.END, " = " + str(result))
except:
self.entry.insert(tk.END, "")
elif key == 'AC':
self.entry.delete(0, tk.END)
elif key == 'x²':
self.entry.insert(tk.END, "**")
# extract the result
elif key == '√x':
self.memory = self.entry.get()
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, "sqrt(")
self.entry.insert(tk.END, self.memory)
self.entry.insert(tk.END, ")")
elif key == 'DEL':
self.memory = self.entry.get()
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, self.memory[:-1])
else:# previous calculation has been done, clear entry
if '=' in self.entry.get():
self.entry.delete(0, tk.END)
self.entry.insert(tk.END, key)
app = MyApp()
app.mainloop()
答案 0 :(得分:1)
您可以使用bind()
将功能分配给Entry
,当您按Enter
时会执行该功能
示例:
import tkinter as tk
def on_return(event):
print('keycode:', event.keycode)
print('text in entry:', event.widget.get())
root = tk.Tk()
e = tk.Entry(root)
e.pack()
e.bind('<Return>', on_return) # standard Enter
e.bind('<KP_Enter>', on_return) # KeyPad Enter
root.mainloop()
在您的代码中,它可以是 - 用于测试
self.entry = tk.Entry(self, width=37, bg="white")
self.entry.grid(row=0, column=0, columnspan=5)
self.entry.bind('<Return>', lambda event:print("ENTER:", event.widget.get()))
self.entry.bind('<KP_Enter>', lambda event:print("ENTER:", event.widget.get()))
如果您有类方法def on_return(self, event):
,那么
self.entry.bind('<Return>', self.on_return)
self.entry.bind('<KP_Enter>', self.on_return)