Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions GUI/Dates/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
Dates is a simple script to demonstrate both the use of PySimpleGUI as an interface to python scripts,
and basic date manipulation.

It requires PySimpleGUI==4.60.1

Tested on Python 3.10


Eduardo C. (https://github.com/ehcelino)
94 changes: 94 additions & 0 deletions GUI/Dates/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
"""
Dates - a simple graphic dates calculator
Demonstrates the use of PySimpleGui as an interface
and date arithmetics using module datetime and numpy.
2022 Eduardo C. - https://github.com/ehcelino
"""
from datetime import datetime
import PySimpleGUI as sg
import numpy as np

DATE_FRMT = '%m-%d-%Y'

def days_between(date_one, date_two):
"""
Determines how many days between dates.
:param date_one: date (us format) as string
:param date_two: date (us format) as string
:return: days as string
"""
result = ''
try:
tmp_one = datetime.strptime(date_one, DATE_FRMT)
tmp_two = datetime.strptime(date_two, DATE_FRMT)
except ValueError as exc:
sg.popup('Error:', exc)
else:
mytimedelta = tmp_one - tmp_two
result = mytimedelta.days
return result

def workdays_between(date_one, date_two):
"""
Determines how many workdays between dates.
:param date_one: date (us format) as string
:param date_two: date (us format) as string
:return: days as int
"""
result = ''
try:
tmp_one = datetime.strptime(date_one, DATE_FRMT)
tmp_two = datetime.strptime(date_two, DATE_FRMT)
except ValueError as exc:
sg.popup('Error:', exc)
else:
result = np.busday_count(tmp_one.strftime('%Y-%m-%d'), tmp_two.strftime('%Y-%m-%d'))
return result

def main_window():
"""
Defines the main window.
:return: PySimpleGUI Window object.
"""
tsz = (8, 1) # Makes easier to define sizes to multiple elements.
isz = (15, 1)
# Everything bound by []'s goes on one line.
layout = [
[sg.Text('Date calculator', font='_ 12 bold')],
[sg.Text('Date format: US (mm-dd-yyyy', font='_ 10 italic')],
[sg.Text('Date one:', size=tsz),
sg.Input('', size=isz, key='-DATE01-')],
[sg.Text('Date two:', size=tsz),
sg.Input('', size=isz, key='-DATE02-')],
[sg.Text('Answer:', size=tsz),
sg.Input('', size=isz, key='-OUTPUT-')],
[sg.Push(), sg.Button('Days between dates', key='-BETWEEN-'), sg.Push()],
[sg.Push(), sg.Button('Working days bt. dates', key='-WORKING-'), sg.Push()],
[sg.Push(), sg.Button('Exit', key='-EXIT-')]
]

return sg.Window('Date calculator!', layout, finalize=True)

window = main_window()

while True: # This is the main loop.
event, values = window.read()

if event == '-BETWEEN-':
try:
window['-OUTPUT-'].update(value=str(abs(
days_between(values['-DATE01-'], values['-DATE02-']))))
except TypeError as err:
sg.popup('Error:', err)

if event == '-WORKING-':
try:
window['-OUTPUT-'].update(value=str(abs(
workdays_between(values['-DATE01-'], values['-DATE02-']))))
except TypeError as err:
sg.popup('Error:', err)

if event in (sg.WIN_CLOSED, '-EXIT-'):
break

window.close()
9 changes: 9 additions & 0 deletions GUI/PyQuiz/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
PyQuiz is a simple script to demonstrate both the use of PySimpleGUI as an interface to python scripts,
and dictionaries for storing data. The code is mostly commented and as easy to understand as I could make it.

It requires PySimpleGUI==4.60.1

Tested on Python 3.10


Eduardo C. (https://github.com/ehcelino)
115 changes: 115 additions & 0 deletions GUI/PyQuiz/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
"""
PyQuiz - a simple graphical quiz software
Demonstrates the use of PySimpleGui as an interface
and simple dictionary interaction
2022 Eduardo C. - https://github.com/ehcelino
"""
import PySimpleGUI as sg

# The dictionary containing our questions and answers (can come from a file, a database...)
datatable = {
"1": {
"question": "10 + 10",
"answers": {
"a": "20",
"b": "100",
"c": "1010",
},
"correct_answer": "a",
},
"2": {
"question": "5 * 5",
"answers": {
"a": "55",
"b": "25",
"c": "500",
},
"correct_answer": "b",
},
"3": {
"question": "3 ** 2",
"answers": {
"a": "3",
"b": "32",
"c": "9",
},
"correct_answer": "c",
},
}

# Our window definition.
def main_window():
"""
Defines the main window.
:return: PySimpleGUI Window object.
"""
# Everything bound by []'s goes on one line.
layout = [
[sg.Text('Quiz!', font='_ 12 bold')],
[sg.Text('Question:')],
[sg.Input('', size=(30, 1), key='-QUESTION-')],
[sg.Text('Answers:')],
[sg.Multiline('', size=(30, 8), key='-OPTIONS-')],
[sg.Radio('a', group_id='-RADIO-', key='a'),
sg.Radio('b', group_id='-RADIO-', key='b'),
sg.Radio('c', group_id='-RADIO-', key='c'),],
[sg.Button('Start', key='-START-'), sg.Button('Answer', key='-ANSWER-'),
sg.Button('Exit', key='-EXIT-')]
]

return sg.Window('Quiz!', layout, finalize=True)

window = main_window()

# variables
QUESTIONS_INDEX = 1
END = False # To keep track of the end of the game
ANSWERED = False # If the question is still unanswered
QUESTIONING = False # If there's an active question
CORRECT = 0

# aliases
question = window['-QUESTION-']
answers = window['-OPTIONS-']

while True: # This is the main loop.
event, values = window.read()

if event == '-START-':
if not END:
QUESTIONING = True
answers.update(value='')
question.update(value=f'{datatable[str(QUESTIONS_INDEX)]["question"]}')
for answer, answer_data in datatable[str(QUESTIONS_INDEX)]["answers"].items():
answers.print(f'({answer}): {answer_data}')
correct_answer = datatable[str(QUESTIONS_INDEX)]["correct_answer"]
ANSWERED = False
else:
QUESTIONING = False
sg.popup('End of Quiz.')

if event == '-ANSWER-':
if (values['a'] or values['b'] or values['c']) and QUESTIONING:
for idx in ('a', 'b', 'c'):
if values[idx]:
USER_CHOICE = idx
if not ANSWERED:
if USER_CHOICE == correct_answer:
sg.popup('Correct!')
CORRECT += 1
else:
sg.popup('Wrong.')
if not ANSWERED:
QUESTIONS_INDEX += 1
ANSWERED = True
if QUESTIONS_INDEX > len(datatable):
END = True
sg.popup(f'The end. You got {CORRECT} of {len(datatable)}.')
if not END:
window.write_event_value('-START-', '')

if event in (sg.WIN_CLOSED, '-EXIT-'):
break


window.close()
9 changes: 9 additions & 0 deletions GUI/QtQuiz/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
QtQuiz is a simple script to demonstrate both the use of PyQT5 as an interface to python scripts,
and dictionaries for storing data. The code is mostly commented and as easy to understand as I could make it.

It requires PyQt5==5.15.7

Tested on Python 3.10


Eduardo C. (https://github.com/ehcelino)
129 changes: 129 additions & 0 deletions GUI/QtQuiz/design.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '.\design.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(420, 417)
self.centralwidget = QtWidgets.QWidget(MainWindow)
font = QtGui.QFont()
font.setFamily("Calibri")
font.setPointSize(12)
self.centralwidget.setFont(font)
self.centralwidget.setObjectName("centralwidget")
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 20, 221, 16))
self.label.setObjectName("label")
self.txtQuestion = QtWidgets.QTextEdit(self.centralwidget)
self.txtQuestion.setGeometry(QtCore.QRect(10, 70, 401, 61))
self.txtQuestion.setReadOnly(True)
self.txtQuestion.setObjectName("txtQuestion")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 50, 71, 16))
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(10, 140, 21, 16))
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(self.centralwidget)
self.label_4.setGeometry(QtCore.QRect(10, 170, 21, 16))
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self.centralwidget)
self.label_5.setGeometry(QtCore.QRect(10, 200, 21, 16))
self.label_5.setObjectName("label_5")
self.label_6 = QtWidgets.QLabel(self.centralwidget)
self.label_6.setGeometry(QtCore.QRect(10, 230, 21, 16))
self.label_6.setObjectName("label_6")
self.txtAnswerA = QtWidgets.QLineEdit(self.centralwidget)
self.txtAnswerA.setGeometry(QtCore.QRect(30, 140, 381, 20))
self.txtAnswerA.setReadOnly(True)
self.txtAnswerA.setObjectName("txtAnswerA")
self.txtAnswerB = QtWidgets.QLineEdit(self.centralwidget)
self.txtAnswerB.setGeometry(QtCore.QRect(30, 170, 381, 20))
self.txtAnswerB.setReadOnly(True)
self.txtAnswerB.setObjectName("txtAnswerB")
self.txtAnswerC = QtWidgets.QLineEdit(self.centralwidget)
self.txtAnswerC.setGeometry(QtCore.QRect(30, 200, 381, 20))
self.txtAnswerC.setReadOnly(True)
self.txtAnswerC.setObjectName("txtAnswerC")
self.txtAnswerD = QtWidgets.QLineEdit(self.centralwidget)
self.txtAnswerD.setGeometry(QtCore.QRect(30, 230, 381, 20))
self.txtAnswerD.setReadOnly(True)
self.txtAnswerD.setObjectName("txtAnswerD")
self.label_7 = QtWidgets.QLabel(self.centralwidget)
self.label_7.setGeometry(QtCore.QRect(10, 260, 91, 16))
self.label_7.setObjectName("label_7")
self.txtOne = QtWidgets.QLineEdit(self.centralwidget)
self.txtOne.setGeometry(QtCore.QRect(320, 30, 21, 20))
self.txtOne.setReadOnly(True)
self.txtOne.setObjectName("txtOne")
self.label_8 = QtWidgets.QLabel(self.centralwidget)
self.label_8.setGeometry(QtCore.QRect(350, 30, 21, 16))
self.label_8.setObjectName("label_8")
self.txtN = QtWidgets.QLineEdit(self.centralwidget)
self.txtN.setGeometry(QtCore.QRect(370, 30, 21, 20))
self.txtN.setReadOnly(True)
self.txtN.setObjectName("txtN")
self.btnStart = QtWidgets.QPushButton(self.centralwidget)
self.btnStart.setGeometry(QtCore.QRect(10, 360, 71, 41))
self.btnStart.setObjectName("btnStart")
self.btnAnswer = QtWidgets.QPushButton(self.centralwidget)
self.btnAnswer.setGeometry(QtCore.QRect(90, 360, 71, 41))
self.btnAnswer.setObjectName("btnAnswer")
self.btnExit = QtWidgets.QPushButton(self.centralwidget)
self.btnExit.setGeometry(QtCore.QRect(340, 360, 71, 41))
self.btnExit.setObjectName("btnExit")
self.radA = QtWidgets.QRadioButton(self.centralwidget)
self.radA.setGeometry(QtCore.QRect(110, 260, 31, 17))
self.radA.setObjectName("radA")
self.radB = QtWidgets.QRadioButton(self.centralwidget)
self.radB.setGeometry(QtCore.QRect(150, 260, 31, 17))
self.radB.setObjectName("radB")
self.radC = QtWidgets.QRadioButton(self.centralwidget)
self.radC.setGeometry(QtCore.QRect(190, 260, 31, 17))
self.radC.setObjectName("radC")
self.radD = QtWidgets.QRadioButton(self.centralwidget)
self.radD.setGeometry(QtCore.QRect(230, 260, 31, 17))
self.radD.setObjectName("radD")
self.txtResult = QtWidgets.QLineEdit(self.centralwidget)
self.txtResult.setGeometry(QtCore.QRect(80, 300, 251, 20))
self.txtResult.setFocusPolicy(QtCore.Qt.StrongFocus)
self.txtResult.setAlignment(QtCore.Qt.AlignCenter)
self.txtResult.setReadOnly(True)
self.txtResult.setObjectName("txtResult")
MainWindow.setCentralWidget(self.centralwidget)

self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)

def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "QtQuiz!"))
self.label.setText(_translate("MainWindow", "QtQuiz! - Questions and answers"))
self.label_2.setText(_translate("MainWindow", "Question:"))
self.label_3.setText(_translate("MainWindow", "a)"))
self.label_4.setText(_translate("MainWindow", "b)"))
self.label_5.setText(_translate("MainWindow", "c)"))
self.label_6.setText(_translate("MainWindow", "d)"))
self.label_7.setText(_translate("MainWindow", "Your answer:"))
self.label_8.setText(_translate("MainWindow", "of"))
self.btnStart.setText(_translate("MainWindow", "Start"))
self.btnAnswer.setText(_translate("MainWindow", "Answer"))
self.btnExit.setText(_translate("MainWindow", "Exit"))
self.radA.setText(_translate("MainWindow", "a"))
self.radA.setShortcut(_translate("MainWindow", "A"))
self.radB.setText(_translate("MainWindow", "b"))
self.radB.setShortcut(_translate("MainWindow", "B"))
self.radC.setText(_translate("MainWindow", "c"))
self.radC.setShortcut(_translate("MainWindow", "C"))
self.radD.setText(_translate("MainWindow", "d"))
self.radD.setShortcut(_translate("MainWindow", "D"))
Loading