【问题标题】:Tkinter Return key bind doesn't work due to class structure由于类结构,Tkinter Return 键绑定不起作用
【发布时间】:2018-03-02 02:19:19
【问题描述】:

我了解如何在一个简单的框架上绑定键,但由于我以不同的方式构建我的应用程序,我似乎无法弄清楚如何绑定返回键以按下按钮或运行该按钮是有界的。我一直在网站上搜索其他人的类似问题,但我没有找到与我类似的问题。

我已将其余代码调低,并将其放在下面:

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()

我打算按如下方式工作的简单按钮绑定:

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()

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

【问题讨论】:

  • 欢迎来到 SO!请收下tour 并阅读How to Askminimal reproducible example
  • 为什么你认为它不起作用?它在做什么,这与您的预期有何不同?您是否知道默认情况下框架不会获得键盘焦点?
  • 抱歉回复晚了。我不完全确定它为什么不起作用,但我认为这与我如何引用父函数/小部件有关。我尝试了其他绑定密钥的方法,但并没有真正取得太大的成功。在我的实际程序中,我有一个带有按钮的输入框,当用户在输入框上键入任何内容并按下“return”键时,它会转到下一个命令。另外,我不知道框架不是默认的键盘焦点,我会再看一看。
  • @Miggy 请提供您可以绑定到以您想要的方式运行的框架的方式。我们无法可靠地猜测您的想法。
  • @Nae 我添加了一个按钮绑定,我想在我共享的第一个代码集上模仿它。这只是一个简单的按钮绑定,其中输入框中的值被取出并打印出来或保存在函数中。

标签: python tkinter bind


【解决方案1】:

在您的示例中,您绑定到窗口本身。您也可以通过多种方式在另一个中这样做:

#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)

【讨论】:

  • 有机会我会试试的,我想我之前尝试过第一个,但我必须再次检查。谢谢!当我测试它时,我会回复你
  • @Miggy 有什么错误?也许用parent替换master
  • 我再次尝试了#1,但它没有调用该函数,即绑定不起作用。将 master 更改为 parent 不起作用,因为 parent 不是该类没有属性 parent。我认为我的代码与上面的代码有点不同,但 #2 确实有效,所以我会使用那个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2022-01-21
  • 2018-03-05
  • 2017-01-03
相关资源
最近更新 更多