【问题标题】:Python tkinter destroy windowPython tkinter 销毁窗口
【发布时间】:2020-02-22 21:58:39
【问题描述】:

我是python的初学者,我正在尝试为自己做点小事,但在单击按钮并打开新窗口后无法弄清楚如何销毁第一个窗口,它会保留在第一个窗口中为第二个窗口输入的变量对吗?

from tkinter import *
import tkinter as tk
import sys
def showdata():
    email1 = email.get()
    password2 = password1.get()
    print(email1 +" "+ password2)
    exec(open("scratch.py").read())


window = tk.Tk()
window.title("CANmail")
window.geometry("300x150")
em = Label(window, text="E-mail").place(relx=0.2,rely=0.2)

pd = Label(window, text="Password").place(relx=0.2,rely=0.4)

email = Entry(window)
password1 = Entry(window)

email.grid(row=0, column=1)
email.place(relx=0.5,rely=0.2)
password1.grid(row=1, column=1)
password1.place(relx=0.5,rely=0.4)

btn = Button(window, text="Log In", command=showdata)
btn.grid(row=2, column=1)
btn.place(relx=0.5,rely=0.7,anchor=CENTER)

window.mainloop()

【问题讨论】:

    标签: python python-3.x tkinter


    【解决方案1】:

    当你点击按钮并调用显示数据函数调用函数时:

    def quit(window):
        window.destroy()
    

    它认为它会帮助你。 这里再举一个例子:

    import tkinter
    
    
    class App():
       def __init__(self):
           self.root = Tkinter.Tk()
           button = Tkinter.Button(self.root, text = 'root quit', command=self.quit)
           button.pack()
           self.root.mainloop()
    
       def quit(self):
           self.root.destroy()
    
    app = App()
    

    【讨论】:

    • 我在共享的那个中犯了一个错误,因为我想看看我是否可以得到这个值,所以现在我添加了 def quit(window): exec(open("scratch.py​​"). read()) window.destroy() 在 mainloop() 之后,但它只关闭窗口,不打开scratch.py​​ 我需要它关闭,打开scratch.py​​ 输入的变量保存在那里,当我从第一个获取值时文件
    • 如果你想要的话。你需要先打开scratch.py​​,然后关闭窗口
    • 喜欢怎么做,我试着把 exec(open("scratch.py​​").read()) 先放,但没有用
    【解决方案2】:

    我通过实践发现如何通过将window.destroy() 命令添加到另一个文件的开头来做到这一点,因为它需要在第一个文件的循环之后写入

    【讨论】:

      【解决方案3】:

      您可以从第一个窗口保存变量,然后在另一个窗口中使用它们。

      为什么不像这样使用 import from scratch.py​​ 呢?并以这种方式将变量传递给那里:

      scratch.py​​ 文件

      def customize_window(customer_email,customer_password):
          w = Tk()
          w.geometry('300x150')
          l1 = Label(w,text = 'Your Email is:{0}'.format(customer_email))
          l2 = Label(w,text = 'Your Password is:{0}'.format(customer_password))
          l1.pack()
          l2.pack()
          w.mainloop()
      

      然后转到您的主文件并执行以下操作:

      from .scratch import customize_window
      ##your code...
      ...
      ...
      root.destroy()
      
      customize_window(customer_email = email.get(), customer_password = password1.get())
      

      【讨论】:

        【解决方案4】:

        您可以将Frame 用于登录窗口并在成功登录后将其隐藏(在showdata 函数中)然后在主窗口中显示另一个,如果您使用类,则不需要传递变量,它们将可以使用self. 访问

        试试下面的例子:

        from tkinter import Tk, Frame, Label, Entry, Button, Toplevel
        
        
        class MyApp(object):
            """"""
        
        
            def __init__(self, parent):
                self.root = parent
                self.root.title("Main frame")
                self.frame = Frame(parent)
                self.frame.pack()
        
                Label(self.frame).grid(row=0,column=0) # Add a space between top border and E-mail widget
        
                self.em = Label(self.frame, text="E-mail")
                self.em.grid(row=1,column=0)
        
                self.pd = Label(self.frame, text="Password")
                self.pd.grid(row=2,column=0)
        
                self.email = Entry(self.frame)
                self.password1 = Entry(self.frame)
        
                self.email.grid(row=1, column=1)
                self.password1.grid(row=2, column=1)
        
                self.btn = Button(self.frame, text="Log In", command=self.showdata)
                self.btn.grid(row=3, column=1)
        
            def hide(self):
        
                self.root.withdraw()
        
            def openFrame(self):
                self.hide()
                otherFrame = Toplevel()
                otherFrame.geometry("400x300")
                otherFrame.title("otherFrame")
                handler = lambda: self.onCloseOtherFrame(otherFrame)
                btn = Button(otherFrame, text="Close", command=handler)
                btn.pack()
        
            def onCloseOtherFrame(self, otherFrame):
                otherFrame.destroy()
                self.show()
        
            def show(self):
                self.root.update()
                self.root.deiconify()
        
            def showdata(self):
                email1 = self.email.get()
                password2 = self.password1.get()
                print(email1 +" "+ password2)
        
                # exec(open("scratch.py").read())
                self.openFrame()
        
        if __name__ == "__main__":
            root = Tk()
            root.geometry("300x100")
            app = MyApp(root)
            root.mainloop()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-07
          • 2021-09-24
          • 1970-01-01
          • 2019-02-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多