Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 3, 2013 14:14:24

Ramon_90
Зарегистрирован: 2013-08-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

есть задумка, написать приложение в котором будет выведены часы(с обновлением до текущего времени раз в секунду…ну по сути обычные часы), далее кнопка (при нажатии на которую будет добавляться какая то строка в файл). после нажатия кнопки через определенный интервал времени (пускай 1 минута) должен срабатывать будильник и выскакивать какое то сообщение

from Tkinter import *
import datetime
now_time = datetime.datetime.now()
cur_hours = now_time.hour
cur_minutes = now_time.minute
cur_sec = now_time.second
def write_in_file():
    global cur_hours, cur_minutes, cur_sec
    f = open('text.txt', 'a')
    f.write(now_time.strftime("\nyou went in %H:%M:%S\n"))
    f.close()
root = Tk()
mainLabel = Label(root, text='STATISTICK', width=20, background='red', font=("Arial", 20, "bold"))
butCheck = Button(root, width=30, height=2, text='Click me when you go', bg='brown')
cur_Label = Label(root, bg='red', font=("Arial", 15))
cur_Label.configure(text="now " + now_time.strftime("%H:%M:%S"))
mainLabel.grid(row=1, column=1)
butCheck.bind("<Button-1>", write_in_file())
butCheck.grid(row=2, column=1)
cur_Label.grid(row=3, column=1)
root.bind("<Control-z>", exit)
root.mainloop()
гугл уже замучил
разложу по порядку, в файл оно пишет, но пишет только один раз за запуск приложения
как сделать время обновляемым?

Отредактировано Ramon_90 (Сен. 3, 2013 14:41:41)

Офлайн

#2 Сен. 3, 2013 14:46:28

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

Почему тема в этом разделе а не в GUI?
Ну да ладно. По сути. Что надо?
1. Чтобы на экран отображались часы от текущего времени.
2. Чтобы при нажатии на кнопку текущее время уходило в файл и дописывалось в конец, т.е. нажал - ушло текущее время. После открытия файла можно будет посмотреть лог нажатия клавиш.
3. После нажатия кнопки запускается таймер и спрабатывает будильник через 1 минуту.

P.S. Все это время часы должны непрерывно показывать текущее время…

Я все правильно понял?



Отредактировано 4kpt (Сен. 3, 2013 14:48:07)

Офлайн

#3 Сен. 3, 2013 14:57:13

Ramon_90
Зарегистрирован: 2013-08-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

да, вроде все верно

Офлайн

#4 Сен. 3, 2013 15:43:48

Ramon_90
Зарегистрирован: 2013-08-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

с часами вопрос снят, уже разобрался

Офлайн

#5 Сен. 3, 2013 16:47:50

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

Держите…

# coding: utf-8
#
import Tkinter
import time
#
file_ = open("timer.txt", "w")
#
def close():
    file_.close()
    root.destroy()
#
def allert():
    tpl = Tkinter.Toplevel()
    text = Tkinter.Label(tpl, text="Timer Allert!", bg="red")
    text.pack()
#
def set_data_to_file(event):
    file_.write(timer["text"] + "\n")
    timer.after(10000, allert)
#
def go_timer():
    timer["text"] = "{3:02d}:{4:02d}:{5:02d}".format(*time.localtime())
    timer.after(1000, go_timer)
#
root = Tkinter.Tk()
root.focus_force()
root.protocol("WM_DELETE_WINDOW", close)
#
timer = Tkinter.Label(root, font="Arial, 40")
timer.pack()
timer.after(0, go_timer)
button = Tkinter.Button(root, text="Save to file")
button.pack()
button.bind("<Button-1>", set_data_to_file)
#
root.mainloop()

Будут вопросы - пишите…

P.S. Единственное - будильник сделал 10 секунд. Очень лень ждать :)



Отредактировано 4kpt (Сен. 3, 2013 16:49:45)

Офлайн

#6 Сен. 3, 2013 19:37:33

Ramon_90
Зарегистрирован: 2013-08-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

спасибо, сделал немножко по своему

from Tkinter import *
import datetime, threading, time
#
now_time = datetime.datetime.now()
cur_hours = now_time.hour
cur_minutes = now_time.minute
cur_sec = now_time.second
#
def change_time():
    time_date = datetime.datetime.now().strftime('%H:%M:%S')
    cur_Label.config(text=time_date)
    cur_Label.after(1000, change_time)
#
def write_in_file():
    f = open('text.txt', 'a')
    f.write(now_time.strftime("\nyou went  in %H:%M:%S\n"))
    f.close()
    t = threading.Timer(10.0, alert)
    t.start()
#
def alert():
    tpl = Toplevel()
    text = Label(tpl, text="asasdasd", bg="red")
    text.pack()
#
root = Tk()
#
mainLabel = Label(root, text='Smoking STATISTICK', width=20, background='red', font=("Arial", 20, "bold"))
butCheck = Button(root, width=30, height=2, text='Click me when you go', bg='brown')
cur_Label = Label(root, font=('Segoi UI', 20, 'bold'), bg='#000000', fg='#FFFFFF')
cur_Label.configure(text="now " + now_time.strftime("%H:%M:%S"))
mainLabel.grid(row=1, column=1)
butCheck.bind("<Button-1>", write_in_file())
butCheck.grid(row=2, column=1)
cur_Label.grid(row=3, column=1)
#
change_time()
#
root.bind("<Control-z>", exit)
root.mainloop()

проблема в том что после нажатия на кнопку все зависает и я не могу понять почему
пробовал поставить задержку, вместо
t = threading.Timer(10.0, alert)
t.start()
->
sleep(10…)
все работает но получается мрачно, весь гуй просто отключается на заданое количество секунд и все (планируется таймер выставлять на 2-3 часа…будет печально)

P.S. а самая главная проблема к стати не решена, что в Вашем примере что в моем запись данных в файл вноситься только после первого нажатия кнопки, после всех последующих соответственно нет(((

Офлайн

#7 Сен. 3, 2013 22:06:04

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

Побойтесь бога. Все работает. Нажимаю 10 раз…
Файл прикреплен.

Мультипоточность в Tkinter с использованием threading не работает! Об этом уже писали много раз. Гляньте в раздел GUI, куда я Вас уже направлял :)
У Tkinter свой механизм организации мультипоточности и у меня он представлен в коде:

def go_timer():
    timer["text"] = "{3:02d}:{4:02d}:{5:02d}".format(*time.localtime())
    timer.after(1000, go_timer)

Фактически - это использование рекурсии с методом .after().

P.S. Как механизм мультипоточности реализован в Tkinter обсуждалось более подробно в разделе для экспертов.

P.S.S. Где .txt файл ищите?



Отредактировано 4kpt (Сен. 3, 2013 22:09:25)

Прикреплённый файлы:
attachment timer.txt (100 байт)

Офлайн

#8 Сен. 4, 2013 15:10:36

Ramon_90
Зарегистрирован: 2013-08-16
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

спасибо за помощь, частично закончил)
если интересно прикрепляю код
в планах это засунуть в трей)

Прикреплённый файлы:
attachment Cigarets_statistics.py (2,6 KБ)

Офлайн

#9 Сен. 4, 2013 15:19:06

4kpt
От: Харьков
Зарегистрирован: 2010-11-03
Сообщения: 998
Репутация: +  63  -
Профиль   Отправить e-mail  

Проблема с обновлением данных в гуе

Ramon_90
Не за что :)

Идея ясна. Но Вам нужно еще немножко поработать с дизайном интерфейса. Уж очень глаз режет.
Рекомендую почитать Головач В. “Дизайн пользовательского интерфейса”.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version