将 Tkinter 值传递给变量时出现问题

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

我的 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)
python tkinter
1个回答
0
投票

您必须使用

global
变量来表示
string1, string2, string3, string4
。此外,一旦按
root.destroy()
,您需要使用
Enter
来关闭窗口。 按钮命令函数应该修改全局变量,而不是返回收集的变量,因为命令函数的返回值不会在任何地方访问。这些全局变量需要向下传递给
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)

窗口和控制台的外观如下:

窗户:

控制台:

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.