两个函数“greet_user”和“display_message_random”没有被单独调用

问题描述 投票:0回答:1

我是一个Python初学者,我正在尝试制作一个简单的应用程序,其中弹出一个简单的GUI窗口,程序要求用户输入他们的名字,然后单击“问候我!”按钮,程序应该显示问候语,然后在随机时间间隔后显示激励消息,在本例中为 1 到 2 分钟。

第一部分效果很好,GUI 窗口弹出,我可以输入名称并按下按钮,但然后什么也没有发生 - 但是如果我等待 1 到 2 分钟,问候语最终会与激励消息一起显示。相反,我希望它首先显示问候语,然后在 1 到 2 分钟后显示随机的激励消息。我使用 pycharm 作为我的 IDE。这是完整的代码:

import time
import random
import tkinter

messages = [
    "You're doing great. Keep it up!",
    "Let's keep working. No time to waste!",
    "Don't stop now! There's still work to do.",
    "Keep up the good work! You're killing it!",
    "Don't get distracted. Stay focused!"
]

def display_message_random(label):
    while True:
        delay_in_minutes = random.randint(1, 2)
        delay_in_seconds = delay_in_minutes * 60
        time.sleep(delay_in_seconds)
        selected_message = random.choice(messages)
        label.config(text=selected_message)
        root.update()

# Creates the main pop up window
root = tkinter.Tk()
root.title("Albi - Your Productivity Pal!")

# Get user name (in the GUI)
user_name_label = tkinter.Label(root, text="Hi! Hope you're doing well. I'm Albi. What's your name?\n")
user_name_label.pack()

user_name_entry = tkinter.Entry(root)
user_name_entry.pack()

def greet_user():
    user_name = user_name_entry.get()
    greeting_label = tkinter.Label(root, text="Nice to meet you " + user_name + "!\n" + "I hope you have a productive session!")
    greeting_label.pack()
    user_name_label.destroy()  # Remove the user name prompt after greeting
    user_name_entry.destroy()  # Remove the entry field after greeting
    display_message_random(label)  # Start displaying messages

greet_button = tkinter.Button(root, text="Greet Me!", command=greet_user)
greet_button.pack()

# Label to display messages
label = tkinter.Label(root, text="", font=("Arial", 14))
label.pack()

# Start the main event loop - calls the function
root.mainloop() 

我尝试将第二个函数放在该函数之前,不知怎的,我设法让问候语显示出来,但随机消息永远不会显示。

我对 Python 很陌生,所以请向我解释一下问题是什么,我才 5 岁。我非常感谢任何帮助。谢谢!

python python-3.x
1个回答
0
投票

看起来您没有使用时间库,因此您可以毫无问题地删除它。

首先,您应该在代码中更早地定义 Label,因为您需要它来用于greet_user()函数,并且您在greet_button代码中使用greet_user()。所以你需要在此之前定义标签。

其次,您应该重新配置等待系统,以便 while 循环有办法结束。您可以使用 .after() 方法。

试试这个

import random
import tkinter

messages = [
    "You're doing great. Keep it up!",
    "Let's keep working. No time to waste!",
    "Don't stop now! There's still work to do.",
    "Keep up the good work! You're killing it!",
    "Don't get distracted. Stay focused!"
]

def display_message_random(label):
    delay_in_minutes = random.randint(1, 2)
    delay_in_seconds = delay_in_minutes * 60
    selected_message = random.choice(messages)
    label.config(text=selected_message)
    root.update()
    root.after(delay_in_seconds * 1000, display_message_random, label)

# Creates the main pop up window
root = tkinter.Tk()
root.title("Albi - Your Productivity Pal!")

# Label to display messages
label = tkinter.Label(root, text="", font=("Arial", 14))
label.pack()

# Get user name (in the GUI)
user_name_label = tkinter.Label(root, text="Hi! Hope you're doing well. I'm Albi. What's your name?\n")
user_name_label.pack()

user_name_entry = tkinter.Entry(root)
user_name_entry.pack()

def greet_user():
    user_name = user_name_entry.get()
    greeting_label = tkinter.Label(root, text="Nice to meet you " + user_name + "!\n" + "I hope you have a productive session!")
    greeting_label.pack()
    user_name_label.destroy()  # Remove the user name prompt after greeting
    user_name_entry.destroy()  # Remove the entry field after greeting
    display_message_random(label)  # Start displaying messages

greet_button = tkinter.Button(root, text="Greet Me!", command=greet_user)
greet_button.pack()

# Start the main event loop
root.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.