2014-12-26 2 views
0

Я делаю программу в python (Tkinter) и как-то я застрял между путаницей. Я хочу приостановить выполнение программы в течение нескольких секунд, а также приостановить выполнение, но не в нужное время. Моя программа выглядит следующим образом:Как приостановить программу на несколько секунд

from Tkinter import * 
from time import * 
root=Tk() 
def login(): 
    g=str(ent.get()) 
    h=str(ent2.get()) 
    if h=='shubhank' and g=='shubhankt1': 
     root2=Tk() 
     root2.title("Shubhank Tyagi") 
     root2.geometry('300x300') 
     root2.wm_iconbitmap('st.ico') 
     name=Label(root2, text='''Name: Shubhank Tyagi 
    Age: 18 yrs 
    Sex: Male 
    Occupation: Student 
    Designation: Intermediate''') 
     name.pack() 
    elif h=='divyansh' and g=='divyansht5': 
     root2=Tk() 
     root2.title("Divyansh Tyagi") 
     root2.geometry('300x300') 
     root2.wm_iconbitmap('st.ico') 
     name=Label(root2, text='''Name: Divyansh Tyagi 
    Age: 18 yrs 
    Sex: Male 
    Occupation: Student 
    Designation: Intermediate''') 
     name.pack() 
    else: 
     error=Label(root, text='Please provide correct info.') 
     error.pack() 
     sleep(5) 
     error.pack_forget() 
w=Label(root, text="Username", bg='Light Blue') 
ent=Entry(root) 
w2=Label(root, text="Password", bg='Light Blue') 
ent2=Entry(root) 
ent2.config(show=' ') 

btn=Button(root, text='Click Me!', command=login) 

Эта кнопка (БТН) вызывает определенную функцию. То, что я хочу, это tht first tht error msg напечатан .. и после некоторого времени он удаляется .. возникает проблема tht после нажатия кнопки, программа приостанавливается nd непосредственно error.pack_forget() функции выполняются .. и ошибка msg никогда не печатается ...

Пожалуйста, помогите!

(я также могу предоставить ФАКТИЧЕСКУЮ PYTHON FILE, ЕСЛИ ТРЕБУЕТСЯ)

+0

Я думаю, вам нужно вызвать 'error.update_idletasks()' 'Перед сном (5)', который будет обновлять дисплей _перед_ приложения следующий бездельничает, что, когда он обычно это делает. Приложения обычно бездействуют после того, как они обновили дисплей и ждут новых событий, но вызов 'sleep' предотвращает это. – martineau

ответ

1

Есть некоторые фундаментальные вещи неправильно с вашей программой, которые не имеют отношение к основному вопросу, но что делает его трудно написать собственный ответ:

  1. Нельзя создавать более одного экземпляра Tk.
  2. Вы не должны звонить sleep в основной поток графического интерфейса.
  3. Вы не звоните mainloop, что необходимо для правильной работы.

Название вашего вопроса задает вопрос о том, как приостановить графический интерфейс, но графические интерфейсы никогда не должны «приостанавливать» как таковые. Когда графический интерфейс не предпринимает никаких действий, он все равно должен прослушивать события, потому что он постоянно получает такие события, как запросы на перерисовку отдельных частей и т. Д.

В теле вопроса задается вопрос, как скрыть ярлык после несколько секунд, и упоминает, как вы никогда не видите сообщение в первую очередь. Причина, по которой вы никогда не видите это, у GUI никогда не будет возможности ответить на события перерисовки, потому что вы вызываете sleep.

Вы можете скрыть сообщение в будущем, используя общий метод виджетов с именем after, который позволяет вам запускать функцию в будущем. Например:

def login(): 
    ... 
    error = Label(...) 
    error.pack(...) 
    error.after(5000, error.pack_forget) 
    ...