【问题标题】:Tkinter: How to assign two commands to a button via a function?Tkinter:如何通过函数将两个命令分配给按钮?
【发布时间】:2018-06-08 16:53:24
【问题描述】:

我想要创建一个“输入姓名”条目,向用户打印欢迎消息。我最近发布了关于如何在 tkinter 中切换帧的帮助。我想通了,解决了这个问题。

但是,现在我想切换帧在点击按钮时将条目打印到标签。我的代码中没有收到任何错误,但是 returnEntry() 函数没有做任何事情。它不会提升框架,我认为它也不会检索条目文本。(没有returnEntry() 函数,框架确实会提升框架,但使用代码它不会。这是有道理的还是我把事情复杂化了?

代码如下:

def show_frame(frame):
    frame.tkraise()


def returnEntry():
    result=NameEntry.get()
    Label3.config(text=result)

def WelcomeName():
    show_frame(f3)
    returnEntry()


f1 = Frame(root)
f2 = Frame(root)
f3 = Frame(root)
f4 = Frame(root)
for frame in (f1, f2, f3, f4):
    frame.config(width=500,height=500, bg="light blue")
    frame.place(relx=0.5,rely=0.5,anchor="center")


#First Page
Button(f1, text='Click to Play', command=lambda: show_frame(f2)).place(relx=0.5,rely=0.5,anchor="center")
Label(f1, text='Magic 8 Ball', fg="White", bg="dark blue",
      font="Veranda 19").place(relx=0.5,rely=0.20,anchor="center")


#Second page
Label(f2, text='Enter your name:',fg="White", bg="dark blue",
      font="veranda 17").place(relx=0.5,rely=0.40,anchor="center")
NameEntry=Entry(f2,font="veranda 15").place(relx=0.5,rely=0.5,anchor="center")
Button2=Button(f2, text='Continue', font="veranda 15",
       command=lambda: returnEntry).place(relx=0.5,rely=0.60,anchor="center")


#Third Page
Label3=Label(f3,text="",bg="light blue",font="veranda 15").place(relx=0.5,rely=0.35,anchor="center")
Label4=Label(f3, text="Ask me a yes or no question and reveal the truth" , bg="light blue",font="veranda 15")
Label4.place(relx=0.5,rely=0.45,anchor="center")
QuestionEntry=Entry(f3, font="veranda 15").place(relx=0.5,rely=0.52,anchor="center")
Button(f3, text='Ask away', command=lambda: show_frame(f4)).place(relx=0.5,rely=0.6,anchor="center")

对不起,草率的代码等等......

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    你不能。您将必须创建一个调用您想要的两个函数的第三个函数,并将该第三个函数提供给 Button 命令。

    def on_click():
        do_thing_1()
        do_thing_2()
    
    btn = Button(command=on_click)
    

    我强烈建议您远离lambda,直到您知道它是如何工作的。

    另外,您不应该在同一行初始化和布局小部件,这会导致错误。始终使用 2 行。

    # BAD: NameEntry is None, and can't be used
    NameEntry=Entry(f2,font="veranda 15").place(relx=0.5,rely=0.5,anchor="center")
    
    # good: NameEntry is an Entry instance, and can be used later
    NameEntry=Entry(f2,font="veranda 15")
    NameEntry.place(relx=0.5,rely=0.5,anchor="center")
    

    【讨论】:

    • 感谢您的回复,让我变得简单。我已经完成了这些功能,但是除非我将 show_frame(f3) 命令分配给按钮,否则框架仍然不会切换。 def show_frame(frame): frame.tkraise() def returnEntry(): result=NameEntry.get() Label3.config(text=result) def WelcomeName(): show_frame(f3) ReturnEntry()
    • 我敢打赌你得到一个 AttributeError 对吧?因为Label3 是None,不是Label 实例。您需要将定义拆分为 2 行来解决此问题。
    • 我没有收到任何错误!这实际上让整个事情变得更加混乱哈哈。按下按钮 2 时框架 f3 不会上升。很抱歉我是个新手,但这是改进的唯一方法!
    • 哦,在那种情况下,我猜你那里还有那个lambda。参数必须是简单的command=returnEntry
    • 另外,你的 show_frame 函数没用,你可以通过直接调用 tkrasie 来摆脱它和 lambdas。例如:Button(f1, text='Click to Play', command=f2.tkraise)
    猜你喜欢
    • 2016-11-30
    • 2019-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多