54

我是一名 Python 初学者,在 MacOS 上运行。

我正在 tkinter 中使用文本解析器 GUI 制作一个程序,您在Entry小部件中键入命令,然后点击Button小部件,这会触发我的parse()功能等,将结果打印到Text小部件,文本冒险风格。

> 绕过按钮

我不能让你那样做,戴夫。

我试图找到一种方法来摆脱Button每次用户发出命令时都需要将鼠标拖到的需要,但这比我想象的要难。

我猜正确的代码是什么样的self.bind('<Return>', self.parse())?但我什至不知道该放在哪里。root, __init__, parse(), 并且create_widgets()不想要它。

需要明确的是,任何人都应该在 prog 中按 enter 的唯一原因是触发parse(),因此不需要Entry专门支持小部件。它工作的任何地方都很好。

针对7stud,基本格式:

from tkinter import *
import tkinter.font, random, re

class Application(Frame):
    
    def __init__(self, master):
        Frame.__init__(self, master, ...)
        self.grid()
        self.create_widgets()
        self.start()

        
    def parse(self):
        ...


    def create_widgets(self):
        
        ...

        self.submit = Button(self, text= "Submit Command.", command= self.parse, ...)
        self.submit.grid(...)

        
root = Tk()
root.bind('<Return>', self.parse)

app = Application(root)

root.mainloop()
4

3 回答 3

72

尝试运行以下程序。你只需要确保你的窗口在你点击 Return 时有焦点——为了确保它确实如此,首先点击按钮几次直到你看到一些输出,然后不点击任何其他地方点击 Return。

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")
root.bind('<Return>', func)

def onclick():
    print("You clicked the button")

button = tk.Button(root, text="click me", command=onclick)
button.pack()

root.mainloop()

然后你只需在创建button clickhitting Return调用同一个函数时稍微调整一下——因为命令函数需要是一个不带参数的函数,而绑定函数需要是一个带一个参数的函数(事件对象):

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")

def onclick(event=None):
    print("You clicked the button")

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

button = tk.Button(root, text="click me", command=onclick)
button.pack()

root.mainloop()

或者,您可以放弃使用按钮的命令参数,而是使用 bind() 将 onclick 函数附加到按钮,这意味着该函数需要一个参数——就像 Return 一样:

import tkinter as tk

root = tk.Tk()
root.geometry("300x200")

def func(event):
    print("You hit return.")

def onclick(event):
    print("You clicked the button")

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

button = tk.Button(root, text="click me")
button.bind('<Button-1>', onclick)
button.pack()

root.mainloop()

这是在课堂设置中:

import tkinter as tk

class Application(tk.Frame):
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("300x200")

        tk.Frame.__init__(self, self.root)
        self.create_widgets()

    def create_widgets(self):
        self.root.bind('<Return>', self.parse)
        self.grid()

        self.submit = tk.Button(self, text="Submit")
        self.submit.bind('<Button-1>', self.parse)
        self.submit.grid()

    def parse(self, event):
        print("You clicked?")

    def start(self):
        self.root.mainloop()


Application().start()
于 2013-06-08T05:39:23.763 回答
24

另一种选择是使用 lambda:

ent.bind("<Return>", (lambda event: name_of_function()))

完整代码:

from tkinter import *
from tkinter.messagebox import showinfo

def reply(name):
    showinfo(title="Reply", message = "Hello %s!" % name)


top = Tk()
top.title("Echo")

Label(top, text="Enter your name:").pack(side=TOP)
ent = Entry(top)
ent.bind("<Return>", (lambda event: reply(ent.get())))
ent.pack(side=TOP)
btn = Button(top,text="Submit", command=(lambda: reply(ent.get())))
btn.pack(side=LEFT)

top.mainloop()

如您所见,使用未使用的变量“event”创建 lambda 函数可以解决问题。

于 2013-09-29T15:03:16.180 回答
1

我发现使用绑定的一个好处是您可以了解触发事件:由于下面的代码,您可以使用 event = [ButtonPress event state=Mod1 num=1 x=43 y=20] 进行点击:

self.submit.bind('<Button-1>', self.parse)
def parse(self, trigger_event):
        print("You clicked with event = {}".format(trigger_event))

比较以下两种编码按钮单击的方式:

btn = Button(root, text="Click me to submit", command=(lambda: reply(ent.get())))
btn = Button(root, text="Click me to submit")
btn.bind('<Button-1>', (lambda event: reply(ent.get(), e=event)))
def reply(name, e = None):
    messagebox.showinfo(title="Reply", message = "Hello {0}!\nevent = {1}".format(name, e))

第一个是使用不带参数的命令函数,因此不可能传入事件。第二个是一个绑定函数,它可以接受一个事件传入并打印类似“Hello Charles!event = [ButtonPress event state=Mod1 num=1 x=68 y=12]”的内容

我们可以左键单击、中键单击或右键单击鼠标,分别对应事件编号 1、2 和 3。代码:

btn = Button(root, text="Click me to submit")
buttonClicks = ["<Button-1>", "<Button-2>", "<Button-3>"]
for bc in buttonClicks:
    btn.bind(bc, lambda e : print("Button clicked with event = {}".format(e.num)))

输出:

Button clicked with event = 1
Button clicked with event = 2
Button clicked with event = 3
于 2020-02-29T02:23:13.933 回答