在传递Tkinter值到变量时遇到问题
我的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_dor
、output_filename
、post_filename
、post_filedate
以及其他打印语句放到get_and_close()
函数里面。 - 在
get_and_close()
函数里添加root.after
和root.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()
一秒钟后,窗口会关闭。
截图: