如何在python中按下键盘上的“enter”键时设置一个特定的动作

时间:2016-10-19 07:31:19

标签: python user-interface tkinter

我正在为学校制作一个带有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()

1 个答案:

答案 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)
  1. Events and Bindings

  2. Key names

相关问题