2016-04-10 30 views
0

ログイン画面が必要です。ログインが成功すると、画面は閉じられ、新しい画面が作成されます。問題は、私が次のコードを好きにすると同時に両方の画面が開くことです。コードを改善するための提案があれば、してください! :)Tkinter - 1つのウィンドウを開き、別のウィンドウを閉じる

from Tkinter import * 
import mysql.connector 
import tkMessageBox 

class Tela_login(Frame): 
    root = Tk() 
    root.geometry("1024x768") 
    root.resizable(width=FALSE, height=FALSE) 
    background_image = PhotoImage(file="fundo.gif") 
    def __init__(self,master): 
     Frame.__init__(self,master) 
     self.grid() 
     fundo = Label(image=self.background_image) 
     fundo.place(x=0,y=0,relwidth=1,relheight=1) 
     self.create_screen() 

    def create_screen(self): 
     self.label1 = Label(text="Login",font = ("Arial",60)) 
     self.label2 = Label(text="Senha",font = ("Arial",60)) 
     self.login = Entry(font = ("Arial",60),width = 10) 
     self.senha = Entry(show="*",font = ("Arial",60), width= 10) 
     self.entrar = Button(text="Entrar",command=lambda : self.efetua_login(),font = ("Arial",60),width=10) 

     self.label1.grid(padx=258,pady=(70,0)) 
     self.login.grid(padx=258) 
     self.label2.grid(padx=258,pady=(50,0)) 
     self.senha.grid(padx=258) 
     self.entrar.grid(padx=258,pady=(50,0)) 

    def efetua_login(self): 
     login = self.login.get() 
     senha = self.senha.get() 

     cnx = mysql.connector.connect(user='root', password='123qwe', host='192.168.56.1', database='teste') 
     cursor = cnx 
     cursor = cnx.cursor() 

     query = ("SELECT nome, senha FROM funcionario WHERE nome = %s AND senha = %s") 
     cursor.execute(query, (login,senha)) 
     row = cursor.fetchone() 

     if row is None: 

      tkMessageBox.showinfo("Erro","Usuario ou Senha Incorretos") 

     else: 
      app2 = Tela_principal() 
      self.root.destroy() 
      Tela_principal.root.mainloop() 


class Tela_principal(Frame): 
    root = Tk() 
    root.geometry = ("1024x768") 
    root.resizable(width=FALSE, height=FALSE) 

    def inicia(self, master): 
     background_image = PhotoImage(file="fundo.gif") 
     app2 = Tela_principal(self.root) 
     Frame.__init__(self, master) 
     self.grid() 
     self.create_widgets() 

app = Tela_login(Tela_login.root) 
Tela_login.root.mainloop() 

答えて

0

おそらく2つのTk()インスタンスを実行したくないでしょう。ログイン画面には2つのルートがあります。ルートウィンドウを撤回して、ログイン画面のToplevelをToplevelの初期化ウィンドウで取り消し、ログインが成功したらトップレベルを破棄してルートウィンドウを上げることができます。または、別のフレームにログイン画面を置くことも簡単ですが、レイアウトに応じてpack_forgetまたはgrid_forgetを使用してメインフレームを非表示にしてから、フレームをログイン/破棄または非表示にしてpackまたはgridを呼び出してメインのアプリケーションフレームを再度表示します。

0

スレイヤー、あなたが言ったように、それは魅力的に機能しました! 例コードは次のとおりです。

from tkinter import * 

class Tela_login(Frame): 
    def __init__(self,master): 
     Frame.__init__(self, master) 
     self.grid() 
     self.button1 = Button(text = "Open",command = lambda: self.open_login()) 
     self.button1.grid() 

    def open_login(self): 
     root2 = Toplevel() 
     app2 = Tela_principal(root2) 

class Tela_principal(Frame): 
    def __init__(self,master): 
     Frame.__init__(self, master) 
     self.grid 

root = Tk() 
root.geometry("800x600") 
app = Tela_login(root) 
root.mainloop() 
関連する問題