Python Tkinter键绑定在消息框后不起作用

Python Tkinter键绑定在消息框后不起作用,python,python-3.x,tkinter,messagebox,key-bindings,Python,Python 3.x,Tkinter,Messagebox,Key Bindings,我正在使用计算器,我遇到了一个关于键绑定的问题。在启动我的GUI类的末尾,将创建一个消息框来解释绑定到用户的情况 messagebox.showinfo("Guide", "Key bindings include: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ., +, -, *, /, (, ), Enter, Backspace, Insert and Delete.") 具有讽刺意味的是,这会导致所有绑定都没有响应,直到关闭消息框,取消选择tkinter窗口,然后重新

我正在使用计算器,我遇到了一个关于键绑定的问题。在启动我的GUI类的末尾,将创建一个消息框来解释绑定到用户的情况

messagebox.showinfo("Guide", "Key bindings include: 1, 2, 3, 4, 5, 6, 7, 8, 9, 
0, ., +, -, *, /, (, ), Enter, Backspace, Insert and Delete.")
具有讽刺意味的是,这会导致所有绑定都没有响应,直到关闭消息框,取消选择tkinter窗口,然后重新选择。绑定的编码如下:

master.bind('<Delete>', self.delete)
master.bind('<BackSpace>', self.back)
master.bind('<Return>', self.equals)
master.bind('<Insert>', self.add_answer)
master.bind(“”,self.delete)
主绑定(“”,self.back)
主绑定(“”,self.equals)
主绑定(“”,self.add\u-response)
我尝试使用focus_set(),但没有帮助。在信息框关闭后,如何使键盘立即响应

以下是我的上下文代码的全部内容

from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox  # added by @martineau

class Logic:
    def add_digit(self, *args):
        if type(args[0]) == str:
            self.expression.append(args[0])
        else:
            self.expression.append(args[0].char)
        self.labels[1].config(text="".join(self.expression))

    def add_operation(self, *args):
        if type(args[0]) == str:
            self.expression.append(args[0])
        else:
            self.expression.append(args[0].char)
        self.labels[1].config(text="".join(self.expression))

    def add_answer(self, *args):
        self.expression.extend(list(self.labels[0]['text']))
        self.labels[1].config(text="".join(self.expression))

    def delete(self, *args):
        if self.expression:
            self.expression = list()
            self.labels[1].config(text="".join(self.expression))
        else:
            self.labels[0].config(text="")

    def back(self, *args):
        self.expression = self.expression[:-1]
        self.labels[1].config(text="".join(self.expression))

    def equals(self, *args):
        equation = list()
        number = list()

        if not self.expression:
            self.labels[0].config(text='')

        for value in self.expression:
            if value in self.numpad_texts:
                number.append(value)
            else:
                if number:
                    equation.append(str(float("".join(number))))
                    number = list()
                equation.append(value)

        if number:
            try:
                equation.append(str(float("".join(number))))
            except ValueError:
                messagebox.showerror("Error", "Syntax error: Your expression has incorrect syntax")

        for i in range(len(equation)):
            if equation[i] == '(' and i != 0:
                if equation[i-1] not in self.operation_texts:
                    equation.insert(i, '*')
            elif equation[i] == ')' and i != len(equation)-1:
                if equation[i+1] not in self.operation_texts:
                    equation.insert(i+1, '*')

        if equation:
            try:
                self.labels[0].config(text=str(eval(''.join(equation))))
            except ZeroDivisionError:
                messagebox.showerror("Error", "Zero division error: Your expression has a division by zero")
            except SyntaxError:
                messagebox.showerror("Error", "Syntax error: Your expression has incorrect syntax")

class GUI(Logic):
    numpad_texts = ('7', '8', '9', '4', '5', '6', '1', '2', '3', '0', '.', 'Equals')
    operation_texts = ('/', '*', '-', '+', '(', ')')
    function_texts = ('Delete', 'Back')

    def __init__(self, master):
        master.title('Calculator')

        self.expression = list()

        self.label_frame = Frame(master)
        self.label_frame.grid(columnspan=2)

        self.labels = list()

        for i in range(2):
            self.labels.append(Label(self.label_frame))
            self.labels[i].grid(row=i, column=0, columnspan=4)

        self.labels[0].bind("<Button-1>", self.add_answer)

        self.numpad_frame = Frame(master)
        self.numpad_frame.grid(row=1, rowspan=2)

        self.numpad_buttons = list()

        for i in range(len(self.numpad_texts)):
            self.numpad_buttons.append(Button(self.numpad_frame, text=self.numpad_texts[i], command=lambda i=i: self.add_digit(self.numpad_texts[i])))
            self.numpad_buttons[i].grid(row=i//3, column=i%3)
            if self.numpad_texts != 11:
                master.bind(self.numpad_texts[i], self.add_digit)

        self.numpad_buttons[-1].config(command=self.equals)

        self.operations_frame = Frame(master)
        self.operations_frame.grid(row=1, column=1)

        self.operation_buttons = list()

        for i in range(len(self.operation_texts)):
            self.operation_buttons.append(Button(self.operations_frame, text=self.operation_texts[i], command=lambda i=i: self.add_operation(self.operation_texts[i])))
            self.operation_buttons[i].grid(row=i//2, column=i%2)
            master.bind(self.operation_texts[i], self.add_operation)

        self.functions_frame = Frame(master)
        self.functions_frame.grid(row=2, column=1)

        self.function_buttons = list()

        for i in range(len(self.function_texts)):
            self.function_buttons.append(Button(self.functions_frame, text=self.function_texts[i]))
            self.function_buttons[i].grid(row = 0, column=i%2)

        self.function_buttons[0].config(command=self.delete)
        self.function_buttons[1].config(command=self.back)

        master.bind('<Delete>', self.delete)
        master.bind('<BackSpace>', self.back)
        master.bind('<Return>', self.equals)
        master.bind('<Insert>', self.add_answer)

        messagebox.showinfo("Guide", "Key bindings include: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ., +, -, *, /, (, ), Enter, Backspace, Insert and Delete.")

if __name__ == '__main__':
    root = Tk()
    calculator = GUI(root)
    root.mainloop()
从tkinter导入*
从tkinter.ttk导入*
来自tkinter导入消息框#由@martineau添加
类逻辑:
def add_数字(自身,*参数):
如果类型(args[0])==str:
self.expression.append(args[0])
其他:
self.expression.append(args[0].char)
self.labels[1].config(text=”“.join(self.expression))
def添加_操作(自身,*args):
如果类型(args[0])==str:
self.expression.append(args[0])
其他:
self.expression.append(args[0].char)
self.labels[1].config(text=”“.join(self.expression))
def添加_答案(自身,*参数):
self.expression.extend(列表(self.labels[0]['text']))
self.labels[1].config(text=”“.join(self.expression))
def delete(self,*args):
如果自我表现:
self.expression=list()
self.labels[1].config(text=”“.join(self.expression))
其他:
self.labels[0]。配置(text=”“)
def返回(自身,*参数):
self.expression=self.expression[:-1]
self.labels[1].config(text=”“.join(self.expression))
def等于(self,*args):
等式=列表()
编号=列表()
如果不是自我表达:
self.labels[0]。配置(文本=“”)
对于自我表达的价值:
如果self.numpad_文本中的值:
数字。追加(值)
其他:
如果编号:
表达式.append(str(float(“.join(number)))
编号=列表()
等式.附加(值)
如果编号:
尝试:
表达式.append(str(float(“.join(number)))
除值错误外:
showerror(“错误”,“语法错误:您的表达式的语法不正确”)
对于范围内的i(len(方程)):
如果方程[i]='('和i!=0:
如果方程[i-1]不在自运算中:
公式。插入(i,“*”)
elif方程[i]==')'和i!=len(方程式)-1:
如果方程[i+1]不在自运算中:
公式.插入(i+1,“*”)
如果公式:
尝试:
self.labels[0].config(text=str(eval(“”.join(等式)))
除零误差外:
showerror(“错误”,“零除法错误:您的表达式被零除法”)
除SyntaxError外:
showerror(“错误”,“语法错误:您的表达式的语法不正确”)
类GUI(逻辑):
numpad_文本=('7','8','9','4','5','6','1','2','3','0','Equals')
操作文本=(“/”、“*”、“-”、“+”、“(“,”)”
函数_text=('Delete','Back')
定义初始(自我,主):
主标题(“计算器”)
self.expression=list()
self.label\u frame=帧(主)
self.label\u frame.grid(columnspan=2)
self.labels=list()
对于范围(2)中的i:
self.labels.append(标签(self.Label_框架))
self.labels[i].grid(行=i,列=0,列span=4)
self.labels[0]。绑定(“,self.add\u-answer)
self.numpad_frame=帧(主帧)
self.numpad_frame.grid(行=1,行跨度=2)
self.numpad_按钮=列表()
对于范围内的i(len(self.numpad_文本)):
self.numpad_按钮.append(按钮(self.numpad_框架,text=self.numpad_文本[i],command=lambda i=i:self.add_数字(self.numpad_文本[i]))
self.numpad_按钮[i].grid(行=i//3,列=i%3)
如果self.numpad_文本!=11:
master.bind(self.numpad\u文本[i],self.add\u数字)
self.numpad_按钮[-1].config(命令=self.equals)
self.operations\u frame=帧(主)
self.operations\u frame.grid(行=1,列=1)
self.operation_按钮=列表()
对于范围内的i(len(自操作文本)):
self.operation\u buttons.append(按钮(self.operations\u框架,text=self.operation\u文本[i],command=lambda i=i:self.add\u操作(self.operation\u文本[i]))
self.operation\u按钮[i]。网格(行=i//2,列=i%2)
master.bind(self.operation\u text[i],self.add\u操作)
self.functions\u frame=帧(主)
self.functions\u frame.grid(行=2,列=1)
self.function_按钮=列表()
对于范围内的i(len(self.function_text)):
self.function\u buttons.append(按钮(self.functions\u框架,text=self.function\u文本[i]))
self.function_按钮[i]。网格(行=0,列=i%2)
self.function_按钮[0]。配置(命令=self.delete)
self.function_按钮[1].config(命令=self.back)
master.bind(“”,self.delete)
主绑定(“”,self.back)
主绑定(“”,self.equals)
主绑定(“”,self.add\u-response)
showinfo(“指南”,“键绑定包括:1,2,3,4,5,6,7,8,9,0,,,,+,-,*,/,(,),回车,退格,插入和删除。”)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
root=Tk()
计算器=GUI(根)
root.mainloop()

Tkinters messagebox需要单独导入:

来自tkinter导入消息框

然后在绑定消息行下方添加以下内容
def message():
    messagebox.showinfo("Guide", "Key bindings include: 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, ., +, -, *, /, (, ), Enter, Backspace, Insert and Delete.")
if __name__ == '__main__':
    root = Tk()
    calculator = GUI(root)
    root.after_idle(message)
    root.mainloop()