Python Tkinter返回键绑定不';由于班级结构,我不能工作

Python Tkinter返回键绑定不';由于班级结构,我不能工作,python,tkinter,bind,Python,Tkinter,Bind,我知道如何在一个简单的框架上绑定关键点,但由于我以不同的方式构建了我的应用程序,我似乎不知道如何绑定返回键来按下按钮或运行按钮绑定到的功能。我一直在网站上搜索其他人提出的类似问题,但我没有找到与我类似的问题 我已经调低了代码的其余部分,如下所示: import tkinter as tk from tkinter import * class POS(tk.Tk): def __init__(self,*args,**kwargs): tk.Tk.__init__(se

我知道如何在一个简单的框架上绑定关键点,但由于我以不同的方式构建了我的应用程序,我似乎不知道如何绑定返回键来按下按钮或运行按钮绑定到的功能。我一直在网站上搜索其他人提出的类似问题,但我没有找到与我类似的问题

我已经调低了代码的其余部分,如下所示:

import tkinter as tk
from tkinter import *

class POS(tk.Tk):
    def __init__(self,*args,**kwargs):
        tk.Tk.__init__(self, *args, **kwargs)

        container = tk.Frame(self)
        container.pack(side = "top", fill = "both", expand = True)

        container.grid_rowconfigure(0, weight = 1)
        container.grid_columnconfigure(0, weight = 1)

        self.frames = {}

        for F in (ErrorPage, MainPage):
            frame = F(container, self)
            self.frames[F] = frame
            frame.grid(row=0, column = 0, sticky = "nsew")

        self.show_frame(MainPage)

    def show_frame(self,cont):
        frame = self.frames[cont]
        frame.tkraise() 


class MainPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        frame = tk.Frame(self)
        frame.pack(fill = BOTH)

        button = Button(frame, text = "OK", command = self.bindHello)
        button.pack(pady=5, padx=10)

        frame.bind("<Return>", self.bindHello)
        self.bind("<Return>", self.bindHello)

    def bindHello(self, event=None):
        print("HELLO1")


#Yes this doesn't do anything but I need it for the frame container as set before
class ErrorPage(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self,parent)
        frame = tk.Frame(self)
        frame.pack(fill = BOTH)

        button = Button(frame, text = "OK", command = self.bindHello)
        button.pack(pady=5, padx=10)

        frame.bind("<Return>", self.bindHello)

    def bindHello(self, event=None):
        print("HELLO2")


app = POS()
app.mainloop()
将tkinter作为tk导入
从tkinter进口*
类别位置(tk.tk):
定义初始化(self,*args,**kwargs):
tk.tk.\uuuuu初始化(self,*args,**kwargs)
容器=tk.框架(自身)
container.pack(side=“top”,fill=“both”,expand=True)
container.grid_rowconfigure(0,权重=1)
container.grid\u column配置(0,权重=1)
self.frames={}
对于F in(错误页,主页):
框架=F(容器,自身)
self.frames[F]=帧
frame.grid(行=0,列=0,sticky=“nsew”)
self.show_框架(主页)
def显示画面(自身,续):
帧=自身帧[续]
frame.tkraise()
类主页面(tk.Frame):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
框架=传统框架(自身)
框架包装(填充=两个)
按钮=按钮(框,text=“OK”,command=self.bindHello)
按钮组(pady=5,padx=10)
frame.bind(“,self.bindHello)
self.bind(“,self.bindHello)
def bindHello(自身,事件=无):
打印(“HELLO1”)
#是的,这没有做任何事情,但我需要它的框架容器设置之前
类错误页(tk.Frame):
定义初始化(自、父、控制器):
tk.Frame.\uuuu init\uuuuu(自,父)
框架=传统框架(自身)
框架包装(填充=两个)
按钮=按钮(框,text=“OK”,command=self.bindHello)
按钮组(pady=5,padx=10)
frame.bind(“,self.bindHello)
def bindHello(自身,事件=无):
打印(“HELLO2”)
app=POS()
app.mainloop()
简单的按钮绑定我原本打算如下所示:

from tkinter import *
master = Tk()

def callback(event=None):
    print("Hello " + entry.get())

entry = StringVar()
e = Entry(master, textvariable = entry, width = 15)
e.pack()

b = Button(master, text="OK", command = callback)
b.pack()
master.bind("<Return>", callback)

mainloop()
从tkinter导入*
master=Tk()
def回调(事件=无):
打印(“Hello”+entry.get())
entry=StringVar()
e=条目(主控,文本变量=条目,宽度=15)
e、 包()
b=按钮(主控,text=“OK”,命令=回调)
b、 包()
master.bind(“,回调)
mainloop()

我只想有一个简单的按钮绑定像上面的一个,但我似乎找不到一个方法让我的主程序工作。我想这是因为我构建应用程序的方式,但我不能完全确定。

在您的示例中,您绑定到窗口本身。您也可以通过多种方式在另一种方式中执行此操作:

#1 bind to page object's direct parent, which happens to be a Toplevel-like
#self.master.bind('<Return>', self.bindHello)

#2 recursively search page object's parents, and bind when it's a Toplevel-like
#self.winfo_toplevel().bind('<Return>', self.bindHello)

#3 bind to page object's inner frame's parent's parent, which happens to be a Toplevel-like
#frame.master.master.bind('<Return>', self.bindHello)

#4 recursively search page object's inner frame's parents, and bind when it's a Toplevel-like
frame.winfo_toplevel().bind('<Return>', self.bindHello)
#1绑定到页面对象的直接父对象,该父对象恰巧是顶级对象,类似于
#self.master.bind(“”,self.bindHello)
#2递归搜索页面对象的父对象,并在它是顶级对象时进行绑定
#self.winfo_toplevel().bind(“”,self.bindHello)
#3绑定到页面对象的内部框架的父对象的父对象,该父对象的父对象恰巧是顶级的
#frame.master.master.bind(“”,self.bindHello)
#4递归搜索页面对象的内部框架的父对象,并在其为顶级时绑定,如
frame.winfo_toplevel().bind(“”,self.bindHello)

欢迎来到SO!请拿着这本书,读一读,为什么你认为它不起作用?它在做什么,这与你期望的有什么不同?您是否知道默认情况下帧不会获得键盘焦点?很抱歉,回复太晚。我不完全确定它为什么不工作,但我认为这与我如何引用父函数/小部件有关。我尝试过其他绑定密钥的方法,但并没有获得太多成功。在我的实际程序中,我有一个带有按钮的输入框,当用户在框中输入完任何内容并按下“回车”键时,它将进入下一个命令。另外,我不知道框架没有默认的键盘焦点,我会再看一看。@Miggy请提供一种方法,可以将框架绑定到您想要的行为方式。我们无法准确地猜出你在想什么。@我添加了一个按钮绑定,我想在我共享的第一个代码集中模仿它。这只是一个简单的按钮绑定,其中输入框中的值被获取并打印出来或保存在函数中。我会在有机会时尝试,我想我以前尝试过第一个,但我必须再次检查。谢谢等我测试一下再打给你out@Miggy怎么了?可能将
master
替换为
parent
。我再次尝试了#1,但它没有调用函数,即绑定不起作用。将master更改为parent不起作用,因为parent不是该类的父属性。我认为我的代码与上面的代码有点不同,但是#2肯定可以工作,所以我将使用它。