-
Notifications
You must be signed in to change notification settings - Fork 1
/
tkinterWidgets.py
189 lines (153 loc) · 7.5 KB
/
tkinterWidgets.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# GUI TKINTER Libraries
from tkinter import *
from tkinter import ttk
# Regular Expressions Libary
import re
# File Flush
import os
# Global Variables
import config
# My Modules
import fileIO as fio
class MakeUI(Frame):
def __init__(self, Frame, **kwargs):
# onButton
def retrieveInputForTextFile():
input_value = input_file_textbox.get("1.0", "end-1c")
# Open file i/o
try:
fp = open("input.txt", "w")
except:
# print("File to open does not exist!")
progress_message.set("Failed to open input.txt, file does not exist!")
fp.write(input_value) # Write to input.txt file
# Commands for real-time updating input.txt file
fp.flush()
os.fsync(fp.fileno())
# print(input_value) # Debugging/Printing to Console
input_file_textbox.delete(1.0, END) # Clear's TextBox Widget on Success
fp.close() # Close the file i/o
# Gspread Functions
def makeChangesToSpreadsheet():
# Edge cases
# Should not overwrite member names
if config.CELL_COL == 1:
progress_message.set("Invalid option, cannot update cells that contain member names.")
return
# Set Google Sheets
try:
sheet = config.client.open(config.GOOGLE_SHEETS_FILENAME).sheet1
except:
progress_message.set("Invalid Google Sheets Filename.")
return
# Attempt to open input.txt File
try:
fpr = open("input.txt", "r")
except:
print("File to open does not exist!")
# Attempt to open error.txt File
try:
fp_err = open("error.txt", "w")
except:
print("Failed to open error.txt")
if os.stat("input.txt").st_size == 0:
progress_message.set("The input.txt file is empty! No changes were made.")
return
name = fpr.readline().strip()
# Variables to keep track of errors and progress
entries_changed = 0
errors = 0
while name:
try:
name_regex = re.compile(name, re.IGNORECASE)
cell = config.sheet.find(name_regex)
# print("Found something at R%s C%s" % (cell.row, cell.col))
# print("Updating values B%s\n" % (cell.row))
# ex.) B1 -> (Column + Row)
sheet.update_cell(cell.row, config.CELL_COL, config.CELL_CONTENT) # Update the value of the current cell
entries_changed += 1
name = fpr.readline().strip() # Continue iterating through file
except:
# print("FAILED TO COMPUTE FOR: %s\n" % (name)) # Error Message for feedback
fp_err.write("FAILED TO COMPUTE FOR: %s\n" % (name)) # Error Message for feedback to error.txt
errors += 1
name = fpr.readline().strip() # Continue iterating through file
continue # Skip back to beginning of loop
# Updating entries_changed label
if (entries_changed == 1):
entries_changed_counter.set("%s cell has been updated." % (entries_changed))
else:
entries_changed_counter.set("%s cells have been updated." % (entries_changed))
# Updating errors_occurred label
if (errors == 0):
errors_occured_counter.set("%s errors have occured." % (errors))
elif (errors == 1):
errors_occured_counter.set("%s error has occured.\nCheck the error.txt file for more information." % (errors))
else:
errors_occured_counter.set("%s errors have occured.\nCheck the error.txt file for more information." % (errors))
# Updating progress_message label
if entries_changed > 0:
progress_message.set("Success!")
if errors > 0:
progress_message.set("Successfully inputted some cells, check error log.")
elif entries_changed == 0:
progress_message.set("None of the cells changed, check error.txt!")
# Close file i/o
fpr.close()
fp_err.close()
def retrieve_spreadsheet_name(self, *args):
config.GOOGLE_SHEETS_FILENAME = spreadsheet_name.get()
# CELL_COL
# New implementation: Inputting Letters
def retrieve_cell_col(self, *args):
temp = cell_col.get()
temp = temp.upper()
result = 0
for i, T, in enumerate(temp[::-1]):
letter_number = ord(T) - ord("A") + 1
result += letter_number * (26 ** i)
config.CELL_COL = result
# CELL_CONTENT
def retrieve_cell_content(self, *args):
config.CELL_CONTENT = cell_content.get()
ttk.Label(Frame, text = "What is the spreadsheet name?:").pack()
spreadsheet_name = StringVar()
spreadsheet_name.trace_add("write", retrieve_spreadsheet_name)
spreadsheet_name_entry = Entry(Frame, width = 50, textvariable = spreadsheet_name)
spreadsheet_name_entry.pack()
# CELL_COL
ttk.Label(Frame, text = "Which column are we modifying? (Enter a letter):").pack()
cell_col = StringVar()
cell_col.trace_add("write", retrieve_cell_col)
cell_col_entry = Entry(Frame, width = 8, textvariable = cell_col)
cell_col_entry.pack()
# CELL_CONTENT
ttk.Label(Frame, text = "How many points do you want to input:").pack()
cell_content = StringVar()
cell_content.trace_add("write", retrieve_cell_content)
cell_content_entry = Entry(Frame, width = 8, textvariable = cell_content)
cell_content_entry.pack()
# FULL NAMES TO ADD TO INPUT FILE
ttk.Label(Frame, text = "Please input names of members who attended this meeting:").pack()
input_file_textbox = Text(Frame, height = 20, width = 20)
input_file_textbox.pack()
submit_button = ttk.Button(Frame, text = 'Submit Names', command = retrieveInputForTextFile)
submit_button.pack()
# entries_changed message/label
entries_changed_counter = StringVar()
entries_changed_counter.set("0 cells have been updated so far.")
entries_changed_label = Label(Frame, textvariable = entries_changed_counter)
entries_changed_label.pack()
# errors_occured message/label
errors_occured_counter = StringVar()
errors_occured_counter.set("0 errors have occured so far.")
errors_occured_label = Label(Frame, textvariable = errors_occured_counter)
errors_occured_label.pack()
# progress message
progress_message = StringVar()
progress_message.set("Thanks for using my application! -Dennis")
progress_message_label = Label(Frame, textvariable = progress_message)
progress_message_label.pack()
# SUBMIT CHANGES TO GSPREADSHEET
final_submission_button = ttk.Button(Frame, text = 'Submit Changes!', command = makeChangesToSpreadsheet)
final_submission_button.pack()