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):
|
def __init__(self, dunikey, node, recipient, amount, comment='', useMempool=False, verbose=False):
|
||||||
self.dunikey = dunikey
|
self.dunikey = dunikey
|
||||||
self.recipient = recipient
|
self.recipient = recipient
|
||||||
self.amount = amount
|
self.amount = int(amount)
|
||||||
self.comment = comment
|
self.comment = comment
|
||||||
self.issuer = get_privkey(dunikey, "pubsec").pubkey
|
self.issuer = get_privkey(dunikey, "pubsec").pubkey
|
||||||
self.useMempool = useMempool
|
self.useMempool = useMempool
|
||||||
self.verbose = verbose
|
self.verbose = verbose
|
||||||
|
self.node = node
|
||||||
self._isChange = False
|
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.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.stderr.write("Le destinataire ne peut pas être vous même.\n")
|
||||||
sys.exit(1)
|
raise
|
||||||
|
|
||||||
|
|
||||||
# Define Duniter GVA node
|
# Define Duniter GVA node
|
||||||
transport = AIOHTTPTransport(url=node)
|
transport = AIOHTTPTransport(url=node)
|
||||||
|
@ -34,7 +43,7 @@ class Transaction:
|
||||||
|
|
||||||
def genDoc(self):
|
def genDoc(self):
|
||||||
# Build TX generation document
|
# Build TX generation document
|
||||||
# print(self.useMempool)
|
print("useMempool:", str(self.useMempool))
|
||||||
queryBuild = gql(
|
queryBuild = gql(
|
||||||
"""
|
"""
|
||||||
query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTxs(
|
query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTxs(
|
||||||
|
@ -50,7 +59,7 @@ class Transaction:
|
||||||
paramsBuild = {
|
paramsBuild = {
|
||||||
"recipient": self.recipient,
|
"recipient": self.recipient,
|
||||||
"issuer": self.issuer,
|
"issuer": self.issuer,
|
||||||
"amount": self.amount,
|
"amount": int(self.amount),
|
||||||
"comment": self.comment,
|
"comment": self.comment,
|
||||||
"useMempool": self.useMempool
|
"useMempool": self.useMempool
|
||||||
}
|
}
|
||||||
|
@ -62,7 +71,7 @@ class Transaction:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
message = ast.literal_eval(str(e))["message"]
|
message = ast.literal_eval(str(e))["message"]
|
||||||
sys.stderr.write("Echec de la génération du document:\n" + message + "\n")
|
sys.stderr.write("Echec de la génération du document:\n" + message + "\n")
|
||||||
sys.exit(1)
|
raise
|
||||||
|
|
||||||
|
|
||||||
# Check document
|
# Check document
|
||||||
|
@ -81,15 +90,15 @@ class Transaction:
|
||||||
if re.search("Comment:", line):
|
if re.search("Comment:", line):
|
||||||
commentRaw[i:] = [line.split(': ', 1)[1]]
|
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):
|
if all(i == self.issuer for i in outPubkey):
|
||||||
print("Le document contient une transaction de change")
|
print("Le document contient une transaction de change")
|
||||||
self.isChange = True
|
self.isChange = True
|
||||||
# Check validity of the document
|
# 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:
|
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.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:
|
else:
|
||||||
print("Le document généré est conforme.")
|
print("Le document généré est conforme.")
|
||||||
self.isChange = False
|
self.isChange = False
|
||||||
|
@ -133,7 +142,7 @@ class Transaction:
|
||||||
sys.stderr.write("Echec de la transaction:\n" + message + "\n")
|
sys.stderr.write("Echec de la transaction:\n" + message + "\n")
|
||||||
if self.verbose:
|
if self.verbose:
|
||||||
sys.stderr.write("Document final:\n" + docs)
|
sys.stderr.write("Document final:\n" + docs)
|
||||||
sys.exit(1)
|
raise ValueError(message)
|
||||||
else:
|
else:
|
||||||
if self.isChange:
|
if self.isChange:
|
||||||
self.send()
|
self.send()
|
||||||
|
@ -148,6 +157,7 @@ class Transaction:
|
||||||
def _getIsChange(self):
|
def _getIsChange(self):
|
||||||
return self._isChange
|
return self._isChange
|
||||||
def _setIsChange(self, newChange):
|
def _setIsChange(self, newChange):
|
||||||
|
print("_setIsChange: ", str(newChange))
|
||||||
self._isChange = newChange
|
self._isChange = newChange
|
||||||
if newChange: self.useMempool == True
|
if newChange: self.useMempool == True
|
||||||
isChange = property(_getIsChange, _setIsChange)
|
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