函数"print"不会在函数之前等待它



在我的Python程序中,我定义了一个函数,如下所示:

def engine_input_number_of_students_and_student_information(self, window):
self.__input.input_number_of_students(self, window)
print(self.number_of_students)

函数CCD_ 1在类Input中定义如下:

class Input:
# Function to ask user to input number of student.
# Print error and force the user to re-input if wrong data is given.
def input_number_of_students(self, engine, window):
sub = tk.Toplevel(master=window)
sub.title("Number of students")
sub.resizable(height=False, width=False)
window.eval(f'tk::PlaceWindow {str(sub)} center')
frm1 = tk.Frame(master=sub)
frm1.grid(row=0, column=0, padx=10, pady=10)
lbl = tk.Label(text="Enter number of students:", master=frm1)
number_of_students_var = tk.StringVar()
ent = tk.Entry(width=3, master=frm1, textvariable=number_of_students_var)
lbl.grid(row=0, column=0, padx=5)
ent.grid(row=0, column=1, padx=5)
frm2 = tk.Frame(master=sub)
frm2.grid(row=1, column=0, sticky="nsew", padx=5, pady=5)
def ok():
number_of_students = int(number_of_students_var.get())
if number_of_students < 0:
messagebox.showinfo(message="Error: number of students must be non-negative")
ent.delete(-1, tk.END)
else:
engine.number_of_students = number_of_students
print(engine.number_of_students)
sub.destroy()
ok_btn = tk.Button(text="OK", master=frm2, command=ok)
ok_btn.pack(ipadx=5, ipady=5)

但是,当我尝试测试程序时,即使我没有为number_of_students输入任何内容,print函数也会被执行(很明显,它会打印0(。我不知道为什么。

您的input_number_of_students不会等待用户输入,它会创建tkinter窗口、输入框和按钮,但不会在任何地方等待用户输入。因此,程序移到下一行,即print行,并打印0

要解决此问题,您需要从回调函数ok调用print或使用wait_variable关键字。

class Input:
# Function to ask user to input number of student.
# Print error and force the user to re-input if wrong data is given.
def input_number_of_students(self, engine, window):
sub = tk.Toplevel(master=window)
sub.title("Number of students")
sub.resizable(height=False, width=False)
window.eval(f'tk::PlaceWindow {str(sub)} center')
frm1 = tk.Frame(master=sub)
frm1.grid(row=0, column=0, padx=10, pady=10)
lbl = tk.Label(text="Enter number of students:", master=frm1)
number_of_students_var = tk.StringVar()
ent = tk.Entry(width=3, master=frm1, textvariable=number_of_students_var)
lbl.grid(row=0, column=0, padx=5)
ent.grid(row=0, column=1, padx=5)
frm2 = tk.Frame(master=sub)
frm2.grid(row=1, column=0, sticky="nsew", padx=5, pady=5)
def ok():
number_of_students = int(number_of_students_var.get())
if number_of_students < 0:
messagebox.showinfo(message="Error: number of students must be non-negative")
ent.delete(-1, tk.END)
else:
engine.number_of_students = number_of_students
print(engine.number_of_students)
sub.destroy()
ok_btn = tk.Button(text="OK", master=frm2, command=ok)
ok_btn.pack(ipadx=5, ipady=5)
#I'm guessing this is the variable you modify?
ok_btn.wait_variable(engine.number_of_students_var)

最新更新