首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在KeyRelease函数Tkinter中传递另一个参数

在KeyRelease函数Tkinter中传递另一个参数
EN

Stack Overflow用户
提问于 2021-09-10 16:34:14
回答 1查看 38关注 0票数 0

我想要检查每个按钮释放的输入,但是我想要比较的输入值是不断变化的。我怎么做才能在"check“函数中传递另一个参数来修复它呢?

代码语言:javascript
复制
def check(event:tkinter.Event=None, ans #<== Won't work) -> None:
    if Text.get("0.0", "end").strip() == str(ans):
        check_val = True

while True:
    master = Tk()
    master.title("Math")
    master.geometry('400x400')

    eq = generate_equation(stage=current_stage)
    ans = calc(eq) 
    Label(master=master,text=f"score: {score}").grid(row=0,column=2,sticky=W)
    Label(master=master, text=f"{q_num}: {eq}").grid(row=0,column=0 ,sticky=W)

    inputtxt = tkinter.Text(master=master,height = 5, width = 20)
    inputtxt.bind("<KeyRelease>",check)
    inputtxt.grid()
        
    if check_val:
        score += 10
        q_num += 1

        if score % 100 == 0:
            current_stage += 1

    else:
        inputtxt.grid()
        inputtxt.delete(1.0,END)

    user_input = ""
    mainloop()
EN

回答 1

Stack Overflow用户

发布于 2021-09-10 21:37:50

问题的解决方案(如TheLizzard对该问题的评论中所述)是在将check()绑定到"<KeyRelease>"时使用lambda语句向其传递额外的参数。

注意您是如何在while循环中运行所有代码的:除非您希望窗口一次又一次地弹出,否则这是没有必要的,因为root.mainloop()会为您运行该循环。变量只需要定义一次,除非您要更改它们。因此,您可以删除while循环。

此外,引用前面有或没有"tkinter“的tkinter属性,如tkinter.TextLabel。因为LabelText都是tkinter模块的一部分,所以您必须同时使用import tkinterfrom tkinter import *。通配符导入(使用from module import * )通常是不被鼓励的。只需使用import tkinter,并在tkinter属性前面使用"tkinter“;在本例中,使用tkinter.Labeltkinter.Tk而不是LabelTk

下面是您的代码在进行这些更改后的样子:

代码语言:javascript
复制
import tkinter

def check(ans, text, event=None):
    if text.get("0.0", "end").strip() == str(ans):
        check_val = True

    if check_val:
        score += 10
        q_num += 1

        if score % 100 == 0:
            current_stage += 1

    else:
        inputtxt.grid()
        inputtxt.delete(1.0,END)

master = tkinter.Tk()
master.title("Math")
master.geometry('400x400')

eq = generate_equation(stage=current_stage)
ans = calc(eq) 
tkinter.Label(master=master, text=f"score: {score}").grid(row=0, column=2, sticky=W)
tkinter.Label(master=master, text=f"{q_num}: {eq}").grid(row=0, column=0, sticky=W)

inputtxt = tkinter.Text(master=master, height=5, width=20)
inputtxt.bind("<KeyRelease>", lambda event, ans=ans, text=inputtxt: check(ans, text))
inputtxt.grid()

user_input = ""
master.mainloop()

注意我是如何将if check_val...代码放在check()函数中的。我假设你想要重复检查这个值。如果没有,只需将代码移回原来的位置即可。

另一个变化是:我将inputtext作为参数传递给inputtxt.bind("<KeyRelease>"...行中的check()。这是因为我注意到您试图在一个不存在的Text小部件中获取文本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69135337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档