name "change" is not defined kivy - python
so basically what this code should do is have a button that, when clicked, changes the variable z, which = 0.5, to z - 0.5.
def change(self, obj):
z = z - 0.1
return z
def __init__(self, **kwargs):
x = randint(1,10)
print (x)
y = 'water.png'
if x==1:
y = 'a.png'
if x==2:
y = 'b.png'
if x==3:
y = 'c.png'
if x==4:
y = 'd.png'
if x==5:
y = 'e.png'
if x==6:
y = 'f.png'
if x==7:
y = 'g.png'
if x==8:
y = 'h.png'
if x==9:
y = 'i.png'
if x==10:
y = 'j.png'
z = 0.5
super(MyBackground, self).__init__(**kwargs)
with self.canvas:
btnworking = Button(text = "opacity50%")
btnworking.bind(on_press=change)
self.add_widget(btnworking)
Color(1, 1, 1, 0.5)
self.bg = Rectangle(source=y, pos=self.pos, size=self.size)
self.bind(pos=self.update_bg)
self.bind(size=self.update_bg)
def update_bg(self, *args):
self.bg.pos = self.pos
self.bg.size = self.size
it says the name change isnt defined when i call it on the button
Related
How do you make an animation on Tkinter occur every time you hit the spacebar?
I am trying to create a "Basketball game" using python and tkinter and I'm having trouble making my animation work. When I press the spacebar the basketball appears but it doesnt go upwards. I tried placing self.status.shoot == Status.shoot in multiple areas but the animation doesn't start once I hit the spacebar, instead the image of the basketball simply appears without movement. Any thoughts? Here is my code: model.py import enum,math,random,time # sizes of each images (pixels) from Projects.MVC import controller backboard1_height = 150 backboard1_width = 150 backboard2_height = 150 backboard2_width = 150 backboard3_height = 150 backboard3_width = 150 bg_height = 750 bg_width = 1000 floor_height = 180 floor_width = 1000 player_height = 250 player_width = 250 ball_height = 50 ball_width = 50 class Status(enum.Enum): run = 1 pause = 2 game_over = 3 terminate = 4 shoot = 5 class HorizontalDirection(enum.IntEnum): left = -1 none = 0 right = 1 class VerticalDirection(enum.IntEnum): up = -1 none = 0 down = 1 class ImgDirection(enum.Enum): left = -1 right = 1 class GameModel: def __init__(self): self.status = Status.pause self.elements = [] self.next_time = time.time() # when we try drop a ball # create elements self.bg = Background(bg_width / 2, bg_height / 2) self.floor = Floor(bg_width / 2, bg_height - (floor_height / 2)) self.backboard1 = Backboard1(bg_width / 2, player_height / 2) self.backboard2 = Backboard2(bg_width / 10, player_height / 2) self.backboard3 = Backboard3((bg_width / 2) + 400, player_height / 2) self.player = Player(bg_width / 2, bg_height - floor_height ) self.text = TextInfo(80, 30) self.init_elements() def init_elements(self): # layer images on top of each other in order for every thing to be seen self.elements = [] self.elements.append(self.bg) self.elements.append(self.floor) self.elements.append(self.backboard1) self.elements.append(self.backboard2) self.elements.append(self.backboard3) self.elements.append(self.player) self.elements.append(self.text) def add_ball(self): ball = Ball(self.player.x, self.player.y-125) print("first self.player.y: {}".format(self.player.y)) #if self.status == Status.shoot: self.elements.append(ball) def random_ball_drop(self): # if self.status == Status.shoot: if self.next_time - time.time() < -2: # if self.status == Status.shoot: self.next_time = time.time() + 2 self.add_ball() print("First time: {}".format(time.time())) print("first Add.ball: {}".format(self.add_ball())) #if self.status == Status.shoot: elif self.next_time - time.time() < 0: if random.uniform(0, 1) < 0.01: self.next_time = time.time() + 2 self.add_ball() print("Second time: {}".format(time.time())) def check_status(self, element): if type(element) is Ball: dist = math.sqrt((element.x - self.backboard1.x) ** 2 + (element.y - self.backboard1.y) ** 2) if dist < self.backboard1.catch_radius: self.text.score += 1 return False elif element.y >= bg_height: self.text.lives -= 1 print("Text.lives: {}".format(self.text.lives)) return False return True def remove_ball(self): self.elements = [e for e in self.elements if self.check_status(e)] #print("self.element: {}".format(self.elements)) def update(self): # if self.status == Status.shoot: for element in self.elements: element.update() #print("first element.update: {}".format(element.update())) # if self.status == Status.shoot: self.random_ball_drop() self.remove_ball() print("Random_ball_drop from update block: {}".format(self.random_ball_drop())) print("remove_ball: {}".format(self.remove_ball())) def change_to_initial_state(self): self.init_elements() for e in self.elements: e.change_to_initial_position() class GameElement: def __init__(self, x, y, direction_x, direction_y, speed): self.initial_x = x self.initial_y = y self.x = x self.y = y self.direction_x = direction_x self.direction_y = direction_y self.speed = speed def change_to_initial_position(self): self.x = self.initial_x self.y = self.initial_y def update(self): pass class Background(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, 0) class Floor(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, 0) class Backboard1(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, 0) self.catch_radius = (backboard1_height / 2) + (ball_height / 2) + 10 class Backboard2(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, 0) self.catch_radius = (backboard2_height / 2) + (ball_height / 2) + 10 class Backboard3(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, 0) self.catch_radius = (backboard3_height / 2) + (ball_height / 2) + 10 class Player(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, speed=6) self.img_direction = ImgDirection.left def update(self): if self.direction_x == HorizontalDirection.left: if self.x > 0: self.move() elif self.direction_x == HorizontalDirection.right: if self.x < bg_width: self.move() def move(self): self.x += self.direction_x * self.speed self.direction_x = HorizontalDirection.none class Ball(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.up, speed=10) def update(self): self.y += self.direction_y*self.speed print("This is self.y: {}".format(self.y)) class TextInfo(GameElement): def __init__(self, x, y): super().__init__(x, y, HorizontalDirection.none, VerticalDirection.none, speed=0) self.score = 0 self.lives = 3 def change_to_initial_position(self): self.score = 0 self.lives = 3 super().change_to_initial_position() controller.py from model import * class GameController: def __init__(self, model): self.model = model pass def start_new_game(self): self.model.change_to_initial_state() self.model.status = Status.run def continue_game(self): self.model.status = Status.run print(Status.run) def exit_game(self): self.model.status = Status.terminate def press_p(self, event): if self.model.status == Status.run: self.model.status = Status.pause print(Status.pause) def press_left(self, event): self.model.player.direction_x = HorizontalDirection.left self.model.player.img_direction = ImgDirection.left print(HorizontalDirection.left) def press_right(self, event): self.model.player.direction_x = HorizontalDirection.right self.model.player.img_direction = ImgDirection.right print(HorizontalDirection.right) def press_space(self, event): if self.model.status == Status.run: self.model.status = Status.shoot self.model.update() print(Status.shoot) def update_model(self): if self.model.status == Status.run: self.model.update() view.py import tkinter as tk from PIL import ImageTk, Image from model import * class GameImages: def __init__(self): # background self.bg_pil_img = Image.open('./resources/bg.png') self.bg_img = ImageTk.PhotoImage(self.bg_pil_img) # floor self.floor_pil_img = Image.open('./resources/floor.png') self.floor_img = ImageTk.PhotoImage(self.floor_pil_img) # backboard1 self.backboard1_pil_img = Image.open('./resources/backboard1.png') self.backboard1_pil_img = self.backboard1_pil_img.resize((backboard1_height, backboard1_width)) self.backboard1_img = ImageTk.PhotoImage(self.backboard1_pil_img) # backboard2 self.backboard2_pil_img = Image.open('./resources/backboard2.png') self.backboard2_pil_img = self.backboard2_pil_img.resize((backboard2_height, backboard2_width)) self.backboard2_img = ImageTk.PhotoImage(self.backboard2_pil_img) # backboard3 self.backboard3_pil_img = Image.open('./resources/backboard3.png') self.backboard3_pil_img = self.backboard1_pil_img.resize((backboard3_height, backboard3_width)) self.backboard3_img = ImageTk.PhotoImage(self.backboard3_pil_img) # player self.player_pil_img = Image.open('./resources/player.png') self.player_pil_img_right = self.player_pil_img.resize((player_height, player_width)) self.player_pil_img_left = self.player_pil_img_right.transpose(Image.FLIP_LEFT_RIGHT) self.player_img_right = ImageTk.PhotoImage(self.player_pil_img_right) self.player_img_left = ImageTk.PhotoImage(self.player_pil_img_left) # ball self.ball_pil_img = Image.open('./resources/ball.png') self.ball_pil_img = self.ball_pil_img.resize((ball_height, ball_width)) self.ball_img = ImageTk.PhotoImage(self.ball_pil_img) def get_image(self, element): if type(element) is Background: return self.bg_img if type(element) is Floor: return self.floor_img if type(element) is Backboard1: return self.backboard1_img if type(element) is Backboard2: return self.backboard2_img if type(element) is Backboard3: return self.backboard3_img if type(element) is Player: if element.img_direction == ImgDirection.left: return self.player_img_left else: return self.player_img_right if type(element) is Ball: return self.ball_img return None class DisplayGame: def __init__(self, canvas, _id): self.canvas = canvas self.id = _id def delete_from_screen(self): self.canvas.delete(self.id) class DisplayGameImage(DisplayGame): def __init__(self, canvas, element, img): super().__init__(canvas, canvas.create_image(element.x, element.y, image=img)) class DisplayGameText(DisplayGame): def __init__(self, canvas, element): text = "Score: %d\nLives: %d" % (element.score, element.lives) super().__init__(canvas, canvas.create_text(element.x, element.y, font='12', text=text)) class DisplayMenu(DisplayGame): def __init__(self, root, canvas, controller): menu = tk.Frame(root, bg='grey', width=400, height=40) menu.pack(fill='x') new_game = tk.Button(menu, text="New Game", width=15, height=2, font='12', command=controller.start_new_game) new_game.pack(side="top") continue_game = tk.Button(menu, text="Continue", width=15, height=2, font='12', command=controller.continue_game) continue_game.pack(side="top") exit_game = tk.Button(menu, text="Exit Game", width=15, height=2, font='12', command=controller.exit_game) exit_game.pack(side="top") _id = canvas.create_window(bg_width / 2, bg_height / 2, window=menu) super().__init__(canvas, _id) class GameView: def __init__(self, model, controller): self.model = model self.controller = controller # root self.root = tk.Tk() self.root.title('Basketball Game') # load images files self.images = GameImages() # canvas self.canvas = tk.Canvas(self.root, width= bg_width, height= bg_height) self.canvas.pack() self.root.update() # canvas elements id self.elements_id = [] self.add_elements_to_canvas() self.add_event_handlers() self.is_menu_open = False self.draw() self.root.mainloop() def add_elements_to_canvas(self): for e in self.model.elements: if type(e) is TextInfo: self.elements_id.append(DisplayGameText(self.canvas, e)) else: self.elements_id.append(DisplayGameImage(self.canvas, e, self.images.get_image(e))) if self.model.status == Status.pause or self.model.status == Status.game_over: self.elements_id.append(DisplayMenu(self.root, self.canvas, self.controller)) self.is_menu_open = True def add_event_handlers(self): self.root.bind("<Left>", self.controller.press_left) self.root.bind("<Right>", self.controller.press_right) self.root.bind("p", self.controller.press_p) self.root.bind("<space>",self.controller.press_space) def draw(self): self.controller.update_model() if self.model.status == Status.run or not self.is_menu_open: self.is_menu_open = False self.canvas.delete("all") self.add_elements_to_canvas() if self.model.status == Status.terminate: self.root.destroy() else: self.canvas.after(5, self.draw)
Python: How do I generate minecraft style terrain with pyglet?
I'm currently trying to make a Minecraft clone using pyglet and python for fun, and I found a nice tutorial which I used to create a player class with movement, and a 3D block that generates in the scene. Now I want to create some sort of a terrain, I read about terrain generating and I stumbled upon a function called "noise function" which seems to fit nicely with one I'm trying to do. sadly I don't really know how to implement it. :( At first I tried to generate a flat terrain by creating a function in the Model class which contains the code that creates a cube, and then I create a loop that generates all the numbers between 1 and 20 for example, and use them as values to the cube function. but it didn't work so i had to remove it :( I do think that it might be too soon to implement a terrain with the noise function seeing the stage I'm currently in. so creating an endless flat terrain that do work will be good as well :D If you want to check the program, You'll need to press 'E' when you run the code to enable a mouse lock, which will let you to move the mouse and the player in the scene. Here is the code I have: from pyglet.gl import * from pyglet.window import key import math import random from random import * class Model: def get_tex(self, file): tex = pyglet.image.load(file).texture glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) return pyglet.graphics.TextureGroup(tex) def __init__(self): self.top = self.get_tex('grass_top.png') self.side = self.get_tex('grass_side.png') self.bottom = self.get_tex('dirt.png') self.batch = pyglet.graphics.Batch() tex_coords = ('t2f', (0, 0, 1, 0, 1, 1, 0, 1,)) x, y, z = randint(0, 5), randint(0, 5), -1 X, Y, Z = x+1, y+1, z+1 self.batch.add(4, GL_QUADS, self.side, ('v3f', (x, y, z, x, y, Z, x, Y, Z, x, Y, z,)), tex_coords) self.batch.add(4, GL_QUADS, self.side, ('v3f', (X, y, Z, X, y, z, X, Y, z, X, Y, Z,)), tex_coords) self.batch.add(4, GL_QUADS, self.bottom, ('v3f', (x, y, z, X, y, z, X, y, Z, x, y, Z,)), tex_coords) self.batch.add(4, GL_QUADS, self.top, ('v3f', (x, Y, Z, X, Y, Z, X, Y, z, x, Y, z, )), tex_coords) self.batch.add(4, GL_QUADS, self.side, ('v3f', (X, y, z, x, y, z, x, Y, z, X, Y, z, )), tex_coords) self.batch.add(4, GL_QUADS, self.side, ('v3f', (x, y, Z, X, y, Z, X, Y, Z, x, Y, Z, )), tex_coords) def draw(self): self.batch.draw() class Player: def __init__(self, pos=(0, 0, 0), rot=(0, 0)): self.pos = list(pos) self.rot = list(rot) def mouse_motion(self, dx, dy): dx /= 8 dy /= 8 self.rot[0] += dy self.rot[1] -= dx if self.rot[0] > 90: self.rot[0] = 90 elif self.rot[0] < -90: self.rot[0] = -90 def update(self, dt, keys): s = dt*10 rotation_y = -self.rot[1]/180*math.pi dx, dz = s*math.sin(rotation_y), s*math.cos(rotation_y) if keys[key.W]: self.pos[0] += dx self.pos[2] -= dz if keys[key.S]: self.pos[0] -= dx self.pos[2] += dz if keys[key.A]: self.pos[0] -= dz self.pos[2] -= dx if keys[key.D]: self.pos[0] += dz self.pos[2] += dx if keys[key.SPACE]: self.pos[1] += s if keys[key.LSHIFT]: self.pos[1] -= s class Window(pyglet.window.Window): def push(self, pos, rot): glPushMatrix() glRotatef(-rot[0], 1, 0, 0) glRotatef(-rot[1], 0, 1, 0) glTranslatef(-pos[0], -pos[1], -pos[2],) def Projection(self): glMatrixMode(GL_PROJECTION) glLoadIdentity() def Model(self): glMatrixMode(GL_MODELVIEW) glLoadIdentity() def set2d(self): self.Projection() gluOrtho2D(0, self.width, 0, self.height) self.Model() def set3d(self): self.Projection() gluPerspective(70, self.width / self.height, 0.05, 1000) self.Model() def setLock(self, state): self.lock = state; self.set_exclusive_mouse(state) lock = False; mouse_lock = property(lambda self: self.lock, setLock) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.set_minimum_size(300, 200) self.keys = key.KeyStateHandler() self.push_handlers(self.keys) pyglet.clock.schedule(self.update) self.model = Model() self.player = Player((0.5, 1.5, 1.5), (-30, 0)) def on_mouse_motion(self, x, y, dx, dy): if self.mouse_lock: self.player.mouse_motion(dx, dy) def on_key_press(self, KEY, MOD): if KEY == key.ESCAPE: self.close() elif KEY == key.E: self.mouse_lock = not self.mouse_lock def update(self, dt): self.player.update(dt, self.keys) def on_draw(self): self.clear() self.set3d() self.push(self.player.pos, self.player.rot) self.model.draw() glPopMatrix() if __name__ == '__main__': window = Window(width=854, height=480, caption='Minecraft', resizable=True) glClearColor(0.5, 0.7, 1, 1) glEnable(GL_DEPTH_TEST) # glEnable(GL_CULL_FACE) pyglet.app.run() My project use's some images to create the dirt texture. so here is a link to a website which has the images and the main program which you can see above you: http://www.mediafire.com/file/7iolhmh1hqj9516/Basic+Pyglet+Cube.rar I already tried to generate more then one block using a list and recalling a function
You could create a function to show a block at the given position and with the texture texture: def show_block(self, position, texture): top = texture[0] side = texture[1] bottom = texture[2] x, y, z = position X, Y, Z = x+1,y+1, z+1 tex_coords = ('t2f', (0, 0, 1, 0, 1, 1, 0, 1,)) self.batch.add(4, GL_QUADS, side, ('v3f', (x, y, z, x, y, Z, x, Y, Z, x, Y, z,)), tex_coords) self.batch.add(4, GL_QUADS, side, ('v3f', (X, y, Z, X, y, z, X, Y, z, X, Y, Z,)), tex_coords) self.batch.add(4, GL_QUADS, bottom, ('v3f', (x, y, z, X, y, z, X, y, Z, x, y, Z,)), tex_coords) self.batch.add(4, GL_QUADS, top, ('v3f', (x, Y, Z, X, Y, Z, X, Y, z, x, Y, z, )), tex_coords) self.batch.add(4, GL_QUADS, side, ('v3f', (X, y, z, x, y, z, x, Y, z, X, Y, z, )), tex_coords) self.batch.add(4, GL_QUADS, side, ('v3f', (x, y, Z, X, y, Z, X, Y, Z, x, Y, Z, )), tex_coords) Then you could use perlin to generate terrain: class Perlin: def __call__(self,x,y): return (self.noise(x*self.f,y*self.f)+1)/2 def __init__(self,seed=None): self.f = 15/512; self.m = 65535; p = list(range(self.m)) if seed: random.seed(seed) random.shuffle(p); self.p = p+p def fade(self,t): return t*t*t*(t*(t*6-15)+10) def lerp(self,t,a,b): return a+t*(b-a) def grad(self,hash,x,y,z): h = hash&15; u = y if h&8 else x v = (x if h==12 or h==14 else z) if h&12 else y return (u if h&1 else -u)+(v if h&2 else -v) def noise(self,x,y,z=0): p,fade,lerp,grad = self.p,self.fade,self.lerp,self.grad xf,yf,zf = math.floor(x),math.floor(y),math.floor(z) X,Y,Z = xf%self.m,yf%self.m,zf%self.m x-=xf; y-=yf; z-=zf u,v,w = fade(x),fade(y),fade(z) A = p[X ]+Y; AA = p[A]+Z; AB = p[A+1]+Z B = p[X+1]+Y; BA = p[B]+Z; BB = p[B+1]+Z return lerp(w,lerp(v,lerp(u,grad(p[AA],x,y,z),grad(p[BA],x-1,y,z)),lerp(u,grad(p[AB],x,y-1,z),grad(p[BB],x-1,y-1,z))), lerp(v,lerp(u,grad(p[AA+1],x,y,z-1),grad(p[BA+1],x-1,y,z-1)),lerp(u,grad(p[AB+1],x,y-1,z-1),grad(p[BB+1],x-1,y-1,z-1)))) After all these changes, your code should look somewhat like this: from pyglet.gl import * from pyglet.window import key,mouse from collections import deque import sys, os, time, math, random class Perlin: def __call__(self,x,y): return int(sum(self.noise(x*s,y*s)*h for s,h in self.perlins)*self.avg) def __init__(self): self.m = 65536; p = list(range(self.m)); random.shuffle(p); self.p = p+p p = self.perlins = tuple((1/i,i) for i in (16,20,22,31,32,64,512) for j in range(2)) self.avg = 8*len(p)/sum(f+i for f,i in p) def fade(self,t): return t*t*t*(t*(t*6-15)+10) def lerp(self,t,a,b): return a+t*(b-a) def grad(self,hash,x,y,z): h = hash&15; u = y if h&8 else x v = (x if h==12 or h==14 else z) if h&12 else y return (u if h&1 else -u)+(v if h&2 else -v) def noise(self,x,y,z=0): p,fade,lerp,grad = self.p,self.fade,self.lerp,self.grad xf,yf,zf = math.floor(x),math.floor(y),math.floor(z) X,Y,Z = xf%self.m,yf%self.m,zf%self.m x-=xf; y-=yf; z-=zf u,v,w = fade(x),fade(y),fade(z) A = p[X ]+Y; AA = p[A]+Z; AB = p[A+1]+Z B = p[X+1]+Y; BA = p[B]+Z; BB = p[B+1]+Z return lerp(w,lerp(v,lerp(u,grad(p[AA],x,y,z),grad(p[BA],x-1,y,z)),lerp(u,grad(p[AB],x,y-1,z),grad(p[BB],x-1,y-1,z))), lerp(v,lerp(u,grad(p[AA+1],x,y,z-1),grad(p[BA+1],x-1,y,z-1)),lerp(u,grad(p[AB+1],x,y-1,z-1),grad(p[BB+1],x-1,y-1,z-1)))) class Model: alpha_textures = 'leaves_oak','tall_grass' def load_textures(self): t = self.texture = {}; self.texture_dir = {}; dirs = ['textures'] while dirs: dir = dirs.pop(0); textures = os.listdir(dir) for file in textures: if os.path.isdir(dir+'/'+file): dirs+=[dir+'/'+file] else: n = file.split('.')[0]; self.texture_dir[n] = dir; image = pyglet.image.load(dir+'/'+file) transparent = n in self.alpha_textures texture = image.texture if transparent else image.get_mipmapped_texture() self.texture[n] = pyglet.graphics.TextureGroup(texture) if not transparent: glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST_MIPMAP_LINEAR) glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST) self.block = {}; self.ids = []; done = [] items = sorted(self.texture_dir.items(),key=lambda i:i[0]) for name,dir in items: n = name.split(' ')[0] if n in done: continue done+=[n] if dir.startswith('textures/blocks'): self.ids+=[n] if dir=='textures/blocks': self.block[n] = t[n],t[n],t[n],t[n],t[n],t[n] elif dir=='textures/blocks/tbs': self.block[n] = t[n+' s'],t[n+' s'],t[n+' b'],t[n+' t'],t[n+' s'],t[n+' s'] elif dir=='textures/blocks/ts': self.block[n] = t[n+' s'],t[n+' s'],t[n+' t'],t[n+' t'],t[n+' s'],t[n+' s'] self.ids+=['water'] flow,still = t['water_flow'],t['water_still'] self.block['water'] = flow,flow,still,still,flow,flow def draw(self): glEnable(GL_ALPHA_TEST); self.opaque.draw(); glDisable(GL_ALPHA_TEST) glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); self.transparent.draw() glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); self.transparent.draw() def update(self,dt): self.cubes.water.update(dt) def __init__(self): self.opaque = pyglet.graphics.Batch() self.transparent = pyglet.graphics.Batch() self.load_textures() self.cubes = CubeHandler(self) perlin = Perlin() for x in range(64): for z in range(64): y = perlin(x,z) self.cubes.add((x,-y,-z),'grass') for i in range(1,3): self.cubes.add((x,-i-y,-z),'dirt') for cube in self.cubes.cubes.values(): self.cubes.update_cube(cube) class Water: def __init__(self,transparent): self.transparent = transparent self.time = {'still':TimeLoop(32),'flow':TimeLoop(32)} self.coords = {'still':[],'flow':[]}; self.still_faces = {}; self.flow_faces = {} for i in range(32-1,-1,-1): y0 = i/16; y1 = (i+1)/16; self.coords['still'] += [[0,y0, 1,y0, 1,y1, 0,y1]] y0 = i/32; y1 = (i+1)/32; self.coords['flow'] += [[0,y0, 1,y0, 1,y1, 0,y1]] a,b = self.time['still'],self.time['flow']; self.t = b,b,a,a,b,b a,b = self.coords['still'],self.coords['flow']; self.c = b,b,a,a,b,b def update(self,dt): if self.time['still'].update(dt*0.5): for face,i in self.still_faces.items(): face.tex_coords = self.c[i][self.t[i].int] if self.time['flow'].update(dt): for face,i in self.flow_faces.items(): face.tex_coords = self.c[i][self.t[i].int] def show(self,v,t,i): face = self.transparent.add(4,GL_QUADS,t,('v3f',v),('t2f',self.c[i][0])) faces = self.still_faces if i==2 or i==3 else self.flow_faces faces[face] = i; return face class CubeHandler: def __init__(self,model): self.model = model self.opaque,self.transparent = model.opaque,model.transparent self.block,self.alpha_textures = model.block,model.alpha_textures self.water = Water(self.transparent) self.cubes = {} def hit_test(self,p,vec,dist=256): if normalize(p) in self.cubes: return None,None m = 8; x,y,z = p; dx,dy,dz = vec dx/=m; dy/=m; dz/=m; prev = None for i in range(dist*m): key = normalize((x,y,z)) if key in self.cubes: return key,prev prev = key x,y,z = x+dx,y+dy,z+dz return None,None def show(self,v,t,i): return self.opaque.add(4,GL_QUADS,t,('v3f',v),('t2f',(0,0, 1,0, 1,1, 0,1))) def update_cube(self,cube): if not any(cube.shown.values()): return show = self.water.show if cube.name=='water' else self.show v = cube_vertices(cube.p) f = 'left','right','bottom','top','back','front' for i in (0,1,2,3,4,5): if cube.shown[f[i]] and not cube.faces[f[i]]: cube.faces[f[i]] = show(v[i],cube.t[i],i) def set_adj(self,cube,adj,state): x,y,z = cube.p; X,Y,Z = adj; d = X-x,Y-y,Z-z; f = 'left','right','bottom','top','back','front' for i in (0,1,2): if d[i]: j = i+i; a,b = [f[j+1],f[j]][::d[i]]; cube.shown[a] = state if not state and cube.faces[a]: cube.faces[a].delete(); face = cube.faces[a]; cube.faces[a] = None; self.remove_water(face) def add(self,p,t,now=False): if p in self.cubes: return cube = self.cubes[p] = Cube(t,p,self.block[t],'alpha' if t in self.alpha_textures else 'blend' if t=='water' else 'solid') for adj in adjacent(*cube.p): if adj not in self.cubes: self.set_adj(cube,adj,True) else: a,b = cube.type,self.cubes[adj].type if a==b and (a=='solid' or b=='blend'): self.set_adj(self.cubes[adj],cube.p,False) elif a!='blend' and b!='solid': self.set_adj(self.cubes[adj],cube.p,False); self.set_adj(cube,adj,True) if now: self.update_cube(cube) def remove_water(self,face): if face in self.water.still_faces: del self.water.still_faces[face] elif face in self.water.flow_faces: del self.water.flow_faces[face] def remove(self,p): if p not in self.cubes: return cube = self.cubes.pop(p) for side,face in cube.faces.items(): if face: face.delete() self.remove_water(face) for adj in adjacent(*cube.p): if adj in self.cubes: self.set_adj(self.cubes[adj],cube.p,True) self.update_cube(self.cubes[adj]) class Cube: def __init__(self,name,p,t,typ): self.name,self.p,self.t,self.type = name,p,t,typ self.shown = {'left':False,'right':False,'bottom':False,'top':False,'back':False,'front':False} self.faces = {'left':None,'right':None,'bottom':None,'top':None,'back':None,'front':None} class TimeLoop: def __init__(self,duration): self.unit = 0; self.int = 0; self.duration = duration; self.prev = 0 def update(self,dt): self.unit+=dt; self.unit-=int(self.unit); self.int = int(self.unit*self.duration) if self.prev!=self.int: self.prev = self.int; return True def cube_vertices(pos,n=0.5): x,y,z = pos; v = tuple((x+X,y+Y,z+Z) for X in (-n,n) for Y in (-n,n) for Z in (-n,n)) return tuple(tuple(k for j in i for k in v[j]) for i in ((0,1,3,2),(5,4,6,7),(0,4,5,1),(3,7,6,2),(4,0,2,6),(1,5,7,3))) def flatten(lst): return sum(map(list,lst),[]) def normalize(pos): x,y,z = pos; return round(x),round(y),round(z) def adjacent(x,y,z): for p in ((x-1,y,z),(x+1,y,z),(x,y-1,z),(x,y+1,z),(x,y,z-1),(x,y,z+1)): yield p class Player: WALKING_SPEED = 5 FLYING_SPEED = 15 GRAVITY = 20 JUMP_SPEED = (2*GRAVITY)**.5 TERMINAL_VELOCITY = 50 def push(self): glPushMatrix(); glRotatef(-self.rot[0],1,0,0); glRotatef(self.rot[1],0,1,0); glTranslatef(-self.pos[0],-self.pos[1],-self.pos[2]) def __init__(self,cubes,pos=(0,0,0),rot=(0,0)): self.cubes = cubes self.pos,self.rot = list(pos),list(rot) self.flying = True self.noclip = True self.dy = 0 def mouse_motion(self,dx,dy): dx/=8; dy/=8; self.rot[0]+=dy; self.rot[1]+=dx if self.rot[0]>90: self.rot[0] = 90 elif self.rot[0]<-90: self.rot[0] = -90 def jump(self): if not self.dy: self.dy = self.JUMP_SPEED def get_sight_vector(self): rotX,rotY = self.rot[0]/180*math.pi,self.rot[1]/180*math.pi dx,dz = math.sin(rotY),-math.cos(rotY) dy,m = math.sin(rotX),math.cos(rotX) return dx*m,dy,dz*m def update(self,dt,keys): DX,DY,DZ = 0,0,0; s = dt*self.FLYING_SPEED if self.flying else dt*self.WALKING_SPEED rotY = self.rot[1]/180*math.pi dx,dz = s*math.sin(rotY),s*math.cos(rotY) if self.flying: if keys[key.LSHIFT]: DY-=s if keys[key.SPACE]: DY+=s elif keys[key.SPACE]: self.jump() if keys[key.W]: DX+=dx; DZ-=dz if keys[key.S]: DX-=dx; DZ+=dz if keys[key.A]: DX-=dz; DZ-=dx if keys[key.D]: DX+=dz; DZ+=dx if dt<0.2: dt/=10; DX/=10; DY/=10; DZ/=10 for i in range(10): self.move(dt,DX,DY,DZ) def move(self,dt,dx,dy,dz): if not self.flying: self.dy -= dt*self.GRAVITY self.dy = max(self.dy,-self.TERMINAL_VELOCITY) dy += self.dy*dt x,y,z = self.pos self.pos = self.collide((x+dx,y+dy,z+dz)) def collide(self,pos): if self.noclip and self.flying: return pos pad = 0.25; p = list(pos); np = normalize(pos) for face in ((-1,0,0),(1,0,0),(0,-1,0),(0,1,0),(0,0,-1),(0,0,1)): for i in (0,1,2): if not face[i]: continue d = (p[i]-np[i])*face[i] if d<pad: continue for dy in (0,1): op = list(np); op[1]-=dy; op[i]+=face[i]; op = tuple(op) if op in self.cubes: p[i]-=(d-pad)*face[i] if face[1]: self.dy = 0 break return tuple(p) class Window(pyglet.window.Window): def set2d(self): glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0,self.width,0,self.height) def set3d(self): glLoadIdentity(); gluPerspective(65,self.width/self.height,0.1,320); glMatrixMode(GL_MODELVIEW); glLoadIdentity() def on_resize(self,w,h): glViewport(0,0,w,h); self.load_vertex_lists(w,h) def setLock(self,state): self.set_exclusive_mouse(state); self.mouseLock = state mouseLock = False; mouse_lock = property(lambda self:self.mouseLock,setLock) def __init__(self,*args): super().__init__(*args) pyglet.clock.schedule(self.update) self.keys = pyglet.window.key.KeyStateHandler() self.push_handlers(self.keys) self.model = Model() self.player = Player(self.model.cubes.cubes) self.mouse_lock = True self.fps = pyglet.clock.ClockDisplay() self.reticle = None self.block = 0 def load_vertex_lists(self,w,h): x,y = w/2,h/2; m = 10 if self.reticle: self.reticle.delete() self.reticle = pyglet.graphics.vertex_list(4,('v2f',(x-m,y, x+m,y, x,y-m, x,y+m)),('c3f',(0,0,0, 0,0,0, 0,0,0, 0,0,0))) self.water = pyglet.graphics.vertex_list(4,('v2f',(0,0, w,0, w,h, 0,h)),('c4f',[0.15,0.3,1,0.5]*4)) def update(self,dt): self.player.update(dt,self.keys) self.model.update(dt) def on_mouse_motion(self,x,y,dx,dy): if self.mouse_lock: self.player.mouse_motion(dx,dy) def on_mouse_press(self,x,y,button,MOD): if button == mouse.LEFT: block = self.model.cubes.hit_test(self.player.pos,self.player.get_sight_vector())[0] if block: self.model.cubes.remove(block) elif button == mouse.RIGHT: block = self.model.cubes.hit_test(self.player.pos,self.player.get_sight_vector())[1] if block: self.model.cubes.add(block,self.model.ids[self.block],True) def on_key_press(self,KEY,MOD): if KEY == key.ESCAPE: self.dispatch_event('on_close') elif KEY == key.E: self.mouse_lock = not self.mouse_lock elif KEY == key.F: self.player.flying = not self.player.flying; self.player.dy = 0; self.player.noclip = True elif KEY == key.C: self.player.noclip = not self.player.noclip elif KEY == key.UP: self.block = (self.block-1)%len(self.model.ids) elif KEY == key.DOWN: self.block = (self.block+1)%len(self.model.ids) def on_draw(self): self.clear() self.set3d() self.player.push() self.model.draw() block = self.model.cubes.hit_test(self.player.pos,self.player.get_sight_vector())[0] if block: glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); glColor3d(0,0,0) pyglet.graphics.draw(24,GL_QUADS,('v3f/static',flatten(cube_vertices(block,0.52)))) glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glColor3d(1,1,1) glPopMatrix() self.set2d() cubes = self.model.cubes.cubes; p = normalize(self.player.pos) if p in cubes and cubes[p].name=='water': self.water.draw(GL_POLYGON) self.fps.draw() self.reticle.draw(GL_LINES) def main(): window = Window(800,600,'Minecraft',True) glClearColor(0.5,0.7,1,1) glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glAlphaFunc(GL_GEQUAL,1) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA) pyglet.app.run() if __name__ == '__main__': main()
how to change opacity of image kivy
How do I change the transparency of the images to 50%? class MyBackground(Widget): def __init__(self, **kwargs): x = randint(1,10) print (x) y = 'water.png' if x==1: y = 'a.png' if x==2: y = 'b.png' if x==3: y = 'c.png' if x==4: y = 'd.png' if x==5: y = 'e.png' if x==6: y = 'f.png' if x==7: y = 'g.png' if x==8: y = 'h.png' if x==9: y = 'i.png' if x==10: y = 'j.png' super(MyBackground, self).__init__(**kwargs) with self.canvas: self.bg = Rectangle(source=y, pos=self.pos, size=self.size) self.bind(pos=self.update_bg) self.bind(size=self.update_bg) how do I do this without changing the rgb value? if I try it just ends up white.
Did you try with self.canvas: self.opacity = 0.5 self.bg = Rectangle(source=y, pos=self.pos, size=self.size) self.bind(pos=self.update_bg) self.bind(size=self.update_bg) Reference: http://kivy.org/docs/api-kivy.graphics.instructions.html#kivy.graphics.instructions.Canvas.opacity
In your kivy file make these modifications Color: rgb: (1, 1, 1,a) Check this link in docs Image color, in the format (r, g, b, a). Where 'a' is alpha. Setting the alpha part to the opacity level you want will give you image opacity.
Nested Widget's canvas do not draw anything
I've got two three nested widget which handle the on_touch_down event, clicking on the first parent, the event is sensed to the second and then the third. With this click the third widget should draw on it's canvas but this it's not happening. I understand the dynamic of the canvas object and it's groups. So I don't really understand why this is happening class Spline_guide(DragBehavior, Button): def __init__(self, **kw): super(Spline_guide, self).__init__(**kw) self.bind(pos = self.update_spline , size = self.update_spline) def update_spline(self, *l): self.pos = self.parent.pos return self def show_spline(self,*l): print 'show spline' with self.canvas: Color(0,1,0) ######## THIS ISTRUCTION DOESN'T WORK Ellipse(pos = (100,100), size = (100,100)) return self def hide_spline(self, *l): print 'hide spline' self.canvas.clear() return self class Editable_point(DragBehavior, Widget): def __init__(self, name,x,y, **kw): super(Editable_point, self).__init__(**kw) self.drag_rectangle = (0,0 ,800,300) self.drag_timeout = 10000000 self.drag_distance = 0 self.name = name self.pos = (x - DOT_DIMENSION / 2,y - DOT_DIMENSION / 2) self.size = (DOT_DIMENSION, DOT_DIMENSION) self.spline = Spline_guide() self.add_widget(self.spline) self.SHOW_SPLINE = False self.bind(pos = self.check_pos) def check_pos(self, *l): self.area = self.parent.parent self.x = self.x if self.x > self.area.x else self.area.x self.y = self.y if self.y > self.area.y else self.area.y return self def draw_point(self): self.area = self.parent.parent self.drag_rectangle = (self.area.x, self.area.y, self.area.width, self.area.height) self.canvas.clear() with self.canvas: Color(1,0,0) Ellipse(pos=self.pos, size=self.size) return self def on_enter(self, pop): def wrap(l): if l.text in ['start','stop']: print 'you can not use start or stop as name' pop.dismiss() return wrap if self.name in ['start','stop']: pop.dismiss() print 'you can not edit the name of start or stop point' return wrap self.name = l.text pop.dismiss() return wrap def show_info(self, *l): graph = self.parent.parent.graph X_OFFSET = graph._plot_area.x + self.parent.x - DOT_DIMENSION / 2 Y_OFFSET = graph._plot_area.y + self.parent.y - DOT_DIMENSION / 2 _x = self.x - X_OFFSET _y = self.y - Y_OFFSET x, y = normalize(graph.xmin,graph.ymin,graph.xmax,graph.ymax,graph._plot_area.width,graph._plot_area.height, _x, _y) point_name = TextInput(text=self.name, multiline = False) point_info = Popup(title ="X: {} Y: {}".format(x,y), content = point_name, size_hint=(None,None), size=(200,100)) point_name.bind(on_text_validate=self.on_enter(point_info)) point_info.open() return self def on_touch_down(self, *l): if self.SHOW_SPLINE: self.SHOW_SPLINE = False self.spline.hide_spline() else: self.SHOW_SPLINE = True self.spline.show_spline() return self class Editable_line(Widget): def __init__(self, **kw): super(Editable_line, self).__init__(**kw) self._old_ = [100,100] self.old_pos = [0,0] self.bind(pos=self.update_line, size=self.update_line) def replace_start_stop(self, new_elem): elem = filter(lambda x: x.name == new_elem.name, [ i for i in self.children if hasattr(i,'name')]) if elem: self.remove_widget(elem[0]) self.add_widget(new_elem) return self def update_points(self): r_x = float(Window.size[0]) / float(self._old_[0]) r_y = float(Window.size[1]) / float(self._old_[1]) for p in [ i for i in self.children if hasattr(i,'name')]: new_x = p.x * r_x new_y = p.y * r_y p.x = new_x p.y = new_y p.size = (DOT_DIMENSION, DOT_DIMENSION) return self def update_line(self, *a): self.pos = self.parent.pos self.size = self.parent.size self.parent.graph.pos = self.pos self.parent.graph.size = self.size self.parent.graph._redraw_size() #Coordinate per start e stop personalizzare sul graph y = self.parent.graph._plot_area.y + self.y x = self.parent.graph._plot_area.x + self.x h = self.parent.graph._plot_area.height w = self.parent.graph._plot_area.width self.replace_start_stop(Editable_point('start', x, y + h / 2)) self.replace_start_stop(Editable_point('stop', x + w, y + h / 2)) self.update_points() self._old_ = Window.size return self.draw_line() def sort_points(self): self.children = sorted(self.children , key=attrgetter('x')) return self def control_presence(self,coordinates): x = int(coordinates.x) y = int(coordinates.y) x_range = range(x-DOT_DIMENSION, x+DOT_DIMENSION) y_range = range(y-DOT_DIMENSION, y+DOT_DIMENSION) for p in [ i for i in self.children if hasattr(i,'name')]: if int(p.x) in x_range and int(p.y) in y_range: return p return False def on_touch_down(self,coordinates): #add points p = self.control_presence(coordinates) if p: if not coordinates.is_double_tap: return p.on_touch_down(coordinates) return p.show_info(coordinates) x = int(coordinates.x) y = int(coordinates.y) p = Editable_point('new point', x, y) p.size = (DOT_DIMENSION, DOT_DIMENSION) self.add_widget(p) return self.draw_line() def remove_point(self,coordinates): p = self.control_presence(coordinates) if p: if p.name in ['start','stop']: print 'you can\'t delete start or stop point' else: self.remove_widget(p) return self.draw_line() def draw_line(self): self.sort_points() self.canvas.before.clear() _l = list() for p in [ i for i in self.children if hasattr(i,'name')]: _l.append(p.x + DOT_DIMENSION/2) _l.append(p.y + DOT_DIMENSION/2) p.draw_point() with self.canvas.before: Color(0,0.8,1) Line(points=_l, witdth = LINE_WIDTH) return self def on_touch_move(self, coordinates): p = self.control_presence(coordinates) if p: if p.name in ['start','stop']: return self.parent.on_touch_up(coordinates) p.on_touch_move(coordinates) self.draw_line() return self This is a piece of my code and show how the classes are linked. The Spline_guide doesn't draw anything. Ideas?
Widgets which are added to another Widget are drawn in the latter Widget's canvas. When you call self.canvas.clear() (i.e. in Editable_point) you are removing all the child canvases. You could use canvas.before or canvas.after for your drawing instead, or you can save the instructions and modify them later: def __init__(self, **kwargs): ... with self.canvas: self.draw_color = Color(0, 1, 0, 1) self.draw_ellipse = Ellipse(pos=self.pos, size=self.size) def draw_point(self): ... self.draw_ellipse.pos = self.pos self.draw_ellipse.size = self.size Then you never need to clear the canvas at all. This is the preferred solution as it offers the best performance.
How do I import a gif in Tkinter?
So I have this maze code, and it's really cool but when you play you move around a red square. Is there a way that I can change this red square that moves around into an image, instead of where it says return "red" I want to put this personaje.gif file so a little person can appear moving through the maze. this is my code: import random import Tkinter as tk import sys from PIL import Image, ImageTk class Application(tk.Frame): def __init__(self, width=600, height=600, size=600): tk.Frame.__init__(self) self.maze = Maze(width, height) personaje = Image.open("personaje.gif") photo = ImageTk.PhotoImage(personaje) self.size = size self.steps = 0 self.grid() self.create_widgets() self.draw_maze() self.create_events() def create_widgets(self): width = self.maze.width * self.size height = self.maze.height * self.size self.canvas = tk.Canvas(self, width=width, height=height) self.canvas.grid() self.status = tk.Label(self) self.status.grid() def draw_maze(self): for i, row in enumerate(self.maze.maze): for j, col in enumerate(row): x0 = j * self.size y0 = i * self.size x1 = x0 + self.size y1 = y0 + self.size color = self.get_color(x=j, y=i) id = self.canvas.create_rectangle(x0, y0, x1, y1, width=0, fill=color) if self.maze.start_cell == (j, i): self.cell = id self.canvas.tag_raise(self.cell) # bring to front self.status.config(text='Movidas mÃnimas: %d' % self.maze.steps) def create_events(self): self.canvas.bind_all('<KeyPress-Up>', self.move_cell) self.canvas.bind_all('<KeyPress-Down>', self.move_cell) self.canvas.bind_all('<KeyPress-Left>', self.move_cell) self.canvas.bind_all('<KeyPress-Right>', self.move_cell) def move_cell(self, event): if event.keysym == 'Up': if self.check_move(0, -1): self.canvas.move(self.cell, 0, -self.size) self.steps += 1 if event.keysym == 'Down': if self.check_move(0, 1): self.canvas.move(self.cell, 0, self.size) self.steps += 1 if event.keysym == 'Left': if self.check_move(-1, 0): self.canvas.move(self.cell, -self.size, 0) self.steps += 1 if event.keysym == 'Right': if self.check_move(1, 0): self.canvas.move(self.cell, self.size, 0) self.steps += 1 args = (self.steps, self.maze.steps) self.status.config(text='Movimientos %d/%d' % args) self.check_status() def check_move(self, x, y): x0, y0 = self.get_cell_coords() x1 = x0 + x y1 = y0 + y return self.maze.maze[y1][x1] == 0 def get_cell_coords(self): position = self.canvas.coords(self.cell) x = int(position[0] / self.size) y = int(position[1] / self.size) return (x, y) def check_status(self): if self.maze.exit_cell == self.get_cell_coords(): args = (self.steps, self.maze.steps) self.status.config(text='Resuelto en %d/%d movidas!' % args) def get_color(self, x, y): if self.maze.start_cell ==(x,y): return "red" if self.maze.exit_cell == (x, y): return 'green' if self.maze.maze[y][x] == 1: return 'black' class Maze(object): def __init__(self, width=21, height=21, exit_cell=(1, 1)): self.width = width self.height = height self.exit_cell = exit_cell self.create() def create(self): self.maze = [[1] * self.width for _ in range(self.height)] # full of walls self.start_cell = None self.steps = None self.recursion_depth = None self._visited_cells = [] self._visit_cell(self.exit_cell) def _visit_cell(self, cell, depth=0): x, y = cell self.maze[y][x] = 0 # remove wall self._visited_cells.append(cell) neighbors = self._get_neighbors(cell) random.shuffle(neighbors) for neighbor in neighbors: if not neighbor in self._visited_cells: self._remove_wall(cell, neighbor) self._visit_cell(neighbor, depth+1) self._update_start_cell(cell, depth) def _get_neighbors(self, cell): x, y = cell neighbors = [] # Left if x - 2 > 0: neighbors.append((x-2, y)) # Right if x + 2 < self.width: neighbors.append((x+2, y)) # Up if y - 2 > 0: neighbors.append((x, y-2)) # Down if y + 2 < self.height: neighbors.append((x, y+2)) return neighbors def _remove_wall(self, cell, neighbor): x0, y0 = cell x1, y1 = neighbor # Vertical if x0 == x1: x = x0 y = (y0 + y1) / 2 # Horizontal if y0 == y1: x = (x0 + x1) / 2 y = y0 self.maze[y][x] = 0 # remove wall def _update_start_cell(self, cell, depth): if depth > self.recursion_depth: self.recursion_depth = depth self.start_cell = cell self.steps = depth * 2 # wall + cell def show(self, verbose=False): MAP = {0: ' ', # path 1: '#', # wall 2: 'B', # exit 3: 'A', # start } x0, y0 = self.exit_cell self.maze[y0][x0] = 2 x1, y1 = self.start_cell self.maze[y1][x1] = 3 for row in self.maze: print ' '.join([MAP[col] for col in row]) if verbose: print "Steps from A to B:", self.steps if __name__ == '__main__': from optparse import OptionParser parser = OptionParser(description="Random maze game") parser.add_option('-W', '--width', type=int, default=43) parser.add_option('-H', '--height', type=int, default=43) parser.add_option('-s', '--size', type=int, default=11, help="cell size") args, _ = parser.parse_args() for arg in ('width', 'height'): if getattr(args, arg) % 2 == 0: setattr(args, arg, getattr(args, arg) + 1) print "Warning: %s must be odd, using %d instead" % (arg, getattr(args, arg)) sys.setrecursionlimit(5000) app = Application(args.width, args.height, args.size) app.master.title('Maze game') app.mainloop()