2014-09-27 2 views
0

Я использую Tkinter, чтобы создать игру типа RISK (вроде ближе к Empire), и я пытаюсь создать игровые часы для усиления войск и получения денег.Месяц/Год, когда я играю, останавливая остальную часть своей игры

Проблема: когда я запускаю ее, цикл while останавливает остальную часть игры ... Как создать часы, которые не ужасно сложны, что добавит к переменным.

Мой код для часов:

def timeclock(m,y): 
    while m <= 12: 
     time.sleep(30) 
     m += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 
    else: 
     m = 1 
     y += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 

clock.configure идет на этикетке я сделал для игры, то, очевидно, просто обновляет текст.

Просто, чтобы вы знали, я не использую класс для своих приложений или функций .pack из-за того, что я недавно начал Tkinter, и я изучил его, не используя их. Хотя я понимаю классы, как и большинство программистов на промежуточном питоне. Пожалуйста помоги!

ответ

0

Чтобы сделать часы, вам необходимо использовать метод after, потому что time.sleep останавливает все, пока не закончит.

Посмотрите на этот пример. Он создает метку и кнопку, затем запускает timeclock через 100 мс. Функция timeclock настраивает часы, а затем вызывает себя снова через 100 мс. Это не прерывает главный выключатель Tkinter, поэтому кнопка все еще работает.

Пока вы не ставите свое приложение в класс, вам нужно будет сделать m и y global, чтобы использовать их в функциях, если вы не можете извлечь их из текста метки.

import Tkinter as tk 

def timeclock(): 
    global m, y 
    if m < 12: 
     m += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 
    else: 
     m = 1 
     y += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 
    root.after(100, timeclock) 

def reset(): 
    global m, y 
    m = 0 
    y = 0 

root = tk.Tk() 
clock = tk.Label(root, text='Clock') 
clock.pack() 
m = 0 
y = 0 
button = tk.Button(root, text='Reset clock', command=reset) 
button.pack() 
root.after(100, timeclock) 
root.mainloop() 

Чтобы избежать глобалов, вы можете сделать что-то подобное в следующем примере. Он получает месяц и год, глядя на этикетку.

import Tkinter as tk 
import re 

def timeclock(): 
    result = re.match('Month: (\d+), Year: (\d+)', clock['text']) 
    m, y = int(result.group(1)), int(result.group(2)) 
    if m < 12: 
     m += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 
    else: 
     m = 1 
     y += 1 
     clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 
    root.after(100, timeclock) 

def reset(): 
    m = 1 
    y = 0 
    clock.configure(text = "Month: "+str(m)+", Year: "+str(y)) 

root = tk.Tk() 
m = 1 
y = 0 
clock = tk.Label(root, text="Month: "+str(m)+", Year: "+str(y)) 
clock.pack() 
button = tk.Button(root, text='Reset clock', command=reset) 
button.pack() 
root.after(100, timeclock) 
root.mainloop() 
+0

Спасибо! Я рад, что на этом сайте есть люди, подобные вам, чтобы помочь людям, таким как я. Не могу дождаться, чтобы закончить игру сейчас! – HKVariant

+0

Код в вопросе проверяется каждые 30 секунд. Проверка каждые 100 мс бессмысленна. По крайней мере, вы не должны проверять несколько раз в секунду. Просто нет смысла иметь точность до 100 мс. –

+0

О, хорошо, я сделал так мало времени, чтобы быстро убедиться, что все работает так, как я хотел, с месяцами и годами, имеющими несколько цифр и так далее. Забыл посмотреть время в вопросе при публикации. Тем не менее, мне кажется, что из комментария ФП он выяснил, как самому изменить время. – fhdrsdg

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