在传递Tkinter值到变量时遇到问题

0 投票
2 回答
59 浏览
提问于 2025-04-13 17:54

我的tk部分获取了用户输入的文本(string1、string2、string3和string4),但是没有把这些文本传递到我程序的主部分的4个变量中。虽然会提示输入文本,但按钮没有关闭,打印语句也没有执行。

我尝试过一个更简单的版本,只有3个文本输入,能够在主程序中打印出来。

def get_user_inputs():
    #Prompts user for four strings, stores them in variables, and returns them.
    root = Tk()
    root.title("Enter Four Strings")

    # String variables to store user input
    string_var1 = StringVar()
    string_var2 = StringVar()
    string_var3 = StringVar()
    string_var4 = StringVar()

    # Labels and entry fields
    label1 = Label(root, text="Enter string 1:")
    label1.pack()
    entry1 = Entry(root, textvariable=string_var1)
    entry1.pack()

    label2 = Label(root, text="Enter string 2:")
    label2.pack()
    entry2 = Entry(root, textvariable=string_var2)
    entry2.pack()

    label3 = Label(root, text="Enter string 3:")
    label3.pack()
    entry3 = Entry(root, textvariable=string_var3)
    entry3.pack()

    label4 = Label(root, text="Enter string 4:")
    label4.pack()
    entry4 = Entry(root, textvariable=string_var4)
    entry4.pack()

    # Button to retrieve input
    def get_and_close():
        string1 = string_var1.get()
        string2 = string_var2.get()
        string3 = string_var3.get()
        string4 = string_var4.get()
        return string1, string2, string3, string4  # Removed root.destroy() from here?

    button = Button(root, text="Enter", command=get_and_close)
    button.pack()

# Main event loop (after button definition)
    root.mainloop()  # Start event loop and wait for user input

# Retrieve user input after window closes
    return get_and_close()  # Call the get_and_close function

# Main program (outside the function)
string1, string2, string3, string4 = get_user_inputs()  # Get user input

# assign text values to variables
date_range_dor= string1
output_filename = string2
post_filename = string3 
post_filedate = string4

print("Date Range: ",date_range_dor)
print("Output Summary filename: ",output_filename)
print("Output POST filename: ",post_filename)
print("POST date variable: ",post_filedate)

2 个回答

0

你需要使用 global 变量来定义 string1, string2, string3, string4。另外,当你按下 Enter 键时,要用 root.destroy() 来关闭窗口。按钮的命令函数应该修改这些全局变量,而不是返回收集到的变量,因为返回值在其他地方并没有被使用。这些全局变量需要传递给 get_user_inputs()get_and_close() 函数,以便这些函数可以修改它们。下面是我修改后的代码,它对我来说是有效的:

def get_user_inputs():
    #Prompts user for four strings, stores them in variables, and returns them.
    root = tk.Tk()
    root.title("Enter Four Strings")

    global string1,string2, string3, string4

    # String variables to store user input
    string_var1 = StringVar()
    string_var2 = StringVar()
    string_var3 = StringVar()
    string_var4 = StringVar()

    # Labels and entry fields
    label1 = Label(root, text="Enter string 1:")
    label1.pack()
    entry1 = Entry(root, textvariable=string_var1)
    entry1.pack()

    label2 = Label(root, text="Enter string 2:")
    label2.pack()
    entry2 = Entry(root, textvariable=string_var2)
    entry2.pack()

    label3 = Label(root, text="Enter string 3:")
    label3.pack()
    entry3 = Entry(root, textvariable=string_var3)
    entry3.pack()

    label4 = Label(root, text="Enter string 4:")
    label4.pack()
    entry4 = Entry(root, textvariable=string_var4)
    entry4.pack()

    # Button to retrieve input
    def get_and_close():
        global string1,string2, string3, string4
        string1 = string_var1.get()
        string2 = string_var2.get()
        string3 = string_var3.get()
        string4 = string_var4.get()
        root.destroy()
        #return string1, string2, string3, string4  # Removed root.destroy() from here?. 
        #Commented out this return statement as the return values are not captured anywhere
        
    
    button = Button(root, text="Enter", command=get_and_close)
    button.pack()

# Main event loop (after button definition)
    root.mainloop()  # Start event loop and wait for user input
        
#Retrieve user input after window closes
    return string1, string2, string3, string4 #Return the modified values
    #return get_and_close()  # Call the get_and_close function

#Main program (outside the function)
string1 = string2 = string3 = string4=None #initializing the variables with global scope
string1, string2, string3, string4 = get_user_inputs()  # Get user input

# assign text values to variables
date_range_dor= string1
output_filename = string2
post_filename = string3 
post_filedate = string4

print("Date Range: ",date_range_dor)
print("Output Summary filename: ",output_filename)
print("Output POST filename: ",post_filename)
print("POST date variable: ",post_filedate)

这是窗口和控制台的样子:

窗口:

这里输入图片描述

控制台:

这里输入图片描述

希望这能帮到你!

1

程序能够获取用户输入的文本(比如string1、string2、string3和string4),但是这些输入并没有传递到我程序的主要部分的四个变量里。虽然程序会提示用户输入文本,但按钮没有关闭,打印的内容也没有执行。

这个问题是可以解决的。

  • date_range_doroutput_filenamepost_filenamepost_filedate 以及其他打印语句放到 get_and_close() 函数里面。
  • get_and_close() 函数里添加 root.afterroot.destroy
  • 在最后调用 get_user_inputs() 函数。

代码片段

    # Button to retrieve input
    def get_and_close():
        string1 = string_var1.get()
        string2 = string_var2.get()
        string3 = string_var3.get()
        string4 = string_var4.get()
         
        date_range_dor = string1
        output_filename = string2
        post_filename = string3 
        post_filedate = string4

        print(f"Date Range: {string1}")
        print(f"Output Summary filename: {string2}")
        print(f"Output POST filename: {string3}")
        print(f"POST date variable: {string4}")
        
        root.after(1000, root.destroy)         
        return string1, string2, string3, string4  # Removed root.destroy() from here?          
    
    button = tk.Button(root, text="Enter", command=get_and_close)
    button.pack()
    
get_user_inputs()

一秒钟后,窗口会关闭。

截图:

在这里输入图片描述

撰写回答