Première remontée des extraits de code créés localement
This commit is contained in:
parent
65007e4e65
commit
97d0eba0c4
65
coroutine.py
Normal file
65
coroutine.py
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
def lireDroiteGauche(chaine):
|
||||
'''Renvoie les caractères de chaine en commençant à droite'''
|
||||
|
||||
idx = 0
|
||||
while idx != len(chaine):
|
||||
print(f"[gen] Je rentre dans mon Yield")
|
||||
valeur = (yield chaine[idx])
|
||||
print(f"[gen] Je suis sorti du Yield")
|
||||
if valeur != None:
|
||||
print("[gen] Retour non nul, je coroutine !")
|
||||
print(f"[gen] reçu: {valeur}")
|
||||
else:
|
||||
print("[gen] J'ai rien reçu, je génère")
|
||||
idx += 1
|
||||
|
||||
class Tree:
|
||||
|
||||
def __init__(self, label, left=None, right=None):
|
||||
self.label = label
|
||||
self.left = left
|
||||
self.right = right
|
||||
|
||||
def __repr__(self, level=0, indent=" "):
|
||||
s = level*indent + repr(self.label)
|
||||
if self.left:
|
||||
s = s + "\n" + self.left.__repr__(level+1, indent)
|
||||
if self.right:
|
||||
s = s + "\n" + self.right.__repr__(level+1, indent)
|
||||
return s
|
||||
|
||||
def __iter__(self):
|
||||
return inorder(self)
|
||||
|
||||
|
||||
def inorder(t):
|
||||
if t:
|
||||
for x in inorder(t.left):
|
||||
yield x
|
||||
yield t.label
|
||||
for x in inorder(t.right):
|
||||
yield x
|
||||
|
||||
def tree(list):
|
||||
n = len(list)
|
||||
if n == 0:
|
||||
return []
|
||||
i = n // 2
|
||||
return Tree(list[i], tree(list[:i]), tree(list[i+1:]))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
chaine = "abcdef"
|
||||
stop = "a"
|
||||
print(f"On va lire '{chaine}' à l'envers")
|
||||
print(f"et faire qqch au premier '{stop}' retourné")
|
||||
|
||||
it_chaine = lireDroiteGauche(chaine)
|
||||
print(f"\n[for] Je demande un NEXT")
|
||||
for lettre in it_chaine:
|
||||
print(f"[for] {lettre}")
|
||||
if lettre == stop:
|
||||
print(f"[for] Je réclame une coro")
|
||||
it_chaine.send("yolo")
|
||||
print(f"[for] Je reprends le travail")
|
||||
print(f"[for] Je demande un NEXT\n")
|
||||
125
getattr.py
Normal file
125
getattr.py
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
"""
|
||||
Création dynamique de commandes pour enrober une interface en ligne de commande.
|
||||
|
||||
Par exemple pour RTC d'IBM:
|
||||
Toutes les commandes commencent par 'scm -a n -u y'
|
||||
Soit donc avec le format 'command [-option option_value]'
|
||||
|
||||
Les sous-commandes peuvent avoir des arguments avec ou sans étiquette:
|
||||
'scm checkin --comment "mon commentaire" path/to/checkin/'
|
||||
|
||||
Les sous-commandes peuvent aussi avoir des sous-commandes:
|
||||
'scm create workspace --description "bla" --stream "stream" "WS_Name"'
|
||||
|
||||
Mais cela ne va pas plus loin : 'scm sub1 sub2 options'
|
||||
|
||||
Toutes les commandes ne supportent pas le format json en sortie
|
||||
Toutes les commandes ne requièrent pas le référentiel
|
||||
|
||||
Note:
|
||||
Plutôt que de renvoyer un nouvel objet, on devrait faire circuler le parent
|
||||
et le faire évoluer progressivement
|
||||
"""
|
||||
|
||||
|
||||
class CommandUncallable:
|
||||
def __init__(self, root, callable, head={}, tail={}):
|
||||
self.root = root
|
||||
self.tail = tail
|
||||
for k, v in head.items():
|
||||
self.root = self.root + f" -{k} {v}"
|
||||
self.callable = callable
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
print(' arg: ', args)
|
||||
for arg in args:
|
||||
self.root = " ".join([self.root, arg])
|
||||
print(' kwa: ', kwargs)
|
||||
for key, value in kwargs.items():
|
||||
opt = f"-{key} {value}"
|
||||
self.root = " ".join([self.root, opt])
|
||||
print(' tai: ', self.tail)
|
||||
for key, value in self.tail.items():
|
||||
opt = f"-{key} {value}"
|
||||
self.root = " ".join([self.root, opt])
|
||||
print(' obj: ', self)
|
||||
print(' cmd: ', self.root)
|
||||
|
||||
def __getattr__(self, name):
|
||||
"""Return a callable object of this same type so that you can just keep
|
||||
chaining together calls and just adding that missing attribute to the
|
||||
arguments"""
|
||||
return self.callable(" ".join([self.root, name]), self.callable, tail=self.tail)
|
||||
|
||||
|
||||
class Command(CommandUncallable):
|
||||
def __call__(self, *args, **kwargs):
|
||||
CommandUncallable.__call__(self, *args, **kwargs)
|
||||
return self
|
||||
|
||||
|
||||
class ScmCommand(CommandUncallable):
|
||||
def __init__(self, root):
|
||||
CommandUncallable.__init__(
|
||||
self, root, CommandUncallable,
|
||||
head={'a':'n','u':'y'},
|
||||
tail={'r':'RTC_CLI', '-json':''}
|
||||
)
|
||||
|
||||
|
||||
class CommandSelf:
|
||||
def __init__(self, root, head={}, tail={}):
|
||||
self.root = root
|
||||
self.command = root
|
||||
for k, v in head.items():
|
||||
self.command = self.command + f" -{k} {v}"
|
||||
self.tail = tail
|
||||
|
||||
def toto(self):
|
||||
pass
|
||||
|
||||
def __call__(self, *args, **kwargs):
|
||||
for arg in args:
|
||||
self.command = " ".join([self.command, arg])
|
||||
for key, value in kwargs.items():
|
||||
opt = f"-{key} {value}"
|
||||
self.command = " ".join([self.command, opt])
|
||||
for key, value in self.tail.items():
|
||||
opt = f"-{key} {value}"
|
||||
self.command = " ".join([self.command, opt])
|
||||
print(' cmd: ', self.command)
|
||||
|
||||
def __getattr__(self, name):
|
||||
print(f" getattr: {name}")
|
||||
for method in vars(self):
|
||||
print(method)
|
||||
#if name in vars(getattr(self, method)):
|
||||
# return getattr(getattr(self, method), name)
|
||||
self.command = " ".join([self.command, name])
|
||||
return self
|
||||
|
||||
def set_default(self, opt):
|
||||
print(f" Setting defaults with {opt}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
command = Command(
|
||||
'scm', Command,
|
||||
head={'a':'n','u':'y'},
|
||||
tail={'r':'RTC_CLI'}
|
||||
)
|
||||
print(' cmd: ', command, '\n')
|
||||
print(f"First command:")
|
||||
command.list.connections('localhost')
|
||||
|
||||
print(f"\nSecond command:")
|
||||
command.create(style='inplace').workspace('WS_Name', s='S_Name')
|
||||
|
||||
print(f"\nWith ScmCommand class:")
|
||||
scm = ScmCommand('scm')
|
||||
print(' scm: ', scm)
|
||||
scm.create.workspace('WS_Name', s='Stream_Name')
|
||||
|
||||
print(f"\nWith CommandSelf class:")
|
||||
scm_self = CommandSelf('scm', {'a':'n','u':'y'}, {'r':'RTC_CLI'})
|
||||
scm_self.create.workspace('WS_Name', s='Stream_Name')
|
||||
67
gui/gui_example_tk.py
Normal file
67
gui/gui_example_tk.py
Normal file
|
|
@ -0,0 +1,67 @@
|
|||
"""From http://sebsauvage.net/python/gui/"""
|
||||
|
||||
import tkinter as tk
|
||||
|
||||
|
||||
class my_tk_app(tk.Tk):
|
||||
"""This class holds the main window"""
|
||||
|
||||
def __init__(self, parent):
|
||||
"""We use the parent constructor and keep track of our parent"""
|
||||
tk.Tk.__init__(self, parent)
|
||||
self.parent = parent
|
||||
self.initialise()
|
||||
|
||||
def initialise(self):
|
||||
"""To separate GUI from logic, we create widgets here"""
|
||||
# Create the layout manager
|
||||
self.grid()
|
||||
|
||||
# Create and keep a reference to a text entry
|
||||
self.entryVariable = tk.StringVar()
|
||||
self.entry = tk.Entry(self, textvariable=self.entryVariable)
|
||||
self.entry.grid(column=0, row=0, sticky='EW')
|
||||
self.entry.bind("<Return>", self.OnPressEnter)
|
||||
self.entryVariable.set(u"Entrez du texte ici.")
|
||||
|
||||
# Create a button
|
||||
button = tk.Button(self, text=u"Cliques moi !",
|
||||
command=self.OnButtonClick)
|
||||
button.grid(column=1, row=0)
|
||||
|
||||
# Create a label
|
||||
self.labelVariable = tk.StringVar()
|
||||
label = tk.Label(self, textvariable=self.labelVariable,
|
||||
anchor='w', fg='white', bg='blue')
|
||||
label.grid(column=0, row=1, columnspan=2, sticky='EW')
|
||||
self.labelVariable.set(u"Salut !")
|
||||
|
||||
# Allow content to be resized with window
|
||||
self.grid_columnconfigure(0, weight=1)
|
||||
# Enable resizing horizontally, not vertically
|
||||
self.resizable(True, False)
|
||||
|
||||
# tk will change win size according to content
|
||||
# so we update to compute size, and we fix it
|
||||
self.update()
|
||||
self.geometry(self.geometry())
|
||||
|
||||
# Default focus to the text entry
|
||||
self.entry.focus_set()
|
||||
self.entry.selection_range(0, tk.END)
|
||||
|
||||
def OnButtonClick(self):
|
||||
self.labelVariable.set(self.entryVariable.get() + " (bouton)")
|
||||
self.entry.focus_set()
|
||||
self.entry.selection_range(0, tk.END)
|
||||
|
||||
def OnPressEnter(self, event):
|
||||
self.labelVariable.set(self.entryVariable.get() + " (entrée)")
|
||||
self.entry.focus_set()
|
||||
self.entry.selection_range(0, tk.END)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = my_tk_app(None)
|
||||
app.title("My tkinter application")
|
||||
app.mainloop()
|
||||
62
gui/gui_example_wx.py
Normal file
62
gui/gui_example_wx.py
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
"""From http://sebsauvage.net/python/gui/"""
|
||||
|
||||
import wx
|
||||
|
||||
|
||||
class my_wx_app(wx.Frame):
|
||||
"""This class holds the main window"""
|
||||
|
||||
def __init__(self, parent, id, title):
|
||||
"""We use the parent constructor and keep track of our parent"""
|
||||
wx.Frame.__init__(self, parent, id, title)
|
||||
self.parent = parent
|
||||
self.initialise()
|
||||
|
||||
def initialise(self):
|
||||
"""To separate GUI from logic, we create widgets here"""
|
||||
# Create the layout manager
|
||||
sizer = wx.GridBagSizer()
|
||||
|
||||
# Create and keep a reference to a text entry
|
||||
self.entry = wx.TextCtrl(self, -1, value=u"Entrer du texte ici.")
|
||||
sizer.Add(self.entry, (0,0), (1,1), wx.EXPAND)
|
||||
self.Bind(wx.EVT_TEXT_ENTER, self.OnPressEnter, self.entry)
|
||||
|
||||
# Create a button
|
||||
button = wx.Button(self, -1, label="Cliques moi !")
|
||||
sizer.Add(button, (0,1))
|
||||
self.Bind(wx.EVT_BUTTON, self.OnButtonClick, button)
|
||||
|
||||
# Create a label
|
||||
self.label = wx.StaticText(self, -1, label=u"Salut !")
|
||||
self.label.SetBackgroundColour(wx.BLUE)
|
||||
self.label.SetForegroundColour(wx.WHITE)
|
||||
sizer.Add(self.label, (1,0), (1,2), wx.EXPAND)
|
||||
|
||||
# Allow content to be resized with window
|
||||
sizer.AddGrowableCol(0)
|
||||
self.SetSizerAndFit(sizer)
|
||||
|
||||
# Enable resizing horizontally, not vertically
|
||||
self.SetSizeHints(-1, self.GetSize().y, -1, self.GetSize().y)
|
||||
|
||||
# Default focus to the text entry
|
||||
self.entry.SetFocus()
|
||||
self.entry.SetSelection(-1, -1)
|
||||
self.Show(True)
|
||||
|
||||
def OnButtonClick(self, event):
|
||||
self.label.SetLabel(self.entry.GetValue() + " (bouton)")
|
||||
self.entry.SetFocus()
|
||||
self.entry.SetSelection(-1, -1)
|
||||
|
||||
def OnPressEnter(self, event):
|
||||
self.label.SetLabel(self.entry.GetValue() + " (entrée)")
|
||||
self.entry.SetFocus()
|
||||
self.entry.SetSelection(-1, -1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = wx.App()
|
||||
frame = my_wx_app(None, -1, "My wxWidget application")
|
||||
app.MainLoop()
|
||||
138
gui/gui_interference.py
Normal file
138
gui/gui_interference.py
Normal file
|
|
@ -0,0 +1,138 @@
|
|||
# -----------------------------------------------------------------------------
|
||||
# interference.py
|
||||
# -----------------------------------------------------------------------------
|
||||
"""
|
||||
Author: Jesse M. Kinder
|
||||
Created: 2016 Apr 15
|
||||
Modified: 2016 Apr 15
|
||||
|
||||
Description
|
||||
-----------
|
||||
Build a GUI wrapper to explore the interference pattern of two waves.
|
||||
"""
|
||||
try:
|
||||
# This will work in Python 2.7
|
||||
import Tkinter
|
||||
except ImportError:
|
||||
# This will work in Python 3.5
|
||||
import tkinter as Tkinter
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# To use matplotlib, the author must use the TkAgg backend, or none of this will
|
||||
# work and a long string of inexplicable error messages will ensue.
|
||||
# -----------------------------------------------------------------------------
|
||||
import matplotlib
|
||||
matplotlib.use('TkAgg')
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
# Define a bold font:
|
||||
BOLD = ('Courier', '24', 'bold')
|
||||
|
||||
# Create main application window.
|
||||
root = Tkinter.Tk()
|
||||
|
||||
# Create a text box explaining the application.
|
||||
greeting = Tkinter.Label(text="Create an Interference Pattern", font=BOLD)
|
||||
greeting.pack(side='top')
|
||||
|
||||
# Create a frame for variable names and entry boxes for their values.
|
||||
frame = Tkinter.Frame(root)
|
||||
frame.pack(side='top')
|
||||
|
||||
# Variables for the calculation, and default values.
|
||||
amplitudeA = Tkinter.StringVar()
|
||||
amplitudeA.set('1.0')
|
||||
frequencyA = Tkinter.StringVar()
|
||||
frequencyA.set('1.0')
|
||||
|
||||
amplitudeB = Tkinter.StringVar()
|
||||
amplitudeB.set('1.0')
|
||||
frequencyB = Tkinter.StringVar()
|
||||
frequencyB.set('1.0')
|
||||
|
||||
deltaPhi = Tkinter.StringVar()
|
||||
deltaPhi.set('0.0')
|
||||
|
||||
# Create text boxes and entry boxes for the variables.
|
||||
# Use grid geometry manager instead of packing the entries in.
|
||||
row_counter = 0
|
||||
aa_text = Tkinter.Label(frame, text='Amplitude of 1st wave:')
|
||||
aa_text.grid(row=row_counter, column=0)
|
||||
|
||||
aa_entry = Tkinter.Entry(frame, width=8, textvariable=amplitudeA)
|
||||
aa_entry.grid(row=row_counter, column=1)
|
||||
|
||||
row_counter += 1
|
||||
fa_text = Tkinter.Label(frame, text='Frequency of 1st wave:')
|
||||
fa_text.grid(row=row_counter, column=0)
|
||||
|
||||
fa_entry = Tkinter.Entry(frame, width=8, textvariable=frequencyA)
|
||||
fa_entry.grid(row=row_counter, column=1)
|
||||
|
||||
row_counter += 1
|
||||
ab_text = Tkinter.Label(frame, text='Amplitude of 2nd wave:')
|
||||
ab_text.grid(row=row_counter, column=0)
|
||||
|
||||
ab_entry = Tkinter.Entry(frame, width=8, textvariable=amplitudeB)
|
||||
ab_entry.grid(row=row_counter, column=1)
|
||||
|
||||
row_counter += 1
|
||||
fb_text = Tkinter.Label(frame, text='Frequency of 2nd wave:')
|
||||
fb_text.grid(row=row_counter, column=0)
|
||||
|
||||
fb_entry = Tkinter.Entry(frame, width=8, textvariable=frequencyB)
|
||||
fb_entry.grid(row=row_counter, column=1)
|
||||
|
||||
row_counter += 1
|
||||
dp_text = Tkinter.Label(frame, text='Phase Difference:')
|
||||
dp_text.grid(row=row_counter, column=0)
|
||||
|
||||
dp_entry = Tkinter.Entry(frame, width=8, textvariable=deltaPhi)
|
||||
dp_entry.grid(row=row_counter, column=1)
|
||||
|
||||
# Define a function to create the desired plot.
|
||||
def make_plot(event=None):
|
||||
# Get these variables from outside the function, and update them.
|
||||
global amplitudeA, frequencyA, amplitudeB, frequencyB, deltaPhi
|
||||
|
||||
# Convert StringVar data to numerical data.
|
||||
aa = float(amplitudeA.get())
|
||||
fa = float(frequencyA.get())
|
||||
ab = float(amplitudeB.get())
|
||||
fb = float(frequencyB.get())
|
||||
phi = float(deltaPhi.get())
|
||||
|
||||
# Define the range of the plot.
|
||||
t_min = -10
|
||||
t_max = 10
|
||||
dt = 0.01
|
||||
t = np.arange(t_min, t_max+dt, dt)
|
||||
|
||||
# Create the two waves and find the combined intensity.
|
||||
waveA = aa * np.cos(fa * t)
|
||||
waveB = ab * np.cos(fb * t + phi)
|
||||
intensity = (waveA + waveB)**2
|
||||
|
||||
# Create the plot.
|
||||
plt.figure()
|
||||
plt.plot(t, intensity, lw=3)
|
||||
plt.title('Interference Pattern')
|
||||
plt.xlabel('Time')
|
||||
plt.ylabel('Intensity')
|
||||
plt.show()
|
||||
|
||||
|
||||
# Add a button to create the plot.
|
||||
MakePlot = Tkinter.Button(root, command=make_plot, text="Create Plot")
|
||||
MakePlot.pack(side='bottom', fill='both')
|
||||
|
||||
# Allow pressing <Return> to create plot.
|
||||
root.bind('<Return>', make_plot)
|
||||
|
||||
# Allow pressing <Esc> to close the window.
|
||||
root.bind('<Escape>', root.destroy)
|
||||
|
||||
# Activate the window.
|
||||
root.mainloop()
|
||||
|
||||
88
gui/gui_log_text_area.py
Normal file
88
gui/gui_log_text_area.py
Normal file
|
|
@ -0,0 +1,88 @@
|
|||
import time
|
||||
import threading
|
||||
import logging
|
||||
try:
|
||||
import tkinter as tk # Python 3.x
|
||||
import tkinter.scrolledtext as ScrolledText
|
||||
except ImportError:
|
||||
import Tkinter as tk # Python 2.x
|
||||
import ScrolledText
|
||||
|
||||
class TextHandler(logging.Handler):
|
||||
# This class allows you to log to a Tkinter Text or ScrolledText widget
|
||||
# Adapted from Moshe Kaplan: https://gist.github.com/moshekaplan/c425f861de7bbf28ef06
|
||||
|
||||
def __init__(self, text):
|
||||
# run the regular Handler __init__
|
||||
logging.Handler.__init__(self)
|
||||
# Store a reference to the Text it will log to
|
||||
self.text = text
|
||||
|
||||
def emit(self, record):
|
||||
msg = self.format(record)
|
||||
def append():
|
||||
self.text.configure(state='normal')
|
||||
self.text.insert(tk.END, msg + '\n')
|
||||
self.text.configure(state='disabled')
|
||||
# Autoscroll to the bottom
|
||||
self.text.yview(tk.END)
|
||||
# This is necessary because we can't modify the Text from other threads
|
||||
self.text.after(0, append)
|
||||
|
||||
class myGUI(tk.Frame):
|
||||
|
||||
# This class defines the graphical user interface
|
||||
|
||||
def __init__(self, parent, *args, **kwargs):
|
||||
tk.Frame.__init__(self, parent, *args, **kwargs)
|
||||
self.root = parent
|
||||
self.build_gui()
|
||||
|
||||
def build_gui(self):
|
||||
# Build GUI
|
||||
self.root.title('TEST')
|
||||
self.root.option_add('*tearOff', 'FALSE')
|
||||
self.grid(column=0, row=0, sticky='ew')
|
||||
self.grid_columnconfigure(0, weight=1, uniform='a')
|
||||
self.grid_columnconfigure(1, weight=1, uniform='a')
|
||||
self.grid_columnconfigure(2, weight=1, uniform='a')
|
||||
self.grid_columnconfigure(3, weight=1, uniform='a')
|
||||
|
||||
# Add text widget to display logging info
|
||||
st = ScrolledText.ScrolledText(self, state='disabled')
|
||||
st.configure(font='TkFixedFont')
|
||||
st.grid(column=0, row=1, sticky='w', columnspan=4)
|
||||
|
||||
# Create textLogger
|
||||
text_handler = TextHandler(st)
|
||||
|
||||
# Logging configuration
|
||||
logging.basicConfig(filename='test.log',
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
|
||||
# Add the handler to logger
|
||||
logger = logging.getLogger()
|
||||
logger.addHandler(text_handler)
|
||||
|
||||
def worker():
|
||||
# Skeleton worker function, runs in separate thread (see below)
|
||||
while True:
|
||||
# Report time / date at 2-second intervals
|
||||
time.sleep(2)
|
||||
timeStr = time.asctime()
|
||||
msg = 'Current time: ' + timeStr
|
||||
logging.info(msg)
|
||||
|
||||
def main():
|
||||
|
||||
root = tk.Tk()
|
||||
myGUI(root)
|
||||
|
||||
t1 = threading.Thread(target=worker, args=[])
|
||||
t1.start()
|
||||
|
||||
root.mainloop()
|
||||
t1.join()
|
||||
|
||||
main()
|
||||
87
gui/gui_logarithm.py
Normal file
87
gui/gui_logarithm.py
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
# -----------------------------------------------------------------------------
|
||||
# logarithm.py
|
||||
# -----------------------------------------------------------------------------
|
||||
"""
|
||||
Create a GUI application to compute logarithms using the Tkinter module.
|
||||
"""
|
||||
try:
|
||||
# This will work in Python 2.7
|
||||
import Tkinter
|
||||
except ImportError:
|
||||
# This will work in Python 3.5
|
||||
import tkinter as Tkinter
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Create main window.
|
||||
# -----------------------------------------------------------------------------
|
||||
root = Tkinter.Tk()
|
||||
|
||||
# Create two text boxes and pack them in.
|
||||
greeting = Tkinter.Label(text="Hello, world!")
|
||||
greeting.pack(side='top')
|
||||
|
||||
advertisement = Tkinter.Label(text="I am logarithm computing GUI.")
|
||||
advertisement.pack(side='top')
|
||||
|
||||
# Define a function to close the window.
|
||||
def quit(event=None):
|
||||
root.destroy()
|
||||
|
||||
# Cause pressing <Esc> to close the window.
|
||||
root.bind('<Escape>', quit)
|
||||
|
||||
# Create a button that will close the window.
|
||||
button = Tkinter.Button(text="Exit", command=quit)
|
||||
button.pack(side='bottom', fill='both')
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Create a frame within the main window.
|
||||
# -----------------------------------------------------------------------------
|
||||
# The frame will contain the widgets needed to do a calculation.
|
||||
# Each widget in "frame" is created with "frame" as its first argument.
|
||||
frame = Tkinter.Frame(root)
|
||||
frame.pack(side='top')
|
||||
|
||||
# Create a text box that explains the calculation.
|
||||
invitation = Tkinter.Label(frame, text="The natural logarithm of")
|
||||
invitation.pack(side='left')
|
||||
|
||||
# Define an input variable and add an entry box so the user can change its value.
|
||||
x = Tkinter.StringVar()
|
||||
x.set('2.71828')
|
||||
x_entry = Tkinter.Entry(frame, width=8, textvariable=x)
|
||||
x_entry.pack(side='left')
|
||||
|
||||
# Define an output variable and a function to compute its value.
|
||||
y = Tkinter.StringVar()
|
||||
|
||||
def compute_y(event=None):
|
||||
from math import log
|
||||
# Get x and y from outside the function.
|
||||
global x, y
|
||||
|
||||
# Get the string value of the x StringVar and convert it to a float.
|
||||
x_value = float(x.get())
|
||||
|
||||
# Compute the floating point value of y.
|
||||
y_value = log(x_value)
|
||||
|
||||
# Convert this to a formatted string, and store it in the y StringVar.
|
||||
y.set('%.6f' % y_value)
|
||||
|
||||
# Bind an event to the x_entry box: pressing <Enter> will calculate the
|
||||
# logarithm of whatever number the user has typed.
|
||||
x_entry.bind('<Return>', compute_y)
|
||||
|
||||
# Create a button to perform the calculation and pack it into the frame.
|
||||
compute = Tkinter.Button(frame, text=' is ', command=compute_y)
|
||||
compute.pack(side='left')
|
||||
|
||||
# Create a text box that displays the value of the y StringVar.
|
||||
y_label = Tkinter.Label(frame, textvariable=y, width=8)
|
||||
y_label.pack(side='left')
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Activate the window.
|
||||
# -----------------------------------------------------------------------------
|
||||
root.mainloop()
|
||||
26
sandwicherie.py
Normal file
26
sandwicherie.py
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
def pain(type="sésame"):
|
||||
def creerWrapper(contenu):
|
||||
def wrapper(*args, **kwargs):
|
||||
print(f"</''''''''\> ({type})")
|
||||
contenu(*args, **kwargs)
|
||||
print("</________\>")
|
||||
return wrapper
|
||||
|
||||
return creerWrapper
|
||||
|
||||
|
||||
def garniture(dessus="salade", dessous="tomate"):
|
||||
def creerWrapper(principal):
|
||||
def wrapper(*args, **kwargs):
|
||||
print((f"---;;;;;;--- ({dessus})"))
|
||||
principal(*args, **kwargs)
|
||||
print((f"---======--- ({dessous})"))
|
||||
return wrapper
|
||||
|
||||
return creerWrapper
|
||||
|
||||
|
||||
@pain(type="blanc")
|
||||
@garniture("concombre", "lardon")
|
||||
def sandwich(ingrédient="jambon"):
|
||||
print(f"---alimnt--- ({ingrédient})")
|
||||
Loading…
Reference in a new issue