Взять время секундомера пользователя из GUI и записать их в текстовый файл, который открывается вместе с программой. - PullRequest
0 голосов
/ 05 мая 2020

Хорошо, прошу прощения, но я новичок в python и использую GUI впервые. В настоящее время у меня есть программа секундомера GUI, использующая Tkinter, и мне нужно как-то сохранить эти пользовательские данные и записать их в текстовый файл, который открывается вместе с программой. Это мой код:

import tkinter as tink
count = -1
run = False
def var_name(stopwatch):
   def value():
      if run:
         global count
         # Just beore starting
         if count == -1:
            show = "Starting"
         else:
            show = str(count)
         stopwatch['text'] = show
         #Increment the count after every 1 second
         stopwatch.after(1000, value)
         count += 1
   value()

# While Running
def Start(stopwatch):
   global run
   run = True
   var_name(stopwatch)
   start['state'] = 'disabled'
   stop['state'] = 'normal'
   reset['state'] = 'normal'

# While stopped
def Stop():
   global run
   start['state'] = 'normal'
   stop['state'] = 'disabled'
   reset['state'] = 'normal'
   run = False

# For Reset
def Reset(label):
   global count
   count = -1
   if run == False:
      reset['state'] = 'disabled'
      stopwatch['text'] = 'Welcome'
   else:
      stopwatch['text'] = 'Start'

base = tink.Tk()
base.title("Alyssa's Stopwatch")
base.minsize(width=300, height=200,)
stopwatch = tink.Label(base, text="Let's begin!", fg="#ff5ca5", font="Times 25
bold",bg="white")
stopwatch.pack()
start = tink.Button(base, text='Start',fg="#c978ff",width=25, command=lambda:
Start(stopwatch))
stop = tink.Button(base, text='Stop', fg="#78b0ff", width=25, state='disabled',
command=Stop)
reset = tink.Button(base, text='Reset', fg="#92fcbb",width=25, state='disabled',
command=lambda: Reset(stopwatch))
start.pack()
stop.pack()
reset.pack()
base.mainloop()

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

tkinter не имеет специальных функций для чтения и записи конфигурации, поэтому вам придется делать это самостоятельно. Используйте стандартные open(), read(), write(), close() или модули, чтобы сохранить его в файле JSON, YAML или .ini. Вам нужно будет прочитать конфигурацию до Tk() (если вы хотите использовать confing для создания windgets) или до mainloop() (если вы хотите изменить существующие виджеты) и сохранить его после mainloop() (или при изменении состояния)


Я использую JSON для сохранения конфигурации, потому что это стандартный модуль (поэтому вам не нужно его устанавливать), и он преобразует текст с числом в целочисленное / плавающее значение, текст "false / true" в логическое значение False/True, et c. (так что потребуется меньше работы / кода)

Чтение:

    with open('config.txt') as fh:
        config = json.load(fh)

    count = config['count']
    run = config['run']

Сохранить:

    config = { 
        'count': count,
        'run': run,
    }

    with open('config.txt', 'w') as fh:
        json.dump(config, fh)

Потому что после получения конфигурации из файла я также хочу обновить текст на этикетке и кнопках, поэтому я прочитал конфигурацию после создания всех виджетов.

# read after creating widgets because config updates text on label and buttons
load_config()

base.mainloop()

# save after closing window
save_config()

Полный код с другими изменениями

PEP 8 - Руководство по стилю для Python кода

import json
import tkinter as tk

# --- functions ---

def update():
    global count # PEP8: all `global` at the beginning to make it more readable

    if run:
       # just before starting
       if count == -1:
          show = "Starting"
       else:
          show = count
       stopwatch['text'] = show # there is no need to use `str()`

       # increment the count after every 1 second
       count += 1

       stopwatch.after(1000, update)


# while running
def on_start(): # PEP8: lower_case_names for functions
   global run

   run = True

   start['state'] = 'disabled'
   stop['state'] = 'normal'
   reset['state'] = 'normal'

   update()


# while stopped
def on_stop(): # PEP8: lower_case_names for functions
   global run

   run = False

   start['state'] = 'normal'
   stop['state'] = 'disabled'
   reset['state'] = 'normal'


# for reset
def on_reset(): # PEP8: lower_case_names for functions
   global count

   count = -1
   #if run == False:
   #if run is False: # PEP8: `is False` instead `== False`
   if not run:  # PEP8: more preferred then `is False` (and you can read it like English text)
      reset['state'] = 'disabled'
      stopwatch['text'] = 'Welcome'
   else:
      stopwatch['text'] = 'Start'


def load_config():
    global count
    global run

    try:
        with open('config.txt') as fh:
            config = json.load(fh)

        print('[DEBUG] load_config:', config)

        count = config['count']
        run = config['run']

        # update label and buttons
        if count > -1:
            # update text on label
            stopwatch['text'] = count
            # continue counting and/or update text on buttons
            if run:
                on_start()
            else:
                on_stop()
    except Exception as ex:
        # if there is empty/broken config file (or it doesn't exist yet)
        print('Exception:', ex)

def save_config():
    # create data to save
    config = { 
        'count': count,
        'run': run,
    }

    print('[DEBUG] save_config:', config)

    with open('config.txt', 'w') as fh:
        json.dump(config, fh)

# --- main ---

count = -1
run = False

base = tk.Tk()
base.title("Alyssa's Stopwatch")
base.minsize(width=300, height=200,)

stopwatch = tk.Label(base, text="Let's begin!",
                     fg="#ff5ca5", font="Times 25 bold", bg="white")
stopwatch.pack()

start = tk.Button(base, text='Start',
                  fg="#c978ff", width=25, command=on_start)
stop = tk.Button(base, text='Stop',
                 fg="#78b0ff", width=25, state='disabled', command=on_stop)
reset = tk.Button(base, text='Reset',
                  fg="#92fcbb", width=25, state='disabled', command=on_reset)
start.pack()
stop.pack()
reset.pack()

# read after creating widgets because config updates text on label and buttons
load_config()

base.mainloop()

# save after closing window
save_config()
0 голосов
/ 05 мая 2020

Кажется, в коде нет какого-либо метода чтения для чтения пользовательского ввода. Секундомер GUI имеет кнопки «Пуск», «Стоп» и «Сброс», но не имеет опции для чтения пользовательского ввода.

Таким образом, неясно, на какой пользовательский ввод вы здесь ссылаетесь:

В настоящее время у меня есть программа секундомера GUI, использующая Tkinter, и мне нужно как-то сохранить эти вводимые пользователем данные и записать их в текстовый файл, который открывается вместе с программой.

РЕДАКТИРОВАТЬ ========================================== ==================================

Здравствуйте.

Для этого вам нужно создать текстовый файл.

Сначала вы создаете пустой текстовый файл, используя метод open. Попросите приложение прочитать файл и одновременно включите параметр записи. Для демонстрации в записной книжке, в которой выполнялась работа, был создан файл «mycount.txt». Должен быть включен оператор «import os». Откройте файл в приложении с помощью os.startfile ("mycount.txt"), а затем включите параметр записи.

В методе Stop () откройте текстовый файл как файловый объект. Переместите курсор чтения в начало файла и, если файл не пустой, то go на новую строку в документе. Добавьте наблюдаемые значения в конец файла. Цифры из секундомера будут отображаться в текстовом файле после закрытия секундомера и повторного запуска приложения.

Код ниже демонстрирует процесс:

import tkinter as tink
import os

os.startfile("mycount.txt")
count = -1
#second_count = 0
f = open("mycount.txt","r+")

#if f.read()
#os.startfile("mycount.txt")

print(f.read())
run = False
def var_name(stopwatch):
   def value():    
      if run:
         global count
         # Just beore starting
         if count == -1:
            show = "Starting"
         else:
            show = str(count)
         stopwatch['text'] = show
         #Increment the count after every 1 second
         stopwatch.after(1000, value)


         count += 1


   value()

# While Running
def Start(stopwatch):
   global run
   run = True
   var_name(stopwatch)
   start['state'] = 'disabled'
   stop['state'] = 'normal'
   reset['state'] = 'normal'

# While stopped
def Stop():
   global run
   start['state'] = 'normal'
   stop['state'] = 'disabled'
   reset['state'] = 'normal'
   run = False


   with open("mycount.txt","a+") as file_object:
       #Move Read cursor to the start of the file.
       file_object.seek(0)
       #If file is not empty, then append "\n"

       data = file_object.read(100)
       if len(data) > 0:
            file_object.write("\n")
        #Append text at the end of the file

       f.write(str(count-1) + "\n")
       print(f.read())
       f.close()




# For Reset
def Reset(label):
   global count
   count = -1
   if run == False:
      reset['state'] = 'disabled'
      stopwatch['text'] = 'Welcome'
   else:
      stopwatch['text'] = 'Start'

base = tink.Tk()
base.title("Alyssa's Stopwatch")
base.minsize(width=300, height=200,)
stopwatch = tink.Label(base, text="Let's begin!", fg="#ff5ca5", font="Times 25 bold",bg="white")
stopwatch.pack()
start = tink.Button(base, text='Start',fg="#c978ff",width=25, command=lambda:Start(stopwatch))
stop = tink.Button(base, text='Stop', fg="#78b0ff", width=25, state='disabled',command=Stop)
reset = tink.Button(base, text='Reset', fg="#92fcbb",width=25, state='disabled',command=lambda: Reset(stopwatch))
start.pack()
stop.pack()
reset.pack()
base.mainloop()

Надеюсь, это поможет!

...