Scale, Tkinter, garder une valeur

Messages postés
8
Date d'inscription
jeudi 24 octobre 2019
Statut
Membre
Dernière intervention
29 octobre 2019
-
Bonjour,

J'aimerai savoir si c'était possible, dans le widget Scale, de mettre une valeur f venue d'une fonction, et de garder cette même valeur tout en utilisant "command" qui changera un entier dans une fonction qui doit aussi utiliser f.
En somme, j'aimerai que ceci marche : (je sais que ça ne marche pas mais c'est pour expliquer plus simplement)

Valeur=IntVar()
Scale (fen,orient='horizontal', from_=10, to=365, resolution=10, tickinterval=50, length=350, 
label='nombre de bout de plastique au début', relief='raised', width=10,variable=Valeur, 
command = lambda i : dessinertrajetplastique(renverser(), int(i))).pack(side = LEFT and BOTTOM)


Ici, j'aimerai changer l'entier i dans dessinertrajetplastique sans changer f qui est égal à ma fonction renverser().

J'ai aussi pensé à cela (qui ne marche pas) :
f = renverser()

Valeur=IntVar()
Scale (fen,orient='horizontal', from_=10, to=365, resolution=10, tickinterval=50, length=350, 
label='nombre de bout de plastique au début', relief='raised', width=10,variable=Valeur, 
command = lambda i : dessinertrajetplastique(f, int(i))).pack(side = LEFT and BOTTOM)
Afficher la suite 

3 réponses

0
Merci
Bonsoir,

Je vais essayer de comprendre, car ce que tu exposes n'est pas clair.
Tu veux définir la valeur du scale depuis une fonction ?
Ça, c'est pas très complexe, soit avec une variable tkinter et sa méthode set, soit en passant par la méthode set du scale.

... et de garder cette même valeur tout en utilisant "command" qui changera un entier dans une fonction qui doit aussi utiliser f.

Là, je ne suis pas sûr d'avoir bien compris.
Est-ce que tu voudrais que lorsque valeur du scale est changé, une fonction soit appelée ? Un déclencheur ? Si c'est ça, les variables tkinter disposent d'un tel mécanisme avec leur méthode trace.
Commenter la réponse de khrug
Messages postés
8
Date d'inscription
jeudi 24 octobre 2019
Statut
Membre
Dernière intervention
29 octobre 2019
0
Merci
Effectivement, j'ai oublié de préciser un détail assez important : renverser() utilise des fonctions random, donc ne renvoie pas toujours la même chose. J'aimerai que, une fois cette fonction appelée, son résultat (=f) ne varie plus.

Si j'écris mon code comme cela :

Valeur=IntVar()
Scale (fen,orient='horizontal', from_=10, to=365, resolution=10, tickinterval=50, length=350, 
label='nombre de bout de plastique au début', relief='raised', width=10,variable=Valeur, 
command = lambda i : dessinertrajetplastique(renverser(), int(i))).pack(side = LEFT and BOTTOM)

dès que je vais bouger la valeur du Scale, la fonction dessinertrajetplastique va RE-appeler renverser, et donc prendra une nouvelle valeur de renverser(), ce que je ne veux pas.

Chose étrange de plus :
Dans mon premier commentaire, j'avais dit que
f = renverser()

Valeur=IntVar()
Scale (fen,orient='horizontal', from_=10, to=365, resolution=10, tickinterval=50, length=350, 
label='nombre de bout de plastique au début', relief='raised', width=10,variable=Valeur, 
command = lambda i : dessinertrajetplastique(f, int(i))).pack(side = LEFT and BOTTOM)
ne fonctionnait pas. Il marche actuellement alors que je n'ai rien changé...

Au final, mon problème est résolu, sans trop savoir le pourquoi du comment
Qu'est ce qui t'empêche de faire une fonction intermédiaire qui enregistrera la valeur de l'appel à renverser(), pusi d'appeler dessinertrajetplastique en lui passant en paramètre cette valeur ?

Quelque chose comme

import tkinter as tk
import random

def renverser():
    return random.choice('abcderghijklmnop')

def dessinertrajetplastique(renversement, i):
    label['text'] = '{} {}'.format(renversement, i)

retour_appel_renverser = None
def scale_command(i):
    global retour_appel_renverser
    if retour_appel_renverser is None:
        retour_appel_renverser = renverser()
    dessinertrajetplastique(retour_appel_renverser, i)

master = tk.Tk()

scale = tk.Scale(master, from_=1, to=10, command=lambda i: scale_command(i))
scale.pack()

label = tk.Label(master)
label.pack()

master.mainloop()
Commenter la réponse de helena8686
Messages postés
8
Date d'inscription
jeudi 24 octobre 2019
Statut
Membre
Dernière intervention
29 octobre 2019
0
Merci
Si je fais comme vous me dites, j'ai le message d'erreur
File "<stdin>", line 1, in <lambda>
  File "<stdin>", line 3, in scale_command
NameError: name 'retour_appel_renverser' is not defined
Bonjour,

Si je fais un copié/collé du code que j'ai posté et que je l'exécute, je n'ai pas le problème que tu mentionnes.
Là, ça voudrait dire que tu as enlevé la 1ère ligne avec global dans la fonction...
Commenter la réponse de helena8686