python:如何在 for 循环中等待弹出窗口中的用户输入 windows

python: how to wait in a for loop for user inputs in popup windows

我想登录一个网页3次如下。

  1. 按下“按钮 1”
  2. 登录window弹出然后输入ID和PW并按“输入”按钮
  3. 做点什么
  4. 重复 #2 和 3 三遍。

我一直坚持让代码等待用户按下“Enter”按钮。

我是 python 的新手。任何评论都会有很大帮助。

from tkinter import *
from tkinter import ttk  
import time

root = Tk()
root.geometry('400x500')


# functions ----------------------------------
def popup():
    global pop
    pop= Toplevel(root)
    pop.title('Login')
    pop.geometry('450x100')
  
    global me
    fr1=Frame(pop)
    fr1.pack(pady=5)
    
    lbl1=Label(fr1, text='ID :', font=20)
    lbl1.grid(row=1, column=1,pady=7)
    e1 = Entry(fr1, width=15,font=(25))
    e1.grid(row=1, column=2)
    
    lbl2=Label(fr1, text='PW :', font=20)
    lbl2.grid(row=2, column=1)
    e2 = Entry(fr1, width=15,font=(25))
    e2.grid(row=2, column=2)
    
    btn1 = Button(fr1, text='Enter',width=10, font=20)
    btn1.grid(row=1, column=3, rowspan=2, sticky=N+E+W+S, padx=10, pady=10) 


def  button_():      
    for i in [1,2,3]: 
        popup() 
        

bt1=Button(root, text='button1', command=button_)
bt1.pack(pady=10)


root.mainloop()

============================================= =====

谢谢大家。我终于得到了我想要的。 我采用了 Sujay 的逻辑,希望这对那些可能有同样问题的人有所帮助。

import tkinter as tk
from tkinter import ttk  
import time


# functions ----------------------------------

# 0 I don't understand this part but it still works without this.
# Force you to pass in the master argument when creating widgets:
# tk._support_default_root = False
#----------------------------------------------------------------

def popup():
    global pop   
    pop = tk.Tk()       # 1. <-- pop= Toplevel(root)
    pop.title('Login')
    pop.geometry('450x100')

    fr1=Frame(pop)
    fr1.pack(pady=5)
    
    lbl1=Label(fr1, text='ID :', font=20)
    lbl1.grid(row=1, column=1,pady=7)
    e1 = Entry(fr1, width=15,font=(25))
    e1.grid(row=1, column=2)
    
    lbl2=Label(fr1, text='PW :', font=20)
    lbl2.grid(row=2, column=1)
    e2 = Entry(fr1, width=15,font=(25))
    e2.grid(row=2, column=2)
    
    btn1 = Button(fr1, text='Enter',width=10, font=20)
    btn1.grid(row=1, column=3, rowspan=2, sticky=N+E+W+S, padx=10, pady=10) 
    

    # 2.---------------------------------------------
    # Wait until there is only 1 window left open
    pop.mainloop(1)
    #---------------------------------------------
    
def  button_():
    for i in range(3):
        popup()

root = tk.Tk()
root.geometry('400x500')

bt1=tk.Button(root, text='button1', command=button_)
bt1.pack(pady=10)



# Wait until all windows have been closed
root.mainloop()

如您所见,代码#1、#2 解决了我的问题。 但我仍然不明白#1 为什么有效以及#0 是什么意思。

您可以做的是检查弹出窗口 window 是否已被打开 3 次。

from tkinter import *
from tkinter import ttk  
import time

root = Tk()
root.geometry('400x500')


# functions ----------------------------------
def popup():
    global pop
    pop= Toplevel(root)
    pop.focus_force()
    pop.grab_set()
    pop.title('Login')
    pop.geometry('450x100')
  
    global me
    fr1=Frame(pop)
    fr1.pack(pady=5)
    
    lbl1=Label(fr1, text='ID :', font=20)
    lbl1.grid(row=1, column=1,pady=7)
    e1 = Entry(fr1, width=15,font=(25))
    e1.grid(row=1, column=2)
    
    lbl2=Label(fr1, text='PW :', font=20)
    lbl2.grid(row=2, column=1)
    e2 = Entry(fr1, width=15,font=(25))
    e2.grid(row=2, column=2)
    
    btn1 = Button(fr1, text='Enter',command=button_,width=10, font=20)
    btn1.grid(row=1, column=3, rowspan=2, sticky=N+E+W+S, padx=10, pady=10) 

done=1
def  button_():      
    global done
    if done==3:
        pop.destroy()
    else: 
        done+=1
        pop.destroy()
        popup()
        

bt1=Button(root, text='button1', command=popup)
bt1.pack(pady=10)


root.mainloop()

尝试这样的事情:

import tkinter as tk
from tkinter import ttk  
import time

# Force you to pass in the master argument when creating widgets:
tk._support_default_root = False

def popup():
    global pop_window
    pop_window = tk.Tk()
    pop_window.geometry("200x100")

    entry = tk.Entry(pop_window)
    entry.pack()
    
    button = tk.Button(pop_window, text="Enter", command=pop_window.destroy)
    button.pack()

    # Wait until there is only 1 window left open
    pop_window.mainloop(1)

def button_():
    global done
    if done:
        done = False
        for i in range(3):
            popup()
        done = True

done = True

root = tk.Tk()
root.geometry("200x200")

button = tk.Button(root, text="Click me", command=button_)
button.pack()

# Close the program when the main window is destroyed:
# Instead here you can call a function that sets `done` to `True`,
# Closes the main window as well as the `pop_window` if it exists
root.protocol("WM_DELETE_WINDOW", exit)

# Wait until all windows have been closed
root.mainloop()

它使用 Tk() 的多个实例并等待直到只有 1 个 window 保持打开状态,然后再继续 for 循环。这是使用:pop_window.mainloop(1)

它使用多个 Tk() 实例,因此您在创建 StringVar/IntVar/.../PhotoImage 时需要小心。只要在创建这些变量时始终传入 master 参数,就不会遇到任何问题。