Найти - Пользователи
Полная версия: Проблема с обновлением данных в гуе
Начало » Python для новичков » Проблема с обновлением данных в гуе
1
Ramon_90
есть задумка, написать приложение в котором будет выведены часы(с обновлением до текущего времени раз в секунду…ну по сути обычные часы), далее кнопка (при нажатии на которую будет добавляться какая то строка в файл). после нажатия кнопки через определенный интервал времени (пускай 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()
гугл уже замучил
разложу по порядку, в файл оно пишет, но пишет только один раз за запуск приложения
как сделать время обновляемым?
4kpt
Почему тема в этом разделе а не в GUI?
Ну да ладно. По сути. Что надо?
1. Чтобы на экран отображались часы от текущего времени.
2. Чтобы при нажатии на кнопку текущее время уходило в файл и дописывалось в конец, т.е. нажал - ушло текущее время. После открытия файла можно будет посмотреть лог нажатия клавиш.
3. После нажатия кнопки запускается таймер и спрабатывает будильник через 1 минуту.

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

Я все правильно понял?
Ramon_90
да, вроде все верно
Ramon_90
с часами вопрос снят, уже разобрался
4kpt
Держите…

# 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 секунд. Очень лень ждать :)
Ramon_90
спасибо, сделал немножко по своему

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. а самая главная проблема к стати не решена, что в Вашем примере что в моем запись данных в файл вноситься только после первого нажатия кнопки, после всех последующих соответственно нет(((
4kpt
Побойтесь бога. Все работает. Нажимаю 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 файл ищите?
Ramon_90
спасибо за помощь, частично закончил)
если интересно прикрепляю код
в планах это засунуть в трей)
4kpt
Ramon_90
Не за что :)

Идея ясна. Но Вам нужно еще немножко поработать с дизайном интерфейса. Уж очень глаз режет.
Рекомендую почитать Головач В. “Дизайн пользовательского интерфейса”.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB