2013-05-28 2 views
1

Я пытался создать открытые окна, которые запрашивают у вас имя пользователя и пароль перед открытием ноутбука в Tkinter, у меня есть оба, но я не знаю, как их собрать. Другими словами, я хочу, чтобы открыть ноутбук после правильного имени пользователя и пароля.Доступ к окнам для ноутбука в Tkinter

спасибо, что заблаговременно!

То, что я сделал до сих пор выглядит следующим образом:

import Tkinter 
from Tkinter import * 
import ttk 
from ttk import * #Combobox Definition 
import tkMessageBox #for Welcome Message 
import Tkinter as tk # For Main Frame Definition 
from Tkinter import Tk, Text, BOTH, W, N, E, S 
from ttk import Frame, Button, Label, Style 

root = Tk() 
root.title("Model A") 
root.minsize(400, 220) 
root.maxsize(410, 240) 


# start of Notebook (multiple tabs) 
notebook = ttk.Notebook(root) 
notebook.pack(fill='both', expand='yes') 
notebook.pressed_index = None 


# create a child frame for each page 
frameOne = Tkinter.Frame(notebook, bg='white',width=560, height=100) 
frameOne.pack(fill='both', expand=True) 

# create the pages 
notebook.add(frameOne, text='Simple calculation') 


#Login Starts  

failure_max = 8 
passwords = [('name','password')] 

def make_entry(parent, caption, width=None, **options): 
    tk.Label(parent, text=caption).pack(side=tk.TOP) 
    entry = tk.Entry(parent, **options) 
    if width: 
     entry.config(width=width) 
    entry.pack(side=tk.TOP, padx=10, fill=tk.BOTH) 
    return entry 

def enter(event): 
    check_password() 

def check_password(failures=[]): 
    if (user.get(), password.get()) in passwords: 
     root.destroy() 
     return 
    failures.append(1) 
    if sum(failures) >= failure_max: 
     root.destroy() 
     raise SystemExit('Unauthorized login attempt') 
    else: 
     root.title('Try again. Attempt %i/%i' % (sum(failures)+1, failure_max)) 


parent = Tkinter.Frame(notebook, padx=10, pady=18, bg='white') 
parent.pack(fill=tk.BOTH, expand=True) 

user = make_entry(parent, "User name:", 16, show='') 
password = make_entry(parent, "Password:", 16, show="*") 

b = tk.Button(parent,borderwidth=4,text="Login",width=10,pady=8,command=check_password) 
b.pack(side=Tkinter.BOTTOM) 
password.bind('<Return>', enter) 

#Close Application Button 
def quit(root): 
    root.destroy() 

tk.Button(root, text="Close Application", command=lambda root=root:quit(root)).pack() 

#Calculation Starts 

def defocus(event): 
     event.widget.master.focus_set() 

def multiply(*args): 
    try: 
     product.set(round(float(Num_One.get())*float(Num_Two.get()))) 
    except ValueError: 
     pass 

Num_One = StringVar() 
Num_Two = StringVar() 
product = DoubleVar() 


ttk.Label(frameOne, text="Select First Number:").grid(column =3, row = 0) 
NumOne_Select = Combobox(frameOne, values=("1", "2", "3","4", "5"),textvariable=Num_One) 
NumOne_Select.grid(column=4, row=0, columnspan="5", sticky="nswe") 
Num_One.trace("w", multiply) 

ttk.Label(frameOne, text="Select Second Number:").grid(column =3, row = 6) 
NumTwo_Select = Combobox(frameOne, values=("1", "2", "3","4", "5"),textvariable=Num_Two) 
NumTwo_Select.grid(column=4, row=6, columnspan="5", sticky="nswe") 
Num_Two.trace("w", multiply) 

ttk.Label(frameOne, text = "Product:").grid(column = 3, row = 8) 
ttk.Label(frameOne, textvariable=product).grid(column = 4, row = 8) 

user.focus_set() 
parent.mainloop() 
root.mainloop() 
+0

Когда вы говорите «откройте ноутбук», что именно вы имеете в виду? Вы хотите, чтобы вы создали отдельное окно? –

ответ

2

У вас есть несколько вещей происходит неправильно в вашем коде:

  • вы звоните mainloop дважды; вы должны только когда-либо называть его один раз.
  • вы не должны pack или grid виджетов внутри ноутбука. Вы видите pack с помощью виджета, а затем используете notebook.add; опустите pack.
  • вы вызываете destroy в корневом окне, если пароль является хорошим. Это приведет к выходу вашего приложения. Не звоните destroy.

Обычно, как это делается, ноутбук является дочерним элементом корневого окна, а диалоговое окно имени пользователя/пароля является экземпляром Toplevel. Вы можете скрыть окно root и открыть диалоговое окно, а затем, если пользователь войдет в систему, вы можете уничтожить диалоговое окно и отменить скрытие главного окна.

Смежные вопросы