Add debug outputs; Add new GUI
This commit is contained in:
parent
21bda9d646
commit
283e6c47c5
101
gui-tkinter.py
101
gui-tkinter.py
|
@ -1,101 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
ZetCode Tkinter tutorial
|
||||
|
||||
In this example, we use the pack
|
||||
manager to create a review example.
|
||||
|
||||
Author: Jan Bodnar
|
||||
Website: www.zetcode.com
|
||||
"""
|
||||
|
||||
from tkinter import Tk, Text, TOP, BOTH, X, N, LEFT
|
||||
from tkinter.ttk import Frame, Label, Entry, Button
|
||||
from libs.paylib import Transaction
|
||||
import sys, threading
|
||||
|
||||
class StdoutRedirector(object):
|
||||
def __init__(self, text_widget):
|
||||
self.text_widget = text_widget
|
||||
|
||||
def write(self, s):
|
||||
self.text_widget.insert('end', s)
|
||||
self.text_widget.see('end')
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
|
||||
class Pay(Frame):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.initUI()
|
||||
|
||||
|
||||
def initUI(self):
|
||||
|
||||
self.master.title("Paiement Ḡ1")
|
||||
self.pack(fill=X)
|
||||
|
||||
frame1 = Frame(self)
|
||||
frame1.pack(fill=X)
|
||||
recipientLabel = Label(frame1, text="Destinataire:", width=12)
|
||||
recipientLabel.pack(side=LEFT, padx=5, pady=5)
|
||||
self.recipientEntry = Entry(frame1)
|
||||
self.recipientEntry.pack(fill=X, padx=5, expand=True)
|
||||
|
||||
frame2 = Frame(self)
|
||||
frame2.pack(fill=X)
|
||||
AmountLabel = Label(frame2, text="Montant:", width=12)
|
||||
AmountLabel.pack(side=LEFT, padx=5, pady=5)
|
||||
self.AmountEntry = Entry(frame2, width=7)
|
||||
self.AmountEntry.pack(side=LEFT, padx=5)
|
||||
|
||||
frame3 = Frame(self)
|
||||
frame3.pack(fill=X)
|
||||
commentLabel = Label(frame3, text="Commentaire:", width=12)
|
||||
commentLabel.pack(side=LEFT, padx=5, pady=5)
|
||||
self.commentEntry = Entry(frame3)
|
||||
self.commentEntry.pack(fill=X, padx=5, expand=True)
|
||||
|
||||
frame4 = Frame(self)
|
||||
frame4.pack()
|
||||
self.sendButton = Button(frame4, text="Envoyer", command=self.ProceedPaiement)
|
||||
self.sendButton.pack(side=LEFT, padx=5, pady=5, expand=True)
|
||||
|
||||
frame5 = Frame(self, width=200, height=300)
|
||||
frame5.pack()
|
||||
self.textbox = Text(frame5, wrap='word')
|
||||
self.textbox.pack()
|
||||
sys.stdout = StdoutRedirector(self.textbox)
|
||||
|
||||
|
||||
def ProceedPaiement(self):
|
||||
try:
|
||||
recipient = str(self.recipientEntry.get())
|
||||
amount = int(self.AmountEntry.get())
|
||||
except:
|
||||
print("Please enter the recipient's public and the amount\n")
|
||||
else:
|
||||
comment = str(self.commentEntry.get())
|
||||
print("Paiement en cours ... " + recipient)
|
||||
trans = Transaction(recipient, amount, comment)
|
||||
trans.send()
|
||||
recipient = amount = comment = None
|
||||
|
||||
def main():
|
||||
|
||||
def starter():
|
||||
root = Tk()
|
||||
root.geometry("500x300+300+300")
|
||||
app = Pay()
|
||||
root.mainloop()
|
||||
|
||||
thread = threading.Thread(target=starter)
|
||||
thread.start()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -13,20 +13,29 @@ class Transaction:
|
|||
def __init__(self, dunikey, node, recipient, amount, comment='', useMempool=False, verbose=False):
|
||||
self.dunikey = dunikey
|
||||
self.recipient = recipient
|
||||
self.amount = amount
|
||||
self.amount = int(amount)
|
||||
self.comment = comment
|
||||
self.issuer = get_privkey(dunikey, "pubsec").pubkey
|
||||
self.useMempool = useMempool
|
||||
self.verbose = verbose
|
||||
self.node = node
|
||||
self._isChange = False
|
||||
|
||||
if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45:
|
||||
try:
|
||||
if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45:
|
||||
raise ValueError("La clé publique n'est pas au bon format.")
|
||||
except:
|
||||
sys.stderr.write("La clé publique n'est pas au bon format.\n")
|
||||
sys.exit(1)
|
||||
raise
|
||||
|
||||
if recipient == self.issuer:
|
||||
|
||||
try:
|
||||
if recipient == self.issuer:
|
||||
raise ValueError('Le destinataire ne peut pas être vous même.')
|
||||
except:
|
||||
sys.stderr.write("Le destinataire ne peut pas être vous même.\n")
|
||||
sys.exit(1)
|
||||
raise
|
||||
|
||||
|
||||
# Define Duniter GVA node
|
||||
transport = AIOHTTPTransport(url=node)
|
||||
|
@ -34,7 +43,7 @@ class Transaction:
|
|||
|
||||
def genDoc(self):
|
||||
# Build TX generation document
|
||||
# print(self.useMempool)
|
||||
print("useMempool:", str(self.useMempool))
|
||||
queryBuild = gql(
|
||||
"""
|
||||
query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTxs(
|
||||
|
@ -50,7 +59,7 @@ class Transaction:
|
|||
paramsBuild = {
|
||||
"recipient": self.recipient,
|
||||
"issuer": self.issuer,
|
||||
"amount": self.amount,
|
||||
"amount": int(self.amount),
|
||||
"comment": self.comment,
|
||||
"useMempool": self.useMempool
|
||||
}
|
||||
|
@ -62,7 +71,7 @@ class Transaction:
|
|||
except Exception as e:
|
||||
message = ast.literal_eval(str(e))["message"]
|
||||
sys.stderr.write("Echec de la génération du document:\n" + message + "\n")
|
||||
sys.exit(1)
|
||||
raise
|
||||
|
||||
|
||||
# Check document
|
||||
|
@ -81,15 +90,15 @@ class Transaction:
|
|||
if re.search("Comment:", line):
|
||||
commentRaw[i:] = [line.split(': ', 1)[1]]
|
||||
|
||||
# Check if is only change transaction
|
||||
# Check if it's only a change transaction
|
||||
if all(i == self.issuer for i in outPubkey):
|
||||
print("Le document contient une transaction de change")
|
||||
self.isChange = True
|
||||
# Check validity of the document
|
||||
elif issuerRaw[0] != self.issuer or outAmount[0] != self.amount or outPubkey[0] != self.recipient or commentRaw[0] != self.comment:
|
||||
sys.stderr.write(colored("Le document généré est corrompu !\nNe fait plus confiance au noeud " + node + "\n", 'red'))
|
||||
sys.stderr.write(colored("Le document généré est corrompu !\nLe noeud " + self.node + "a peut être un dysfonctionnement.\n", 'red'))
|
||||
sys.stderr.write(colored(issuerRaw[0] + " envoi " + str(outAmount[0]) + " vers " + outPubkey[0] + " with comment: " + commentRaw[0] + "\n", "yellow"))
|
||||
sys.exit(1)
|
||||
raise ValueError('Le document généré est corrompu !')
|
||||
else:
|
||||
print("Le document généré est conforme.")
|
||||
self.isChange = False
|
||||
|
@ -133,7 +142,7 @@ class Transaction:
|
|||
sys.stderr.write("Echec de la transaction:\n" + message + "\n")
|
||||
if self.verbose:
|
||||
sys.stderr.write("Document final:\n" + docs)
|
||||
sys.exit(1)
|
||||
raise ValueError(message)
|
||||
else:
|
||||
if self.isChange:
|
||||
self.send()
|
||||
|
@ -148,6 +157,7 @@ class Transaction:
|
|||
def _getIsChange(self):
|
||||
return self._isChange
|
||||
def _setIsChange(self, newChange):
|
||||
print("_setIsChange: ", str(newChange))
|
||||
self._isChange = newChange
|
||||
if newChange: self.useMempool == True
|
||||
isChange = property(_getIsChange, _setIsChange)
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
"""
|
||||
ZetCode Tkinter tutorial
|
||||
|
||||
In this example, we use the pack
|
||||
manager to create a review example.
|
||||
|
||||
Author: Jan Bodnar
|
||||
Website: www.zetcode.com
|
||||
"""
|
||||
|
||||
import PySimpleGUI as sg
|
||||
from lib.paylib import Transaction
|
||||
import sys, os, threading
|
||||
from shutil import copyfile
|
||||
from os.path import join, dirname
|
||||
from dotenv import load_dotenv
|
||||
from lib.natools import get_privkey
|
||||
|
||||
class StdoutRedirector(object):
|
||||
def __init__(self, text_widget):
|
||||
self.text_widget = text_widget
|
||||
|
||||
def write(self, s):
|
||||
self.text_widget.insert('end', s)
|
||||
self.text_widget.see('end')
|
||||
|
||||
def flush(self):
|
||||
pass
|
||||
|
||||
|
||||
# Get variables environment
|
||||
if not os.path.isfile('.env'):
|
||||
copyfile(".env.template", ".env")
|
||||
dotenv_path = join(dirname(__file__), '.env')
|
||||
load_dotenv(dotenv_path)
|
||||
|
||||
dunikey = os.getenv('DUNIKEY')
|
||||
node = os.getenv('NODE')
|
||||
issuer = get_privkey(dunikey, "pubsec").pubkey
|
||||
if not dunikey or not node:
|
||||
sys.stderr.write("Please fill the path of your private key (PubSec), and a Duniter node in .env file\n")
|
||||
sys.exit(1)
|
||||
|
||||
def ProceedPaiement(recipient, amount, comment):
|
||||
print("Paiement en cours vers", recipient)
|
||||
trans = Transaction(dunikey, node, recipient, amount, comment)
|
||||
trans.send()
|
||||
recipient = amount = comment = None
|
||||
|
||||
|
||||
sg.theme('DarkGrey2')
|
||||
layout = [ [sg.Text('Noeud utilisé: ' + node)],
|
||||
[sg.Text('Votre clé publique: ' + issuer)],
|
||||
[sg.Text('')],
|
||||
[sg.Text('Destinataire: '), sg.InputText(size=(50, None))],
|
||||
[sg.Text('Montant: '), sg.InputText(size=(7, None))],
|
||||
[sg.Text('Commentaire:'), sg.InputText(size=(50, None))],
|
||||
[sg.Button('Envoyer'), sg.Button('Annuler')] ]
|
||||
|
||||
# Create the Window
|
||||
window = sg.Window('Paiement Ḡ1 - GVA', layout)
|
||||
while True:
|
||||
try:
|
||||
event, values = window.read()
|
||||
if event == sg.WIN_CLOSED or event == 'Cancel':
|
||||
break
|
||||
ProceedPaiement(values[0], values[1], values[2])
|
||||
except Exception as e:
|
||||
sg.popup(f'Une erreur est survenu', e, title="Erreur")
|
||||
else:
|
||||
sg.popup(f'Transaction effectué avec succès !', title="Envoyé")
|
||||
|
||||
|
||||
window.close()
|
Reference in New Issue