瞬时输入窗口

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

我有一个系统,其中有一个弹出窗口,请求用户输入,然后将该输入返回到代码主体进行处理。我让窗口正确弹出,使用瞬态确保它保持在顶部,但是我找不到一种方法使窗口将数据返回到调用它的位置。 当前:

from tkinter import *

class LoginWindow(object):
    def __init__(self, parent):
        self.parent=parent
        self.data=None #Default value, to say its not been set yet
        self.root=Toplevel(self.parent)
        self.root.transient(self.parent)
        self.username=Entry(self.root)
        self.password=Entry(self.root, show="*")
        self.ok=Button(self.root, text="Continue", command=self.checkPass); self.ok.grid(row=5, column=2, sticky="ew")
        self.cancel=Button(self.root, text="Cancel", command=self.cancelPass); self.cancel.grid(row=5, column=1, sticky="ew")
        

    def checkPass(self):
        self.data=(self.username.get(), self.password.get())
        self.root.quit()

    def cancelPass(self):
        self.data=False
        self.root.quit()

parent=Tk()
passWindow=LoginWindow(parent)
#....? how do I get passWindow.data from the window, considering it will only be defined 
#to be something besides None once the user has clicked the continue button

我尝试过循环等待

passWindow.data
的值从
None
更改,但这会导致
LoginWindow
不出现,或者脚本锁定。理想情况下,我想保留
transient
在那里,因为它可以防止用户点击窗口,但我知道
transient
是窗口不出现的原因(没有)

有什么想法吗?

python tkinter
1个回答
1
投票

您有点合二为一地问两个问题,一个是关于将值从弹出窗口传递到主窗口,一个是关于

transient
无法正常工作。我对第一个问题的回答如下,对于第二个问题,我真的不知道你遇到的问题是什么。据我所知,
transient
按照您使用的方式工作。


您可以使用

wait_window
让 Tkinter 主循环等待窗口关闭后再继续。如果将弹出窗口创建放在父级主循环启动后调用的函数中,则可以使用
passWindow.wait_window()
“暂停”该函数的进一步执行,然后再继续执行其余行。窗口关闭后,即可在
passWindow.data

中找到所需数据
class LoginWindow(object):
    def __init__(self, parent):
        self.parent=parent
        self.data=None #Default value, to say its not been set yet
        self.root=Toplevel(self.parent)
        self.root.transient(self.parent)
        self.username=Entry(self.root); self.username.pack()
        self.password=Entry(self.root, show="*"); self.password.pack()
        self.ok=Button(self.root, text="Continue", command=self.checkPass); self.ok.pack()
        self.cancel=Button(self.root, text="Cancel", command=self.cancelPass); self.cancel.pack()

    def checkPass(self):
        self.data=(self.username.get(), self.password.get())
        self.root.destroy()

    def cancelPass(self):
        self.data=False
        self.root.destroy()


def popup():
    passWindow=LoginWindow(parent)
    passWindow.parent.wait_window(passWindow.root)
    print passWindow.data

parent=Tk()
Button(parent, text='popup', command=popup).pack()
parent.mainloop()
© www.soinside.com 2019 - 2024. All rights reserved.