Python ткинтер уничтожить окно - PullRequest
1 голос
/ 27 октября 2019

Я новичок в 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()

Ответы [ 4 ]

0 голосов
/ 27 октября 2019

Вы можете использовать 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()
0 голосов
/ 27 октября 2019

На практике я нашел, как это сделать, просто добавив команду window.destroy() в начало другого файла, поскольку ее нужно записать после цикла первого файла

0 голосов
/ 27 октября 2019

Вы можете сохранить свои переменные из первого окна и просто использовать их в другом окне.

Почему бы просто не использовать import из 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())
0 голосов
/ 27 октября 2019

Когда вы нажимаете кнопку и вызываете функцию вызова функции показа данных:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...