python:如何在 for 循环中等待弹出窗口中的用户输入 windows
python: how to wait in a for loop for user inputs in popup windows
我想登录一个网页3次如下。
- 按下“按钮 1”
- 登录window弹出然后输入ID和PW并按“输入”按钮
- 做点什么
- 重复 #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
参数,就不会遇到任何问题。
我想登录一个网页3次如下。
- 按下“按钮 1”
- 登录window弹出然后输入ID和PW并按“输入”按钮
- 做点什么
- 重复 #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
参数,就不会遇到任何问题。