Partage
  • Partager sur Facebook
  • Partager sur Twitter

utilisation des valeur de de spinbox

9 août 2015 à 18:50:07

bonjour,

ca fait un moment que je n'est pas touché a python et cela fait plusieurs jour que je bloc sur l’amélioration d'un programme que j'ai fait il y as X ans

ce qui marche :

avec l'aide de Tkinter le programe affiche ce que je lui demande lorsque je le donne dans la consol ce que je veux

programe fonctionnelle

#initialisation

...

....

while toto != 's' :
	print 'que veux tu ?'
	
	toto=float(input())
	i=1	

	while i < octf +1   :
		....calcul avec toto
		can1.create_line(700-X1,700-Y1,700-X2,700-Y2,width=2,fill=coul)
				print X1,X2,Y1,Y2,'\n'
		
		i=i+1
mon_fichierh.close()
fichier.close()

ce que j'aimerais c'est donc utiliser la spinbox pour sélectionné directement les valeurs toto dans le programme (ps j'ai pas mi tout le code car je n'utilise pas de sous programme)

j'ai donc essaye avec

s = Spinbox(fen1,textvariable=Valeur, from_=0, to=90)
s.pack()

toto=float(Valeur.get()

mais bien que j'arrive a faire des print correct de la valeur spinbox je n'arrive pas a l’insérer dans le programme (en testant l’ancienne valeur avec la nouvelle pour pas faire le calcule quant il y a pas de modification

la je vais essayer de voir si je peu rajouté un bouton de validation (également une première pour moi) car a terme j'aimerai bien que mon programme ne nécessite plus l'utilisation de la console

  • Partager sur Facebook
  • Partager sur Twitter
9 août 2015 à 21:58:17

while planZ != 's' :

	
	print 'que veux tu ?'
	coco=float(input())
	tempo=float(Valeur.get()) #float(input())
	while tempo!=toto:
		toto=tempo
		i=1
	while i < octf +1   :
         ....calcul avec toto

voila ou j'en suis,

lorsque je tape cette partie ça marche mais je suis obligé de donnée un input "coco"qui ne sert a rien

lorsque je mes la ligne

coco=float(input()

 entre commentaire j'ai une boucle qui affiche sans fin dans la console mais pas de fenêtre tkinter

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 0:15:22

Salut,

J'arrive pas à comprendre ton problème :o. Qu'est-ce qui ne va pas dans ton code? Pour récupérer la valeur d'un spinbox, il faut utiliser la méthode get() (sur l'instance du spinbox):

import tkinter as tk

fen = tk.Tk()
spin = tk.Spinbox(fen, from_=5, to=10, increment=3)
spin.pack()

#Récupération de la valeur au format str()
spin.get()


Je comprends pas non plus l'emploi de toute ces boucles while. Ne pourrais-tu pas les remplacer par de simples boucles for? Et ce morceau de code a-t-il un sens?:

while tempo!=toto:
    toto=tempo
    i=1
  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien
10 août 2015 à 11:21:07

Bonjour,

merci d'avoir pris un peu de temps a me répondre, j'ai écrit une version plus simple a comprendre et pouvant etre testé

avant cela pour repondre sur la question du while je dirais que je suis pas trop habitué a la boucle for,

le bout de code que j'ai ecrit permet de réinitialisé  la valeur i seulement quant la valeur de toto et de tempo sont different, ainsi si i n'est pas réinitialisé la boucle suivante n'est pas refaite

#-*- coding:Latin-1 -*-
#-*- coding:Utf-8 -*-
import struct
import os
import math
from Tkinter import *

coul = 'dark green' # couleur de la ligne
fen1 = Tk()
can1 = Canvas(fen1,bg='dark grey',height=700,width=800)
fichier = open('test.txt','w')
can1.pack(side=RIGHT)

octf=10

Valeur = StringVar()

s = Spinbox(fen1,textvariable=Valeur, from_=0, to=90)
s.pack()
toto= 0
tempo= 1
i=1
while toto != 's' :

	print 'que veux tu ?'
	coco=float(input())
	toto=float(Valeur.get()) #float(input())
	i=1
	while i < octf +1   :
		can1.create_line(50+10*i,50+10*i+10*toto,100,10+10*toto,width=2,fill=coul)
		i=i+1
#	print tempo

mon_fichierh.close()
fichier.close()
fen1.mainloop()
os.system("pause")

mon problème c'est que je n'arrive pas à me passer du mode console car quant j’enlève

	coco=float(input())

 le programme n'affiche plus la fenêtre TKinter et boucle sur lui même

  • Partager sur Facebook
  • Partager sur Twitter
10 août 2015 à 12:27:33

OK. Ce qu'il faut que tu retienne, c'est qu'un programme console ne fonctionne pas de la même façon qu'un programme interface. Une interface graphique est géré par des événements. Autrement dit, une boucle console comme la suivante n'existe plus dans une interface:

choix = int(input("Que choisissez-vous?: "))

while choix != 0:
    choix = int(input("Que choisissez-vous?: "))

print("Fin du programme")


Ou du moins, elle n'existe plus sous cette forme. Il faut penser différemment. En fait les interfaces graphiques ont leur propre boucle infinie qu'on appelle boucle événementielle. Voici un petit bout de code pour essayer de comprendre:

import tkinter as tk

#Variable contenant les identifiants des rectangles
lst = []

#Fonction associé au bouton val
def valider():
    #Récupération de la valeur du Spinbox
    choix = int(spin.get())

    #On efface les précédents rectangle
    if lst:
        for elt in lst:
            can.delete(elt)

    #Boucle qui affiche les rectangles
    for i in range(choix):
        lst.append(can.create_rectangle(40+i*60, 110, 70+i*60,190))


###Partie interface graphique
fen = tk.Tk()

txt = tk.Label(fen, text="Choix du nombre de rectangle à l'écran")
spin = tk.Spinbox(fen, from_=1, to=5, increment=1)
can = tk.Canvas(fen, width=500, height=300, background="yellow")
val = tk.Button(fen, text="Valider", command=valider)

#Placement des objets
txt.pack()
spin.pack()
can.pack()
val.pack()

#La boucle événementielle
fen.mainloop()


Je te conseille de reprendre un tutoriel sur tkinter pour te remettre dans le bain ^^. Sinon concernant la boucle for, elle te permet d'itérer directement sur les objets d'un itérable. Autrement dit, pas besoin de créer une variable dédiée à l'incrémentation. Les boucles while sont principalement utilisées pour faire des boucles infinies (mais ici tu n'en as pas besoin car l'interface à sa propre boucle infinie):

txt = "Deponia"

#CACA
i = 0
while i < len(txt):
    print(txt[i])
    i += 1

#FRAISE DES BOIS
for i in txt:
    print(i)



-
Edité par Olygrim 10 août 2015 à 12:29:13

  • Partager sur Facebook
  • Partager sur Twitter
Précepte: Le mieux est l'ennemi du bien