0% found this document useful (0 votes)
74 views

Codigo Python v4

The document discusses using the wxPython library to create a graphical user interface (GUI) for a 3D visualization program created with VPython. It describes adding buttons, sliders, menus, and other widgets to a window containing a 3D display and graph. Functions are defined to handle events from these widgets and control the visualization, such as rotating a 3D cube or changing its color.

Uploaded by

okokok1226
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
74 views

Codigo Python v4

The document discusses using the wxPython library to create a graphical user interface (GUI) for a 3D visualization program created with VPython. It describes adding buttons, sliders, menus, and other widgets to a window containing a 3D display and graph. Functions are defined to handle events from these widgets and control the visualization, such as rotating a 3D cube or changing its color.

Uploaded by

okokok1226
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as RTF, PDF, TXT or read online on Scribd
You are on page 1/ 7

from __future__ import division, print_function

from visual import *

from visual.graph import *

import wx

# wx is the wxPython library (see wxpython.org)

# wxPython is a Python library that makes it possible to create

# windows and handle events cross-platform, with native look-and-feel on

# Windows, Mac, and Linux. This program widgets.py uses VPython to handle

# 3D graphics, and wxPython statements to create buttons, sliders, etc.

# Among the documentation mentioned at wxpython.org, a particularly

# useful reference manual is docs.wxwidgets.org/3.0. At that site, the

# section "Categories" gives a useful overview of the components of wxPython,

# and the category "Controls" describes all the things you can do with

# buttons, sliders, etc.

# When you see "wxButton" that actually means wx.Button, after importing

# wx. The wxPython library is based on wxWidgets, a library for C++ programs,

# and the documentation for wxPython and wxWidgets is very similar.

# Because most wxPython classes inherit attributes and methods from

# other, more general wxPython classes, investigate the parent classes to

# learn about capabilities that may not be mentioned explicitly in the

# inheriting class.

# For simplicity, this program places various widgets at specific

# positions within the window. However, wxPython also offers the


# option to allow it to rearrange the positioning of widgets as

# a function of window size and shape. A good tutorial on wxPython,

# which includes a discussion of "Layout Management", is found at

# zetcode.com/wxpython.

# Functions that are called on various events

def setleft(evt): # called on "Rotate left" button event

cube.dir = -1

def setright(evt): # called on "Rotate right" button event

cube.dir = 1

def sethide(evt): # called on "Hide for 3 s" button event

w.visible = False

sleep(3)

w.visible = True

def setfull(evt): # called on "Full screen for 3 s" button event

w.fullscreen = True

sleep(3)

w.fullscreen = False

def leave(evt): # called on "Exit under program control" button event

exit()

def setred(evt): # called by "Make red" menu item

cube.color = color.red

t1.SetSelection(0) # set the top radio box button (red)


def setcyan(evt): # called by "Make cyan" menu item

cube.color = color.cyan

t1.SetSelection(1) # set the bottom radio box button (cyan)

def togglecubecolor(evt): # called by radio box (a set of two radio buttons)

choice = t1.GetSelection()

if choice == 0: # upper radio button (choice = 0)

cube.color = color.red

else: # lower radio button (choice = 1)

cube.color = color.cyan

def cuberate(value):

cube.dtheta = 2*value*pi/1e4

def setrate(evt): # called on slider events

value = s1.GetValue()

cuberate(value) # value is min-max slider position, 0 to 100

L = 320

Hgraph = 400

# Create a window. Note that w.win is the wxPython "Frame" (the window).

# window.dwidth and window.dheight are the extra width and height of the window

# compared to the display region inside the window. If there is a menu bar,

# there is an additional height taken up, of amount window.menuheight.

# The default style is wx.DEFAULT_FRAME_STYLE; the style specified here

# does not enable resizing, minimizing, or full-sreening of the window.

w = window(width=2*(L+window.dwidth),
height=L+window.dheight+window.menuheight+Hgraph,
menus=True, title='Widgets',

style=wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX)

# Place a 3D display widget in the left half of the window.

d = 20

disp = display(window=w, x=d, y=d, width=L-2*d, height=L-2*d, forward=-vector(0,1,2))

gdisplay(window=w, y=disp.height+50, width=2*(L+window.dwidth), height=Hgraph)

cube = box(color=color.red)

# Place buttons, radio buttons, a scrolling text object, and a slider

# in the right half of the window. Positions and sizes are given in

# terms of pixels, and pos(0,0) is the upper left corner of the window.

p = w.panel # Refers to the full region of the window in which to place widgets

wx.StaticText(p, pos=(d,4), size=(L-2*d,d), label='A 3D canvas',

style=wx.ALIGN_CENTRE | wx.ST_NO_AUTORESIZE)

left = wx.Button(p, label='Rotate left', pos=(L+10,15))

left.Bind(wx.EVT_BUTTON, setleft)

right = wx.Button(p, label='Rotate right', pos=(1.5*L+10,15))

right.Bind(wx.EVT_BUTTON, setright)

hide = wx.Button(p, label='Hide for 3 s', pos=(L+10,50))

hide.Bind(wx.EVT_BUTTON, sethide)

full = wx.Button(p, label='Full screen for 3 s', pos=(1.5*L+10,50))

full.Bind(wx.EVT_BUTTON, setfull)
exit_program = wx.Button(p, label='Exit under program control', pos=(L+70,200))

exit_program.Bind(wx.EVT_BUTTON, leave)

t1 = wx.RadioBox(p, pos=(1.0*L,0.3*L), size=(0.25*L, 0.25*L),

choices = ['Red', 'Cyan'], style=wx.RA_SPECIFY_ROWS)

t1.Bind(wx.EVT_RADIOBOX, togglecubecolor)

# On the Mac, wx.TextCtrl is resized when the window is resized.

# This resizing does not occur on Windows or Linux. Unlike for

# wx.StaticText used above, there is no wx.ST_NO_AUTORESIZE option.

tc = wx.TextCtrl(p, pos=(1.4*L,90), value='You can type here:\n',

size=(150,90), style=wx.TE_MULTILINE)

tc.SetInsertionPoint(len(tc.GetValue())+1) # position cursor at end of text

tc.SetFocus() # so that keypresses go to the TextCtrl without clicking it

# Note that disp.canvas.SetFocus() will put disp in keyboard focus.

s1 = wx.Slider(p, pos=(1.0*L,0.8*L), size=(0.9*L,20), minValue=0, maxValue=100)

s1.Bind(wx.EVT_SCROLL, setrate)

wx.StaticText(p, pos=(1.0*L,0.75*L), label='Set rotation rate')

# Create a menu of options (Rotate right, Rotate right, Make red, Make cyan).

# Currently, menus do not work on the Macintosh.

m = w.menubar # Refers to the menubar, which can have several menus

menu = wx.Menu()

item = menu.Append(-1, 'Rotate left', 'Make box rotate to the left')

w.win.Bind(wx.EVT_MENU, setleft, item)


item = menu.Append(-1, 'Rotate right', 'Make box rotate to the right')

w.win.Bind(wx.EVT_MENU, setright, item)

item = menu.Append(-1, 'Make red', 'Make box red')

w.win.Bind(wx.EVT_MENU, setred, item)

item = menu.Append(-1, 'Make cyan', 'Make box cyan')

w.win.Bind(wx.EVT_MENU, setcyan, item)

# Add this menu to an Options menu next to the default File menu in the menubar

m.Append(menu, 'Options')

# Initializations

s1.SetValue(70) # update the slider

cuberate(s1.GetValue()) # set the rotation rate of the cube

cube.dir = -1 # set the rotation direction of the cube

# Add a graph to the window

funct1 = gcurve(color=color.cyan)

funct2 = gvbars(delta=0.5, color=color.red)

funct3 = gdots(color=color.yellow)

for t in arange(-30, 74, 1):

funct1.plot( pos=(t, 5.0+5.0*cos(-0.2*t)*exp(0.015*t)) )

funct2.plot( pos=(t, 2.0+5.0*cos(-0.1*t)*exp(0.015*t)) )

funct3.plot( pos=(t, 5.0*cos(-0.03*t)*exp(0.015*t)) )

# A VPython program that uses these wxPython capabilities should always end

# with an infinite loop containing a rate statement, as future developments


# may require this to keep a display active. It can be as simple as

# while True: rate(1)

while True:

rate(100)

cube.rotate(axis=(0,1,0), angle=cube.dir*cube.dtheta)

You might also like