1.11M Members

Control visual 3D object with Tkinter buttons

 
4
 

This Python snippet shows how to control a VPython visual 3D sphere with Tkinter GUI toolkit button clicks.

''' vp_tk_threading1.py
using VPython (visual) and Tkinter together
with the help of Python module thread (_thread)
change the position of a 3D sphere in space with tk buttons

get VPython Windows installer
VPython-5.74.win32-py2.7.exe
or
VPython-5.74.win32-py3.2.exe
from
http://www.lfd.uci.edu/~gohlke/pythonlibs/

tested with Python27, Python32 and VPython574 by vegaseat 22feb2013
'''

import visual as vs
try:
    # Python2
    import Tkinter as tk
    import thread
except ImportError:
    # Python3
    import tkinter as tk
    import _thread as thread

# will be global
sphere = None

def vthread():
    global sphere
    vs.scene.title = "Sphere in space (3D drag with right mouse button)"
    vs.scene.autoscale = False
    sphere = vs.sphere(pos=(0, 0, 0), color=vs.color.green)

def move_sphere_incr_x(event=None):
    """
    moves along the original x axis incrementing x
    each time the Tkinter b_incr_x button is pressed
    """
    x, y, z = sphere.pos
    sphere.pos = (x+1, y, z)

def move_sphere_decr_x(event=None):
    """
    moves along the original x axis decrementing x
    each time the Tkinter b_decr_x button is pressed
    """
    x, y, z = sphere.pos
    sphere.pos = (x-1, y, z)

root = tk.Tk()
w = 280
h = 150
x = 450
y = 100
# use width x height + x_offset + y_offset (no spaces!)
root.geometry("%dx%d+%d+%d" % (w, h, x, y))
root.title("Control Sphere from here")

b_incr_x = tk.Button(root, text="move right on x axis (increment x)")
# bind passes an event to function
b_incr_x.bind("<Button-1>", move_sphere_incr_x)
b_incr_x.grid(row=0, column=0, padx=20, pady=10)

b_decr_x = tk.Button(root, text="move left on x axis (decrement x)")
# bind passes an event to function
b_decr_x.bind("<Button-1>", move_sphere_decr_x)
b_decr_x.grid(row=1, column=0, padx=10)

# use thread to do run VPython and Tkinter simultaneously
# thread.start_new_thread(function, args)
# args is an empty tuple here
sphere = thread.start_new_thread(vthread, ())

root.mainloop()
Isn't it about time forums rewarded their contributors?

Earn rewards points for helping others. Gain kudos. Cash out. Get better answers yourself.

It's as simple as contributing editorial or replying to discussions labeled or OP Kudos

You
This is an OP Kudos discussion and contributors may be rewarded
Post:
Start New Discussion
View similar articles that have also been tagged: