2017-08-30 5 views
0

Comment puis-je modifier une variable dans une définition? J'ai cherché sur Internet mais je n'ai pas pu trouver quelque chose qui m'aide. J'ai découvert que les variables globales pourraient aider mais je ne sais pas comment les employer et j'ai un autre problème mon code ne réagit même pas à mon "bouton d'espace". Voici mon code complet je sais qu'ils écrivent ne postent pas tout de votre code ur mais peut-être cela vous aidera parce que je ne comprends pas même ce qui est important et non. noob qui sait juste tkinter).Comment puis-je modifier une variable dans une définition

from pygame import * 
import pygame as pygame 
from tkinter import * 
import tkinter as tk 
from time import sleep 

#--------------------------------------- 

HEIGHT = 500 

WIDTH = 500 

window = Tk() 

window.title("Test") 

canvas = Canvas(window, width=WIDTH, height=HEIGHT, bg="grey") 

canvas.pack(expand=False) 

#--------------------------------------- 

a = (5, 5) 
b = (85, 85) 
c = (415, 415) 
d = (495, 495) 
e = (5, 415) 
f = (85, 495) 

player = canvas.create_rectangle([a, b], tags="obj1Tag", fill = "red4") 
finish = canvas.create_rectangle([c, d], tags="obj2Tag", fill = "green4") 
arrow = canvas.create_rectangle([e, f], tags="obj3Tag", fill = "blue4") 

#--------------------------------------- 

mainloopon = True 
start = False 
start2 = False 
startwindow = True 
pms = 0.015625 
arrow_direction = ("None") 

#--------------------------------------- 

def start(event): 
    start = True 
    print ("start") 

canvas.bind('<space>', start) 

#--------------------------------------- 

colors = {"red":"blue4", 
      "blue4":"yellow", 
      "yellow":"green", 
      "green":"red"} 


def onObjectClick(event): 
    current_color = canvas.itemcget(arrow, "fill") 
    print (canvas.itemconfig(arrow, "fill")) 
    canvas.itemconfig(arrow, fill=colors[current_color]) 

canvas.tag_bind(arrow, '<ButtonPress-1>', onObjectClick) 

#--------------------------------------- 

while mainloopon == True: 

    if startwindow == True: 
     window.update() 

     if start2 == True: 
      if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'blue4'): 
       arrow_direction = ("right") 

      if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'red'): 
       arrow_direction = ("left") 


      if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'yellow'): 
       arrow_direction = ("up") 

      if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'green'): 
       arrow_direction = ("down") 

    if start == True: 
     canvas.move(player, 0, [pms]) 
     window.update() 
     #sleep(0.0001) 
     playerc = canvas.coords(player) 
     arrowc = canvas.coords(arrow) 

     if playerc == arrowc: 
      start = False 
      start2 = True 

    if arrow_direction == ("right"): 
     canvas.move(player, [pms], 0) 
     window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("left"): 
     canvas.move(player, [-pms], 0) 
     window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("up"): 
     canvas.move(player, 0, [-pms]) 
     window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("down"): 
     canvas.move(player, 0, [pms]) 
     window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

window.mainloop() 

Edit:

WIDTH = 500 

window = Tk() 

window.title("Test") 

canvas = Canvas(window, width=WIDTH, height=HEIGHT, bg="grey") 

canvas.pack(expand=False) 

#--------------------------------------- 

a = (5, 5) 
b = (85, 85) 
c = (415, 415) 
d = (495, 495) 
e = (5, 415) 
f = (85, 495) 

player = canvas.create_rectangle([a, b], tags="obj1Tag", fill = "red4") 
finish = canvas.create_rectangle([c, d], tags="obj2Tag", fill = "green4") 
arrow = canvas.create_rectangle([e, f], tags="obj3Tag", fill = "blue4") 

#--------------------------------------- 

mainloopon = True 
start = False 
start2 = False 
startwindow = True 
pms = 0.015625 
arrow_direction = ("None") 

#--------------------------------------- 

def change_start(event): 
    global start 
    start = True 
    print (start) 

canvas.bind('<space>', change_start) 

#--------------------------------------- 

colors = {"red":"blue4", 
      "blue4":"yellow", 
      "yellow":"green", 
      "green":"red"} 


def onObjectClick(event): 
    current_color = canvas.itemcget(arrow, "fill") 
    print (canvas.itemconfig(arrow, "fill")) 
    canvas.itemconfig(arrow, fill=colors[current_color]) 

canvas.tag_bind(arrow, '<ButtonPress-1>', onObjectClick) 

#--------------------------------------- 

while mainloopon == True: 

    if startwindow == True: 
     window.update() 

    if start2 == True: 
     if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'blue4'): 
      arrow_direction = ("right") 

     if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'red'): 
      arrow_direction = ("left") 


     if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'yellow'): 
      arrow_direction = ("up") 

     if canvas.itemconfig(arrow, "fill") == ('fill', '', '', '', 'green'): 
      arrow_direction = ("down") 

    if start == True: 
     canvas.move(player, 0, [pms]) 
     #window.update() 
     #sleep(0.0001) 
     playerc = canvas.coords(player) 
     arrowc = canvas.coords(arrow) 

     if playerc == arrowc: 
      start = False 
      start2 = True 

    if arrow_direction == ("right"): 
     canvas.move(player, [pms], 0) 
     #window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("left"): 
     canvas.move(player, [-pms], 0) 
     #window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("up"): 
     canvas.move(player, 0, [-pms]) 
     #window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

    if arrow_direction == ("down"): 
     canvas.move(player, 0, [pms]) 
     #window.update() 
     #sleep(0.01) 
     playerc = canvas.coords(player) 
     finishc = canvas.coords(finish) 

     if playerc == finishc: 
      print ("Finished") 
      break 

window.mainloop() 
+1

Vous devriez jeter un oeil à [demander] et [MCVE] – pvg

+0

Ah et comment puis-je faire un bloc de code sans ajouter 4 espaces dans chaque ligne? – HelpMe

+1

Pour le bloc de code, vous pouvez coller votre code puis surligner le code, puis appuyer sur le bouton qui ressemble '{}' ou pres 'ctrl + k' cela va tout déplacer dans un bloc de code. –

Répondre

0

Fournir quelques informations en ce qui concerne votre déclaration:

J'ai découvert que les variables globales pourraient aider, mais je ne sais pas comment les utiliser

Voici un exemple simple de la façon dont vous travaillez avec des variables dans le monde n Ame espace de l'intérieur d'une fonction.

Nous devons utiliser l'identificateur global à l'intérieur de chaque fonction qui doit fonctionner avec une variable globale.

some_var = "test" 
some_var2 = "test2" 

def change_global_var(): 
    global some_var, some_var2 # any variable names go here separated by a comma 
    some_var = "Test Complete" 
    some_var2 = "Test Complete" 

change_global_var() 

print(some_var, some_var2) 

Pour vous prochain numéro:

le code ne réagit même pas à mon « Espace-Button »

Le problème est lié au fait que vous avez une fonction nommée début et une variable. Ce n'est pas une bonne idée. Aussi, vous devez dire à votre fonction où chercher la variable start si ce n'est pas strictement une variable locale à la fonction. Vous devriez plutôt changer la fonction:

def start(event): 
    start = True 
    print ("start") 

Pour:

# can be any function name just don't use names you have already used. 
def change_start(event): 

    global start # tells the function that start is in the global namespace 
    start = True 
    print ("start") 

MISE À JOUR:

Un problème avec binds et la toile est lie ne fonctionnera pas sur des objets dessinés, sauf si la liaison est pour une souris Cliquez sur. Cela a à voir avec focus ne pas être possible sur les objets dessinés. Vous devrez donc lier la barre d'espace à la fenêtre racine à la place. Ou le cadre dans lequel se trouve la toile fonctionnera si vous utilisez des cadres.

Change:

canvas.bind('<space>', change_start) 

Pour:

window.bind('<space>', change_start) 

Cela devrait résoudre votre problème avec la barre d'espace.

+0

Toujours ne fonctionne pas je l'ai essayé et il ya beaucoup de gens qui disent que vous ne devriez pas utiliser des variables globales (je ne sais pas pourquoi) pourriez-vous m'expliquer cela? Et thx – HelpMe

+0

@HelpMe L'utilisation de global est parfois nécessaire lors de l'écriture d'un programme sans utiliser de classes et certains types de globals sont très bien. Voici un lien vers une bonne réponse à propos des variables globales et pourquoi elles sont considérées comme mauvaises. [Pourquoi les variables globales sont-elles mauvaises?] (Https://stackoverflow.com/questions/19158339/why-are-global-variables-evil) –

+0

@HelpMe et qu'avez-vous exactement essayé? Avez-vous changé tout ce que j'ai mentionné ou seulement les globals? –