python - 在 Python 中使用 Enter 键触发按钮单击

标签 python tkinter

请提前原谅我,因为我对 Python 很陌生。我正在将这段代码组合成一个非常简单的汇率计算器,并希望在按下 Enter 键时程序计算总数(执行计算命令)。 Python 返回一个错误,指出Calculate 未定义,但我已经在上面的几行中定义了它。有什么想法吗?

import tkinter
from tkinter import ttk
from tkinter import *

    root = Tk()
    root.withdraw()

class Adder(ttk.Frame):

"""The adders gui and functions."""
    def __init__(self, parent, *args, **kwargs):
        ttk.Frame.__init__(self, parent, *args, **kwargs)
        self.root = parent
        self.init_gui()


    def on_quit(self):
        """Exits program."""
        quit()

    def calculate(self, *args):
        """Calculates the sum of the two inputted numbers."""
        num1 = int(self.num1_entry.get())
        num2 = float(self.num2_entry.get())
        num3 = ((num1/2000) * num2)
        self.answer_label['text'] = num3





    def init_gui(self):
        self.root.title('Rate Calculator')
        self.root.option_add('*tearOff', 'FALSE')

        self.grid(column=0, row=0, sticky='nsew')

        self.menubar = tkinter.Menu(self.root)

        self.menu_file = tkinter.Menu(self.menubar)
        self.menu_file.add_command(label='Exit', command=self.on_quit)

        self.menu_edit = tkinter.Menu(self.menubar)

        self.menubar.add_cascade(menu=self.menu_file, label='File')
        self.menubar.add_cascade(menu=self.menu_edit, label='Edit')

        self.root.config(menu=self.menubar)

        self.num1_entry = ttk.Entry(self, width=5)
        self.num1_entry.grid(column=1, row = 2)

        self.num2_entry = ttk.Entry(self, width=5)
        self.num2_entry.grid(column=3, row=2)

        self.calc_button = ttk.Button(self, text='Calculate',
                command=self.calculate)
        self.calc_button.grid(column=0, row=3, columnspan=4)

        self.answer_frame = ttk.LabelFrame(self, text='Answer',
                height=100)
        self.answer_frame.grid(column=0, row=4, columnspan=4, sticky='nesw')

        self.answer_label = ttk.Label(self.answer_frame, text='')
        self.answer_label.grid(column=0, row=0)

        # Labels that remain constant throughout execution.
    ttk.Label(self, text='Rate Calculator').grid(column=0, row=0,
            columnspan=4)
    ttk.Label(self, text='Weight').grid(column=0, row=2,
            sticky='w')
    ttk.Label(self, text='Rate').grid(column=2, row=2,
            sticky='w')

    ttk.Separator(self, orient='horizontal').grid(column=0,
            row=1, columnspan=4, sticky='ew')

    for child in self.winfo_children():
        child.grid_configure(padx=5, pady=5)


root.bind('<Return>', calculate)


if __name__ == '__main__':
    root = tkinter.Tk()
    Adder(root)
    root.mainloop()

最佳答案

我稍微重新组织了您的代码,现在当您按下按钮或按 Enter 时,它会调用 calculate 方法。

import tkinter as tk
from tkinter import ttk

class Adder(ttk.Frame):
    """The adders gui and functions."""
    def __init__(self, parent, *args, **kwargs):
        ttk.Frame.__init__(self, parent, *args, **kwargs)
        self.root = parent
        self.init_gui()

    def on_quit(self):
        """Exits program."""
        tk.quit()

    def calculate(self, *args):
        """Calculates the sum of the two inputted numbers."""
        num1 = int(self.num1_entry.get())
        num2 = float(self.num2_entry.get())
        num3 = ((num1/2000) * num2)
        self.answer_label['text'] = num3

    def init_gui(self):
        self.root.title('Breakbulk Rate Calculator')
        self.root.option_add('*tearOff', 'FALSE')

        self.grid(column=0, row=0, sticky='nsew')

        self.menubar = tk.Menu(self.root)

        self.menu_file = tk.Menu(self.menubar)
        self.menu_file.add_command(label='Exit', command=self.on_quit)

        self.menu_edit = tk.Menu(self.menubar)

        self.menubar.add_cascade(menu=self.menu_file, label='File')
        self.menubar.add_cascade(menu=self.menu_edit, label='Edit')

        self.root.config(menu=self.menubar)

        self.num1_entry = ttk.Entry(self, width=5)
        self.num1_entry.grid(column=1, row = 2)

        self.num2_entry = ttk.Entry(self, width=5)
        self.num2_entry.grid(column=3, row=2)

        self.calc_button = ttk.Button(self, text='Calculate',
                command=self.calculate)
        self.calc_button.grid(column=0, row=3, columnspan=4)

        self.answer_frame = ttk.LabelFrame(self, text='Answer',
                height=100)
        self.answer_frame.grid(column=0, row=4, columnspan=4, sticky='nesw')

        self.answer_label = ttk.Label(self.answer_frame, text='')
        self.answer_label.grid(column=0, row=0)

        # Labels that remain constant throughout execution.
        ttk.Label(self, text='Breakbulk Rate Calculator').grid(column=0, row=0,
                columnspan=4)
        ttk.Label(self, text='Weight').grid(column=0, row=2,
                sticky='w')
        ttk.Label(self, text='Rate').grid(column=2, row=2,
                sticky='w')

        ttk.Separator(self, orient='horizontal').grid(column=0,
                row=1, columnspan=4, sticky='ew')

        for child in self.winfo_children():
            child.grid_configure(padx=5, pady=5)

        self.root.bind('<Return>', lambda event: self.calculate())


if __name__ == '__main__':
    root = tk.Tk()
    Adder(root)
    root.mainloop()

为了创建具有正确签名的 .bind 回调,我使用了一个 lambda 函数,该函数只是丢弃传递给它的 Event 对象。

我还摆脱了邪恶的 from tkinter import * 通配符导入。

关于python - 在 Python 中使用 Enter 键触发按钮单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50045278/

相关文章:

python - 如何忽略 Python 中所有潜在的异常?

python - 使用 Python 多处理进程/队列的奇怪错误

python - 如何从标签内获取文本,但忽略其他子标签

python - 在 reportlab 中创建具有不同高度行的表格

python - 在单独运行的 Python 脚本之间传递数据

python - 函数在Python Tkinter中不起作用吗?

带有 MySQLdb 的 Python Tkinter 列表框

python - 在 Pyglet 中将可调整大小的窗口的大小锁定为窗口的原始宽高比

python - Tkinter 改变按钮的坐标和大小

python - Unicode解码错误: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)