Rechercher : dans
Par :

[python/Tk] probleme avec le widget Scale

Dernière réponse le 21 déc 2006 à 08:24:11 Benoit de Longlée, le 19 déc 2006 à 14:53:41 
 Signaler ce message aux modérateurs

Bonjour tout le monde,
Je me suis mis a python/Tk depuis peu et je trouve ça vraiment cool.
En revanche j'ai voulu un soir faire un tout petit script (que j'avais deja fait dans un autre langage) juste pour m'entrainer et là... gros probleme.
incompréhension totale !! :(

en fait c'est simple, je voudrai juste avoir un slider (Scale) qui envoie une commande "xgamma -gamma maValeur" au systeme (LINUX). et je n'y arrive absolument pas !! je trouve vraiment tres tres peu de doc sur ce widget et jamais d'exemple concret....
je vous mets le code , si quelqu'un peut m'aider ça serait genial

PS : en plus il y ades chose que je ne comprend pas, par exemple l'option "orient = HORIZONTAL" que j'ai vu dans plusieurs exemples et qui fonctionnait, ne marche pas dans mon script. la réponse est "HORIZONTAL n'est pas reconnu".

voila , merci d'avance !

import Tkinter

class GammaSlider:
def __init__(self, root):
self.root = root
self.gammaValue = Tkinter.DoubleVar() ; self.gammaValue.set(2.0)
self.initialisation()

def initialisation(self):
Tkinter.Scale(self.root, from_=0, to=3, resolution=0.01, length=400, sliderlength=60, variable=self.gammaValue, command = self.gammaLinker).grid(row=1, columnspan=6)
Tkinter.Button(self.root, width=12, text='0.5').grid(row=2, column=1)
Tkinter.Button(self.root, width=12, text='1.0').grid(row=2, column=2)
Tkinter.Button(self.root, width=12, text='1.5').grid(row=2, column=3)
Tkinter.Button(self.root, width=12, text='2.0').grid(row=2, column=4)
Tkinter.Label(self.root, width=12, text= self.gammaValue.get()).grid(row=2, column=5)

def gammaLinker(self):
valeur = self.gammaValue.get()
print valeur

def main():
root = Tkinter.Tk()
root.title('Gamma Slider')
app = GammaSlider(root)
root.mainloop()

if __name__ == "__main__":
main()

Configuration: Linux
Firefox 1.0.1

Meilleures réponses pour « [python/Tk] probleme avec le widget Scale » dans :
Votre première application graphique avec Python et Glade VoirCe guide vous aidera à créer pas à pas votre première application graphique. Nous allons utiliser le langage de programme Python et l'API graphique GTK, en utilisant le logiciel Glade pour créer facilement les interfaces graphiques. C'est de la...
[Python] Lire et écrire des fichiers CSV VoirLIRE ET ÉCRIRE DES FICHIERS CSV Python www.python.org, dans sa version 2.4 supporte de facto le format CSV (comma-separated values: valeurs séparées par des virgules). La Library Reference est certes très explicative à ce sujet, mais uniquement...
Télécharger Widget Ciné TV VoirRegarder la télé sur votre écran d'ordinateur sans matériels supplémentaires! Il vous suffit uniquement de ce petit gadget ! Widget CineTV est un gadget qui vous permet d'afficher vos programmes TV ou Ciné. Vous avez le choix entre des chaînes pré...
Télécharger Widget eBay VoirWidget eBay est une barre de recherche internationale. Il garde en mémoire les résultats de vos 10 dernières recherches, ce qui vous facilitera la tâche pour suivre les enchères sur eBay. La barre de recherche fonctionne comme une barre de recherche...

1

sebsauvage, le 19 déc 2006 à 16:07:48

PS: Pour la suite, poste ton code Python entre deux balises < code> sinon ça perd l'identation.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

2

sebsauvage, le 19 déc 2006 à 16:12:27

Remplace: def gammaLinker(self):
par: def gammaLinker(self,value):


Quand à la création du Scale(), en ajoutant orient='horizontal' ça marche très bien. :-)

“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

3

Benoit de Longlée, le 19 déc 2006 à 20:01:08

Merci beaucoup pour ces infos.
c'est tout de meme étrange car je n'ai pas trouvé cette syntaxe dans les quelques exemples que j'ai trouvé (notemment un TkinterDemo.py)

un dernier probleme persiste, dasn le code qui suit je n'ai pas trouvé d'autre méthode que de dupliquer mes procedure "gammaSetter", je n'arrive pas a lui envoyer une valeur en argument...
auriez vous une idée svp ?

#!/usr/bin/python
import Tkinter
from os import system

class gamma:
	def __init__(self, root):
		self.root = root
		self.gammaValue = Tkinter.DoubleVar()	; self.gammaValue.set(1.0)
		self.initialisation()
		
	def initialisation(self):
		Tkinter.Scale(self.root, from_=0, to=3, resolution=0.01, length=400, sliderlength=60, orient = 'horizontal', variable=self.gammaValue, showvalue = 0, command = self.gammaLinker).grid(row=1, columnspan=6)
		Tkinter.Button(self.root, width=8, text='0.5', command = self.gammaSetter05).grid(row=2, column=1)
		Tkinter.Button(self.root, width=8, text='Reset', command = self.gammaSetter10).grid(row=2, column=2)
		Tkinter.Button(self.root, width=8, text='1.5', command = self.gammaSetter15).grid(row=2, column=3)
		Tkinter.Button(self.root, width=8, text='2.0', command = self.gammaSetter2).grid(row=2, column=4)
		Tkinter.Label(self.root, width=8, textvariable = self.gammaValue).grid(row=2, column=5)
	
	def gammaLinker(self, value):
		valeur = str(self.gammaValue.get())		
		system('xgamma -gamma '+valeur)
	
	def gammaSetter05(self):
		self.gammaValue.set(0.5)
		system('xgamma -gamma 0.5')
	
	def gammaSetter10(self):
		self.gammaValue.set(1.0)
		system('xgamma -gamma 1.0')
	
	def gammaSetter15(self):
		self.gammaValue.set(1.5)
		system('xgamma -gamma 1.5')
		
	def gammaSetter2(self):
		self.gammaValue.set(2.0)
		system('xgamma -gamma 2.0')
		
def main():
    root = Tkinter.Tk()
    root.title('Gamma Slider')
    app = gamma(root)
    root.mainloop()

if __name__ == "__main__":
    main()

Répondre à Benoit de Longlée

4

sebsauvage, le 20 déc 2006 à 09:36:43

je n'ai pas trouvé d'autre méthode que de dupliquer mes procedure "gammaSetter",

Dans l'immédiat je ne vois pas non plus comment faire, mais je pense que c'est faisable.
“Life is short - You need Python” -- Bruce Eckel, membre du comité ANSI C++

Répondre à sebsauvage

5

teebo, le 20 déc 2006 à 09:42:37

Salut,

Y'a un truc que je ne comprend pas, quel est le problème si tu fais une def gamaSetter(self,value) ?

Sans la politesse, on ne se réunirait que pour se battre.
Il faut donc ou vivre seul ou être poli.

Alphonse Karr

Répondre à teebo

6

Benoit de Longlée, le 20 déc 2006 à 15:42:43

Si je fais ma procedure de la maniere suivante:

def gammaSetter(self, value):
		self.gammaValue.set(value)
		system('xgamma -gamma '+str(value))

et si mes boutons ont comme command:
self.gammaSetter(0.5)
self.gammaSetter(1) etc...

il ne se passe rien.. enfin presque, au lancement du script la valeur se set a 0.5 au lieu de 1 et c'est tout.
les boutons ne n'agissent pas du tout. d'ailleurs je ne comprend pas bien pourquoi.

Répondre à Benoit de Longlée

7

teebo, le 20 déc 2006 à 16:07:21

Logique, il execute la fonction directement et non lors du "pressage" du bouton.
Il faut utiliser un lambda:

Tkinter.Button(self.root, width=8, text='0.5', command = lambda val=0.5: self.gammaSetter(val)).grid(row=2, column=1)
		Tkinter.Button(self.root, width=8, text='Reset', command = lambda val=1.0: self.gammaSetter(val)).grid(row=2, column=2)
		Tkinter.Button(self.root, width=8, text='1.5', command =lambda val=1.5: self.gammaSetter(val)).grid(row=2, column=3)
		Tkinter.Button(self.root, width=8, text='2.0', command =lambda val=2.0: self.gammaSetter(val)).grid(row=2, column=4)
		
Sans la politesse, on ne se réunirait que pour se battre.
Il faut donc ou vivre seul ou être poli.
Alphonse Karr

Répondre à teebo

8

Benoit de Longlée, le 21 déc 2006 à 01:44:10

Merci beaucoup pour l'info ça marche nikel !
En fait je suis un peu surpris de ce concept 'lambda'. dans les autres languages script que j'utilise je n'ai jamais vu un truc comme ça (je ne suis pas developpeur... vous l'aurez compris)

je mets le code definitif pour les intéressés :

class gamma:
	def __init__(self, root):
		self.root = root
		self.gammaValue = Tkinter.DoubleVar()	; self.gammaValue.set(1.0)
		self.initialisation()
		
	def initialisation(self):
		Tkinter.Scale(self.root, from_=0, to=3, resolution=0.01, length=100, sliderlength=30, orient = 'horizontal', variable=self.gammaValue, showvalue = 0, command = self.gammaLinker).grid(row=1, columnspan=6, sticky = 'EW')
		Tkinter.Button(self.root, width=6, text='0.5', command = lambda val = 0.5: self.gammaSetter(val)).grid(row=2, column=1, sticky = 'EW')
		Tkinter.Button(self.root, width=6, text='Reset', command = lambda val = 1: self.gammaSetter(val)).grid(row=2, column=2, sticky = 'EW')
		Tkinter.Button(self.root, width=6, text='1.5', command = lambda val = 1.5: self.gammaSetter(val)).grid(row=2, column=3, sticky = 'EW')
		Tkinter.Button(self.root, width=6, text='2.0', command = lambda val = 2: self.gammaSetter(val)).grid(row=2, column=4, sticky = 'EW')
		saisie	= Tkinter.Entry(self.root, width=6, textvariable = self.gammaValue)
		saisie.grid(row=2, column=5, sticky = 'EW', padx = 5)
		saisie.bind("<Return>", self.gammaLinker)
		
		for i in range(4):
			self.root.grid_columnconfigure(i+1,weight=1)
		
		self.root.resizable(True,False)
	
	def gammaLinker(self, value):
		valeur = str(self.gammaValue.get())		
		system('xgamma -gamma '+valeur)
	
	def gammaSetter(self, value):
		self.gammaValue.set(value)
		system('xgamma -gamma '+str(value))
			
def main():
    root = Tkinter.Tk()
    root.title('Gamma Slider')
    app = gamma(root)
    root.mainloop()

if __name__ == "__main__":
    main()

Répondre à Benoit de Longlée

9

 Obeet, le 21 déc 2006 à 08:24:11

De rien :)
En même temps je dis "logique" mais j'ai du cherché aussi ;)
C'est vieux comme le monde la nouveauté...
Prévert

Répondre à Obeet