From c7c70bc32a298557684c58065bae5a02c1cb72ba Mon Sep 17 00:00:00 2001 From: WMOkiishi Date: Sun, 12 Feb 2023 06:16:52 -0700 Subject: [PATCH] direct: Cut down on usage of `import *` (#1454) * Remove most `import *`s in `direct` * Address feedback --- direct/src/actor/Actor.py | 24 +- direct/src/cluster/ClusterClient.py | 24 +- direct/src/cluster/ClusterConfig.py | 2 +- direct/src/cluster/ClusterMsgs.py | 2 +- direct/src/cluster/ClusterServer.py | 30 +- direct/src/controls/BattleWalker.py | 2 +- direct/src/controls/DevWalker.py | 2 +- direct/src/controls/GravityWalker.py | 17 +- direct/src/controls/NonPhysicsWalker.py | 15 +- direct/src/controls/ObserverWalker.py | 8 +- direct/src/controls/PhysicsWalker.py | 27 +- direct/src/controls/TwoDWalker.py | 7 +- direct/src/directbase/TestStart.py | 3 +- direct/src/directbase/ThreeUpStart.py | 3 +- .../src/directdevices/DirectDeviceManager.py | 11 +- direct/src/directdevices/DirectFastrak.py | 3 +- direct/src/directdevices/DirectJoybox.py | 6 +- direct/src/directdevices/DirectRadamec.py | 3 +- direct/src/directscripts/eggcacher.py | 10 +- direct/src/directtools/DirectCameraControl.py | 46 +- direct/src/directtools/DirectGeometry.py | 22 +- direct/src/directtools/DirectGrid.py | 8 +- direct/src/directtools/DirectLights.py | 12 +- direct/src/directtools/DirectManipulation.py | 106 ++-- direct/src/directtools/DirectSelection.py | 62 ++- direct/src/directtools/DirectSession.py | 61 ++- direct/src/directtools/DirectUtil.py | 2 - direct/src/directutil/Mopath.py | 16 +- direct/src/dist/FreezeTool.py | 2 +- direct/src/dist/icon.py | 2 +- direct/src/distributed/AsyncRequest.py | 3 +- direct/src/distributed/ClientRepository.py | 14 +- .../src/distributed/ClientRepositoryBase.py | 12 +- .../src/distributed/ConnectionRepository.py | 4 +- direct/src/distributed/DistributedCamera.py | 5 +- direct/src/distributed/DistributedCameraOV.py | 2 - .../distributed/DistributedCartesianGrid.py | 7 +- .../distributed/DistributedCartesianGridAI.py | 3 - direct/src/distributed/DistributedObject.py | 3 +- direct/src/distributed/DistributedObjectAI.py | 2 - direct/src/distributed/DistributedObjectUD.py | 2 - .../src/distributed/DistributedSmoothNode.py | 7 +- .../distributed/DistributedSmoothNodeBase.py | 2 +- direct/src/distributed/DoInterestManager.py | 16 +- direct/src/distributed/GridParent.py | 4 +- direct/src/distributed/PyDatagram.py | 24 +- direct/src/distributed/PyDatagramIterator.py | 24 +- direct/src/distributed/SampleObject.py | 4 +- direct/src/distributed/ServerRepository.py | 36 +- direct/src/distributed/TimeManager.py | 3 +- direct/src/distributed/TimeManagerAI.py | 4 +- direct/src/filter/FilterManager.py | 2 +- direct/src/gui/DirectButton.py | 4 +- direct/src/gui/DirectCheckBox.py | 4 +- direct/src/gui/DirectCheckButton.py | 6 +- direct/src/gui/DirectDialog.py | 6 +- direct/src/gui/DirectEntry.py | 4 +- direct/src/gui/DirectEntryScroll.py | 7 +- direct/src/gui/DirectFrame.py | 4 +- direct/src/gui/DirectGuiBase.py | 15 +- direct/src/gui/DirectGuiGlobals.py | 10 +- direct/src/gui/DirectGuiTest.py | 5 +- direct/src/gui/DirectLabel.py | 4 +- direct/src/gui/DirectOptionMenu.py | 7 +- direct/src/gui/DirectRadioButton.py | 6 +- direct/src/gui/DirectScrollBar.py | 6 +- direct/src/gui/DirectScrolledFrame.py | 6 +- direct/src/gui/DirectScrolledList.py | 6 +- direct/src/gui/DirectSlider.py | 6 +- direct/src/gui/DirectWaitBar.py | 4 +- direct/src/gui/OnscreenGeom.py | 2 +- direct/src/gui/OnscreenImage.py | 2 +- direct/src/gui/OnscreenText.py | 2 +- direct/src/interval/ActorInterval.py | 5 +- direct/src/interval/AnimControlInterval.py | 6 +- direct/src/interval/FunctionInterval.py | 5 +- direct/src/interval/IndirectInterval.py | 5 +- direct/src/interval/Interval.py | 4 +- direct/src/interval/IntervalManager.py | 5 +- direct/src/interval/IntervalTest.py | 18 +- direct/src/interval/LerpBlendHelpers.py | 2 +- direct/src/interval/LerpInterval.py | 6 +- direct/src/interval/MetaInterval.py | 6 +- direct/src/interval/MopathInterval.py | 4 +- direct/src/interval/ParticleInterval.py | 3 +- direct/src/interval/ProjectileInterval.py | 5 +- direct/src/interval/ProjectileIntervalTest.py | 5 +- direct/src/interval/SoundInterval.py | 5 +- direct/src/interval/TestInterval.py | 3 +- direct/src/leveleditor/ActionMgr.py | 2 +- direct/src/leveleditor/AnimControlUI.py | 2 - direct/src/leveleditor/AnimMgr.py | 2 +- direct/src/leveleditor/AnimMgrBase.py | 4 +- direct/src/leveleditor/CurveAnimUI.py | 2 - direct/src/leveleditor/CurveEditor.py | 6 +- direct/src/leveleditor/GraphEditorUI.py | 1 - direct/src/leveleditor/LayerEditorUI.py | 1 - direct/src/leveleditor/LevelEditor.py | 16 +- direct/src/leveleditor/LevelEditorBase.py | 26 +- direct/src/leveleditor/LevelEditorUI.py | 2 +- direct/src/leveleditor/LevelEditorUIBase.py | 30 +- direct/src/leveleditor/MayaConverter.py | 2 +- direct/src/leveleditor/ObjectMgr.py | 2 +- direct/src/leveleditor/ObjectMgrBase.py | 5 +- direct/src/leveleditor/ObjectPalette.py | 3 +- direct/src/leveleditor/ObjectPaletteUI.py | 2 +- direct/src/leveleditor/ObjectPropertyUI.py | 6 +- direct/src/leveleditor/PaletteTreeCtrl.py | 2 +- direct/src/leveleditor/ProtoObjsUI.py | 3 +- direct/src/leveleditor/ProtoPalette.py | 2 +- direct/src/leveleditor/ProtoPaletteBase.py | 2 +- direct/src/leveleditor/ProtoPaletteUI.py | 5 +- direct/src/leveleditor/SceneGraphUI.py | 2 +- direct/src/leveleditor/SceneGraphUIBase.py | 4 +- direct/src/leveleditor/testData.py | 2 +- direct/src/motiontrail/MotionTrail.py | 21 +- direct/src/particles/ForceGroup.py | 18 +- direct/src/particles/ParticleEffect.py | 2 +- direct/src/particles/Particles.py | 2 +- direct/src/physics/FallTest.py | 9 +- direct/src/physics/RotationTest.py | 10 +- direct/src/showbase/BufferViewer.py | 23 +- direct/src/showbase/DistancePhasedNode.py | 9 +- direct/src/showbase/EventManager.py | 3 +- direct/src/showbase/ExceptionVarDump.py | 2 +- direct/src/showbase/LeakDetectors.py | 2 +- direct/src/showbase/Loader.py | 20 +- direct/src/showbase/Messenger.py | 2 +- direct/src/showbase/MirrorDemo.py | 14 +- direct/src/showbase/OnScreenDebug.py | 8 +- direct/src/showbase/PhasedObject.py | 2 +- direct/src/showbase/SfxPlayer.py | 2 +- direct/src/showbase/ShadowDemo.py | 2 +- direct/src/showbase/ShadowPlacer.py | 9 +- direct/src/showbase/ShowBase.py | 72 ++- direct/src/showbase/TkGlobal.py | 1 - direct/src/showbase/Transitions.py | 2 +- direct/src/showutil/BuildGeometry.py | 13 +- direct/src/showutil/Effects.py | 9 +- direct/src/showutil/Rope.py | 10 +- direct/src/showutil/TexMemWatcher.py | 24 +- direct/src/showutil/TexViewer.py | 2 +- direct/src/task/Task.py | 17 +- direct/src/task/TaskTester.py | 2 +- direct/src/tkpanels/AnimPanel.py | 100 ++-- direct/src/tkpanels/DirectSessionPanel.py | 260 +++++----- direct/src/tkpanels/FSMInspector.py | 12 +- direct/src/tkpanels/Inspector.py | 50 +- direct/src/tkpanels/MopathRecorder.py | 334 ++++++------ direct/src/tkpanels/ParticlePanel.py | 475 ++++++++++-------- direct/src/tkpanels/Placer.py | 56 +-- direct/src/tkpanels/TaskManagerPanel.py | 48 +- direct/src/tkwidgets/AppShell.py | 115 +++-- direct/src/tkwidgets/Dial.py | 30 +- direct/src/tkwidgets/EntryScale.py | 38 +- direct/src/tkwidgets/Floater.py | 26 +- direct/src/tkwidgets/MemoryExplorer.py | 37 +- direct/src/tkwidgets/ProgressBar.py | 8 +- direct/src/tkwidgets/SceneGraphExplorer.py | 18 +- direct/src/tkwidgets/Slider.py | 50 +- direct/src/tkwidgets/Tree.py | 20 +- direct/src/tkwidgets/Valuator.py | 59 ++- direct/src/tkwidgets/VectorWidgets.py | 18 +- .../src/tkwidgets/WidgetPropertiesDialog.py | 28 +- direct/src/wxwidgets/ViewPort.py | 12 +- direct/src/wxwidgets/WxPandaShell.py | 9 +- direct/src/wxwidgets/WxPandaStart.py | 2 +- direct/src/wxwidgets/WxPandaWindow.py | 9 +- 168 files changed, 1908 insertions(+), 1278 deletions(-) diff --git a/direct/src/actor/Actor.py b/direct/src/actor/Actor.py index e2af9466bc..c9e8b8b8b3 100644 --- a/direct/src/actor/Actor.py +++ b/direct/src/actor/Actor.py @@ -6,7 +6,29 @@ to learn more about loading animated models. __all__ = ['Actor'] -from panda3d.core import * +from panda3d.core import ( + AnimBundleNode, + AnimControlCollection, + Character, + ConfigVariableBool, + DecalEffect, + Filename, + GlobPattern, + LineStream, + LoaderOptions, + LODNode, + ModelNode, + MovingPartBase, + MovingPartMatrix, + NodePath, + PandaNode, + PartBundle, + PartSubset, + Point3, + TransformState, + Vec3, + autoBind, +) from panda3d.core import Loader as PandaLoader from direct.showbase.DirectObject import DirectObject from direct.showbase.Loader import Loader diff --git a/direct/src/cluster/ClusterClient.py b/direct/src/cluster/ClusterClient.py index 44bbc0f860..80e57c16a6 100644 --- a/direct/src/cluster/ClusterClient.py +++ b/direct/src/cluster/ClusterClient.py @@ -1,8 +1,26 @@ """ClusterClient: Master for multi-piping or PC clusters.""" -from panda3d.core import * -from .ClusterMsgs import * -from .ClusterConfig import * +from panda3d.core import ( + ClockObject, + ConnectionWriter, + Point3, + QueuedConnectionManager, + QueuedConnectionReader, + VBase3, + Vec3, + decomposeMatrix, +) +from .ClusterMsgs import ( + CLUSTER_DAEMON_PORT, + CLUSTER_NAMED_MOVEMENT_DONE, + CLUSTER_NAMED_OBJECT_MOVEMENT, + CLUSTER_NONE, + CLUSTER_SERVER_PORT, + CLUSTER_SWAP_READY, + SERVER_STARTUP_STRING, + ClusterMsgHandler, +) +from .ClusterConfig import ClientConfigs from direct.directnotify import DirectNotifyGlobal from direct.showbase import DirectObject from direct.task import Task diff --git a/direct/src/cluster/ClusterConfig.py b/direct/src/cluster/ClusterConfig.py index 25095f4090..a71610ea7a 100644 --- a/direct/src/cluster/ClusterConfig.py +++ b/direct/src/cluster/ClusterConfig.py @@ -1,5 +1,5 @@ -from .ClusterClient import * +from panda3d.core import Vec3 #: A dictionary of information for various cluster configurations. #: Dictionary is keyed on cluster-config string diff --git a/direct/src/cluster/ClusterMsgs.py b/direct/src/cluster/ClusterMsgs.py index a1e4fa8816..299e6cb43f 100644 --- a/direct/src/cluster/ClusterMsgs.py +++ b/direct/src/cluster/ClusterMsgs.py @@ -3,7 +3,7 @@ # This module is intended to supply routines and dataformats common to # both ClusterClient and ClusterServer. -from panda3d.core import * +from panda3d.core import NetDatagram from direct.distributed.PyDatagram import PyDatagram from direct.distributed.PyDatagramIterator import PyDatagramIterator import time diff --git a/direct/src/cluster/ClusterServer.py b/direct/src/cluster/ClusterServer.py index 5a0b948c8a..b987f7c96e 100644 --- a/direct/src/cluster/ClusterServer.py +++ b/direct/src/cluster/ClusterServer.py @@ -1,6 +1,30 @@ -from panda3d.core import * -from .ClusterMsgs import * -from direct.distributed.MsgTypes import * +from panda3d.core import ( + ClockObject, + ConnectionWriter, + NetAddress, + PointerToConnection, + QueuedConnectionListener, + QueuedConnectionManager, + QueuedConnectionReader, + Vec3, +) +from .ClusterMsgs import ( + CLUSTER_CAM_FRUSTUM, + CLUSTER_CAM_MOVEMENT, + CLUSTER_CAM_OFFSET, + CLUSTER_COMMAND_STRING, + CLUSTER_DAEMON_PORT, + CLUSTER_EXIT, + CLUSTER_NAMED_MOVEMENT_DONE, + CLUSTER_NAMED_OBJECT_MOVEMENT, + CLUSTER_NONE, + CLUSTER_SELECTED_MOVEMENT, + CLUSTER_SERVER_PORT, + CLUSTER_SWAP_NOW, + CLUSTER_SWAP_READY, + CLUSTER_TIME_DATA, + ClusterMsgHandler, +) from direct.directnotify import DirectNotifyGlobal from direct.showbase import DirectObject from direct.task import Task diff --git a/direct/src/controls/BattleWalker.py b/direct/src/controls/BattleWalker.py index 10d51e01c1..6ae9dba9ab 100755 --- a/direct/src/controls/BattleWalker.py +++ b/direct/src/controls/BattleWalker.py @@ -2,7 +2,7 @@ from direct.showbase.InputStateGlobal import inputState from direct.showbase.MessengerGlobal import messenger from direct.task.Task import Task -from panda3d.core import * +from panda3d.core import ClockObject, Mat3, Point3, Vec3 from . import GravityWalker BattleStrafe = 0 diff --git a/direct/src/controls/DevWalker.py b/direct/src/controls/DevWalker.py index da6f139185..fb8405ee06 100755 --- a/direct/src/controls/DevWalker.py +++ b/direct/src/controls/DevWalker.py @@ -22,7 +22,7 @@ from direct.showbase import DirectObject from direct.showbase.MessengerGlobal import messenger from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr -from panda3d.core import * +from panda3d.core import ClockObject, ConfigVariableBool, ConfigVariableDouble, Mat3, Point3, Vec3 class DevWalker(DirectObject.DirectObject): diff --git a/direct/src/controls/GravityWalker.py b/direct/src/controls/GravityWalker.py index 6d5e78ffd9..5408fbca51 100755 --- a/direct/src/controls/GravityWalker.py +++ b/direct/src/controls/GravityWalker.py @@ -24,7 +24,22 @@ from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.extensions_native import VBase3_extensions from direct.extensions_native import VBase4_extensions -from panda3d.core import * +from panda3d.core import ( + BitMask32, + ClockObject, + CollisionHandlerEvent, + CollisionHandlerFluidPusher, + CollisionHandlerGravity, + CollisionHandlerPusher, + CollisionNode, + CollisionRay, + CollisionSphere, + CollisionTraverser, + ConfigVariableBool, + Mat3, + Point3, + Vec3, +) import math diff --git a/direct/src/controls/NonPhysicsWalker.py b/direct/src/controls/NonPhysicsWalker.py index 871dcf69d8..54f170d1ba 100755 --- a/direct/src/controls/NonPhysicsWalker.py +++ b/direct/src/controls/NonPhysicsWalker.py @@ -23,7 +23,20 @@ from direct.showbase.InputStateGlobal import inputState from direct.showbase.MessengerGlobal import messenger from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr -from panda3d.core import * +from panda3d.core import ( + BitMask32, + ClockObject, + CollisionHandlerFloor, + CollisionHandlerPusher, + CollisionNode, + CollisionRay, + CollisionSphere, + CollisionTraverser, + ConfigVariableBool, + Mat3, + Point3, + Vec3, +) class NonPhysicsWalker(DirectObject.DirectObject): notify = DirectNotifyGlobal.directNotify.newCategory("NonPhysicsWalker") diff --git a/direct/src/controls/ObserverWalker.py b/direct/src/controls/ObserverWalker.py index 040971a538..01e7cb63d4 100755 --- a/direct/src/controls/ObserverWalker.py +++ b/direct/src/controls/ObserverWalker.py @@ -16,7 +16,13 @@ although it does send messages that allow a listener to play sounds or animations based on walker events. """ -from panda3d.core import * +from panda3d.core import ( + BitMask32, + CollisionHandlerPusher, + CollisionNode, + CollisionSphere, + CollisionTraverser, +) from direct.directnotify import DirectNotifyGlobal from . import NonPhysicsWalker diff --git a/direct/src/controls/PhysicsWalker.py b/direct/src/controls/PhysicsWalker.py index 1710550606..57ce998e52 100755 --- a/direct/src/controls/PhysicsWalker.py +++ b/direct/src/controls/PhysicsWalker.py @@ -26,8 +26,31 @@ from direct.task.TaskManagerGlobal import taskMgr from direct.extensions_native import Mat3_extensions from direct.extensions_native import VBase3_extensions from direct.extensions_native import VBase4_extensions -from panda3d.core import * -from panda3d.physics import * +from panda3d.core import ( + BitMask32, + ClockObject, + CollisionHandlerFloor, + CollisionHandlerQueue, + CollisionNode, + CollisionRay, + CollisionSphere, + CollisionTraverser, + ConfigVariableBool, + LRotationf, + Mat3, + NodePath, + Point3, + Vec3, +) +from panda3d.physics import ( + ActorNode, + ForceNode, + LinearEulerIntegrator, + LinearFrictionForce, + LinearVectorForce, + PhysicsCollisionHandler, + PhysicsManager, +) import math #import LineStream diff --git a/direct/src/controls/TwoDWalker.py b/direct/src/controls/TwoDWalker.py index 11319ee273..e2681e2023 100644 --- a/direct/src/controls/TwoDWalker.py +++ b/direct/src/controls/TwoDWalker.py @@ -2,9 +2,12 @@ TwoDWalker.py is for controlling the avatars in a 2D scroller game environment. """ -from .GravityWalker import * +from .GravityWalker import GravityWalker +from direct.directnotify.DirectNotifyGlobal import directNotify +from direct.showbase.InputStateGlobal import inputState from direct.showbase.MessengerGlobal import messenger -from panda3d.core import ConfigVariableBool +from direct.task.Task import Task +from panda3d.core import ConfigVariableBool, Vec3 class TwoDWalker(GravityWalker): diff --git a/direct/src/directbase/TestStart.py b/direct/src/directbase/TestStart.py index 0fd3905721..b3602c9127 100755 --- a/direct/src/directbase/TestStart.py +++ b/direct/src/directbase/TestStart.py @@ -1,8 +1,7 @@ print('TestStart: Starting up test environment.') -from panda3d.core import * +import direct.showbase.PythonUtil # pylint: disable=unused-import -from direct.showbase.PythonUtil import * from direct.showbase import ShowBase base = ShowBase.ShowBase() diff --git a/direct/src/directbase/ThreeUpStart.py b/direct/src/directbase/ThreeUpStart.py index 8a5ddce584..dbdf6eb88a 100644 --- a/direct/src/directbase/ThreeUpStart.py +++ b/direct/src/directbase/ThreeUpStart.py @@ -1,9 +1,8 @@ print('ThreeUpStart: Starting up environment.') -from panda3d.core import * +import direct.showbase.PythonUtil # pylint: disable=unused-import -from direct.showbase.PythonUtil import * from direct.showbase import ThreeUpShow base = ThreeUpShow.ThreeUpShow() diff --git a/direct/src/directdevices/DirectDeviceManager.py b/direct/src/directdevices/DirectDeviceManager.py index 4e1228418b..e5439d497e 100644 --- a/direct/src/directdevices/DirectDeviceManager.py +++ b/direct/src/directdevices/DirectDeviceManager.py @@ -1,8 +1,15 @@ """Class used to create and control VRPN devices.""" from direct.showbase.DirectObject import DirectObject -from panda3d.core import * -from panda3d.vrpn import * +from panda3d.core import ( + AnalogNode, + ButtonNode, + ConfigVariableDouble, + ConfigVariableString, + DialNode, + TrackerNode, +) +from panda3d.vrpn import VrpnClient ANALOG_MIN = -0.95 ANALOG_MAX = 0.95 diff --git a/direct/src/directdevices/DirectFastrak.py b/direct/src/directdevices/DirectFastrak.py index 1fda9f74cb..9b20adb113 100644 --- a/direct/src/directdevices/DirectFastrak.py +++ b/direct/src/directdevices/DirectFastrak.py @@ -1,8 +1,9 @@ """ Class used to create and control radamec device """ +from panda3d.core import Vec3 from direct.showbase.DirectObject import DirectObject from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr -from .DirectDeviceManager import * +from .DirectDeviceManager import DirectDeviceManager from direct.directnotify import DirectNotifyGlobal diff --git a/direct/src/directdevices/DirectJoybox.py b/direct/src/directdevices/DirectJoybox.py index ef4ba82a36..14ca267c5d 100644 --- a/direct/src/directdevices/DirectJoybox.py +++ b/direct/src/directdevices/DirectJoybox.py @@ -1,11 +1,11 @@ """ Class used to create and control joybox device """ from direct.showbase.DirectObject import DirectObject -from .DirectDeviceManager import * -from direct.directtools.DirectUtil import * +from .DirectDeviceManager import ANALOG_DEADBAND, ANALOG_MAX, ANALOG_MIN, DirectDeviceManager +from direct.directtools.DirectUtil import CLAMP from direct.gui import OnscreenText from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr -from panda3d.core import ClockObject +from panda3d.core import ButtonRegistry, ButtonThrower, ClockObject, NodePath, VBase3, Vec3 import math diff --git a/direct/src/directdevices/DirectRadamec.py b/direct/src/directdevices/DirectRadamec.py index 7cb62bdc7d..b7ebe9c613 100644 --- a/direct/src/directdevices/DirectRadamec.py +++ b/direct/src/directdevices/DirectRadamec.py @@ -1,9 +1,8 @@ """ Class used to create and control radamec device """ -from math import * from direct.showbase.DirectObject import DirectObject from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr -from .DirectDeviceManager import * +from .DirectDeviceManager import DirectDeviceManager from direct.directnotify import DirectNotifyGlobal diff --git a/direct/src/directscripts/eggcacher.py b/direct/src/directscripts/eggcacher.py index ee01a24b06..d1e951386a 100644 --- a/direct/src/directscripts/eggcacher.py +++ b/direct/src/directscripts/eggcacher.py @@ -11,7 +11,15 @@ import os import sys import gc -from panda3d.core import * +from panda3d.core import ( + BamCache, + ExecutionEnvironment, + Filename, + Loader, + LoaderOptions, + ModelPool, + TexturePool, +) class EggCacher: def __init__(self, args): diff --git a/direct/src/directtools/DirectCameraControl.py b/direct/src/directtools/DirectCameraControl.py index 115f2f613d..2cd7c35821 100644 --- a/direct/src/directtools/DirectCameraControl.py +++ b/direct/src/directtools/DirectCameraControl.py @@ -1,7 +1,9 @@ +import math +from panda3d.core import BitMask32, Mat4, NodePath, Point3, VBase3, Vec3, Vec4, rad2Deg from direct.showbase.DirectObject import DirectObject -from .DirectUtil import * -from .DirectGeometry import * -from .DirectGlobals import * +from .DirectUtil import CLAMP, useDirectRenderStyle +from .DirectGeometry import getCrankAngle, getScreenXY +from . import DirectGlobals as DG from .DirectSelection import SelectionRay from direct.interval.IntervalGlobal import Sequence, Func from direct.directnotify import DirectNotifyGlobal @@ -218,9 +220,9 @@ class DirectCameraControl(DirectObject): # Allow intersection with unpickable objects # And then spawn task to determine mouse mode # Don't intersect with hidden or backfacing objects - skipFlags = SKIP_HIDDEN | SKIP_BACKFACE + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_BACKFACE # Skip camera (and its children), unless control key is pressed - skipFlags |= SKIP_CAMERA * (1 - base.getControl()) + skipFlags |= DG.SKIP_CAMERA * (1 - base.getControl()) self.computeCOA(base.direct.iRay.pickGeom(skipFlags = skipFlags)) # Record reference point self.coaMarkerRef.setPosHprScale(base.cam, 0, 0, 0, 0, 0, 0, 1, 1, 1) @@ -422,7 +424,7 @@ class DirectCameraControl(DirectObject): # Set at markers position in render coordinates self.camManipRef.setPos(self.coaMarkerPos) - self.camManipRef.setHpr(base.direct.camera, ZERO_POINT) + self.camManipRef.setHpr(base.direct.camera, DG.ZERO_POINT) t = Task.Task(self.mouseRotateTask) if abs(base.direct.dr.mouseX) > 0.9: t.constrainedDir = 'y' @@ -454,7 +456,7 @@ class DirectCameraControl(DirectObject): # flatten roll base.direct.camera.setR(0) self.camManipRef.setPos(self.coaMarkerPos) - self.camManipRef.setHpr(base.direct.camera, ZERO_POINT) + self.camManipRef.setHpr(base.direct.camera, DG.ZERO_POINT) else: if base.direct.camera.getPos().getZ() >=0 or not self.switchDirBelowZero: dirX = -1 @@ -478,7 +480,7 @@ class DirectCameraControl(DirectObject): self.__stopManipulateCamera() # Set at markers position in render coordinates self.camManipRef.setPos(self.coaMarkerPos) - self.camManipRef.setHpr(base.direct.camera, ZERO_POINT) + self.camManipRef.setHpr(base.direct.camera, DG.ZERO_POINT) t = Task.Task(self.mouseRollTask) t.coaCenter = getScreenXY(self.coaMarker) t.lastAngle = getCrankAngle(t.coaCenter) @@ -565,7 +567,7 @@ class DirectCameraControl(DirectObject): base.direct.message('COA Distance: ' + repr(dist)) coa.set(0, dist, 0) # Compute COA Dist - coaDist = Vec3(coa - ZERO_POINT).length() + coaDist = Vec3(coa - DG.ZERO_POINT).length() if coaDist < (1.1 * dr.near): coa.set(0, 100, 0) coaDist = 100 @@ -575,7 +577,7 @@ class DirectCameraControl(DirectObject): def updateCoa(self, ref2point, coaDist = None, ref = None): self.coa.set(ref2point[0], ref2point[1], ref2point[2]) if not coaDist: - coaDist = Vec3(self.coa - ZERO_POINT).length() + coaDist = Vec3(self.coa - DG.ZERO_POINT).length() # Place the marker in render space if ref is None: # KEH: use the current display region @@ -642,19 +644,19 @@ class DirectCameraControl(DirectObject): # Transform camera z axis to render space mCam2Render = Mat4(Mat4.identMat()) # [gjeon] fixed to give required argument mCam2Render.assign(base.direct.camera.getMat(render)) - zAxis = Vec3(mCam2Render.xformVec(Z_AXIS)) + zAxis = Vec3(mCam2Render.xformVec(DG.Z_AXIS)) zAxis.normalize() # Compute rotation angle needed to upright cam - orbitAngle = rad2Deg(math.acos(CLAMP(zAxis.dot(Z_AXIS), -1, 1))) + orbitAngle = rad2Deg(math.acos(CLAMP(zAxis.dot(DG.Z_AXIS), -1, 1))) # Check angle if orbitAngle < 0.1: # Already upright return # Compute orthogonal axis of rotation - rotAxis = Vec3(zAxis.cross(Z_AXIS)) + rotAxis = Vec3(zAxis.cross(DG.Z_AXIS)) rotAxis.normalize() # Find angle between rot Axis and render X_AXIS - rotAngle = rad2Deg(math.acos(CLAMP(rotAxis.dot(X_AXIS), -1, 1))) + rotAngle = rad2Deg(math.acos(CLAMP(rotAxis.dot(DG.X_AXIS), -1, 1))) # Determine sign or rotation angle if rotAxis[1] < 0: rotAngle *= -1 @@ -685,7 +687,7 @@ class DirectCameraControl(DirectObject): base.direct.pushUndo([base.direct.camera]) # Determine marker location markerToCam = self.coaMarker.getPos(base.direct.camera) - dist = Vec3(markerToCam - ZERO_POINT).length() + dist = Vec3(markerToCam - DG.ZERO_POINT).length() scaledCenterVec = Y_AXIS * dist delta = markerToCam - scaledCenterVec self.camManipRef.setPosHpr(base.direct.camera, Point3(0), Point3(0)) @@ -709,7 +711,7 @@ class DirectCameraControl(DirectObject): self.camManipRef.setPos(base.direct.camera, zoomPtToCam) # Move to that point ival = base.direct.camera.posInterval(CAM_MOVE_DURATION, - ZERO_POINT, + DG.ZERO_POINT, other = self.camManipRef, blendType = 'easeInOut') ival = Sequence(ival, Func(self.updateCoaMarkerSizeOnDeath), @@ -746,20 +748,20 @@ class DirectCameraControl(DirectObject): elif view == 7: hprOffset.set(135., -35.264, 0.) # Position target - self.camManipRef.setPosHpr(self.coaMarker, ZERO_VEC, + self.camManipRef.setPosHpr(self.coaMarker, DG.ZERO_VEC, hprOffset) # Scale center vec by current distance to target offsetDistance = Vec3(base.direct.camera.getPos(self.camManipRef) - - ZERO_POINT).length() + DG.ZERO_POINT).length() scaledCenterVec = Y_AXIS * (-1.0 * offsetDistance) # Now put the camManipRef at that point self.camManipRef.setPosHpr(self.camManipRef, scaledCenterVec, - ZERO_VEC) + DG.ZERO_VEC) # Record view for next time around self.lastView = view ival = base.direct.camera.posHprInterval(CAM_MOVE_DURATION, - pos = ZERO_POINT, + pos = DG.ZERO_POINT, hpr = VBase3(0, 0, self.orthoViewRoll), other = self.camManipRef, blendType = 'easeInOut') @@ -776,9 +778,9 @@ class DirectCameraControl(DirectObject): base.direct.pushUndo([base.direct.camera]) # Coincident with widget - self.camManipRef.setPos(self.coaMarker, ZERO_POINT) + self.camManipRef.setPos(self.coaMarker, DG.ZERO_POINT) # But aligned with render space - self.camManipRef.setHpr(ZERO_POINT) + self.camManipRef.setHpr(DG.ZERO_POINT) parent = base.direct.camera.getParent() base.direct.camera.wrtReparentTo(self.camManipRef) diff --git a/direct/src/directtools/DirectGeometry.py b/direct/src/directtools/DirectGeometry.py index b97031dc50..a4c7c61c8f 100644 --- a/direct/src/directtools/DirectGeometry.py +++ b/direct/src/directtools/DirectGeometry.py @@ -1,7 +1,21 @@ - -from panda3d.core import * -from .DirectGlobals import * -from .DirectUtil import * +from panda3d.core import ( + CSDefault, + GeomNode, + LineSegs, + Mat4, + NodePath, + Point3, + Quat, + VBase3, + VBase4, + Vec3, + composeMatrix, + decomposeMatrix, + deg2Rad, + rad2Deg, +) +from .DirectGlobals import Q_EPSILON, UNIT_VEC, ZERO_VEC +from .DirectUtil import CLAMP import math class LineNodePath(NodePath): diff --git a/direct/src/directtools/DirectGrid.py b/direct/src/directtools/DirectGrid.py index 15182e0ad7..c8c7cb9693 100644 --- a/direct/src/directtools/DirectGrid.py +++ b/direct/src/directtools/DirectGrid.py @@ -1,8 +1,8 @@ - -from panda3d.core import * +import math +from panda3d.core import NodePath, Point3, VBase4 from direct.showbase.DirectObject import DirectObject -from .DirectUtil import * -from .DirectGeometry import * +from .DirectUtil import ROUND_TO, useDirectRenderStyle +from .DirectGeometry import LineNodePath class DirectGrid(NodePath, DirectObject): diff --git a/direct/src/directtools/DirectLights.py b/direct/src/directtools/DirectLights.py index 62c2685731..5fe757d688 100644 --- a/direct/src/directtools/DirectLights.py +++ b/direct/src/directtools/DirectLights.py @@ -1,5 +1,15 @@ -from panda3d.core import * +from panda3d.core import ( + AmbientLight, + DirectionalLight, + LightAttrib, + Material, + NodePath, + PerspectiveLens, + PointLight, + Spotlight, + VBase4, +) from direct.showbase.MessengerGlobal import messenger diff --git a/direct/src/directtools/DirectManipulation.py b/direct/src/directtools/DirectManipulation.py index 4007207516..be56f6da5d 100644 --- a/direct/src/directtools/DirectManipulation.py +++ b/direct/src/directtools/DirectManipulation.py @@ -1,10 +1,32 @@ +import math +from panda3d.core import ( + BitMask32, + BoundingHexahedron, + CSDefault, + Mat4, + NodePath, + Point3, + VBase3, + VBase4, + Vec3, + decomposeMatrix, + deg2Rad, +) from direct.showbase.DirectObject import DirectObject from direct.showbase.MessengerGlobal import messenger -from .DirectGlobals import * -from .DirectUtil import * -from .DirectGeometry import * +from . import DirectGlobals as DG +from .DirectUtil import useDirectRenderStyle +from .DirectGeometry import ( + LineNodePath, + getCrankAngle, + getNearProjectionPoint, + getScreenXY, + planeIntersect, + relHpr, +) from .DirectSelection import SelectionRay from direct.task import Task +from direct.task.TaskManagerGlobal import taskMgr from copy import deepcopy @@ -51,7 +73,7 @@ class DirectManipulationControl(DirectObject): ['shift-f', self.objectHandles.growToFit], ['i', self.plantSelectedNodePath], ] - self.defaultSkipFlags = SKIP_HIDDEN | SKIP_BACKFACE + self.defaultSkipFlags = DG.SKIP_HIDDEN | DG.SKIP_BACKFACE self.optionalSkipFlags = 0 self.unmovableTagList = [] @@ -115,7 +137,7 @@ class DirectManipulationControl(DirectObject): self.fScaling3D == 0: # Check for a widget hit point - entry = base.direct.iRay.pickWidget(skipFlags = SKIP_WIDGET) + entry = base.direct.iRay.pickWidget(skipFlags = DG.SKIP_WIDGET) # Did we hit a widget? if entry: # Yes! @@ -137,7 +159,7 @@ class DirectManipulationControl(DirectObject): if entry: # Check to see if we are moving the object # We are moving the object if we either wait long enough - taskMgr.doMethodLater(MANIPULATION_MOVE_DELAY, + taskMgr.doMethodLater(DG.MANIPULATION_MOVE_DELAY, self.switchToMoveMode, 'manip-move-wait') # Or we move far enough @@ -213,7 +235,7 @@ class DirectManipulationControl(DirectObject): self.marquee.create() if self.fMultiView: - LE_showInOneCam(self.marquee, base.direct.camera.getName()) + DG.LE_showInOneCam(self.marquee, base.direct.camera.getName()) def manipulationStop(self): taskMgr.remove('manipulateObject') @@ -227,7 +249,7 @@ class DirectManipulationControl(DirectObject): # optionally specified things skipFlags = self.defaultSkipFlags | self.optionalSkipFlags # Skip camera (and its children), unless control key is pressed - skipFlags |= SKIP_CAMERA * (1 - base.getControl()) + skipFlags |= DG.SKIP_CAMERA * (1 - base.getControl()) if self.marquee: self.marquee.removeNode() @@ -269,18 +291,18 @@ class DirectManipulationControl(DirectObject): selectionList = [] for geom in render.findAllMatches("**/+GeomNode"): - if (skipFlags & SKIP_HIDDEN) and geom.isHidden(): + if (skipFlags & DG.SKIP_HIDDEN) and geom.isHidden(): # Skip if hidden node continue -## elif (skipFlags & SKIP_BACKFACE) and base.direct.iRay.isEntryBackfacing(): +## elif (skipFlags & DG.SKIP_BACKFACE) and base.direct.iRay.isEntryBackfacing(): ## # Skip, if backfacing poly ## pass - elif (skipFlags & SKIP_CAMERA) and \ + elif (skipFlags & DG.SKIP_CAMERA) and \ (base.camera in geom.getAncestors()): # Skip if parented to a camera. continue # Can pick unpickable, use the first visible node - elif (skipFlags & SKIP_UNPICKABLE) and \ + elif (skipFlags & DG.SKIP_UNPICKABLE) and \ (geom.getName() in base.direct.iRay.unpickable): # Skip if in unpickable list continue @@ -500,7 +522,7 @@ class DirectManipulationControl(DirectObject): selectedList = base.direct.selected.getSelectedAsList() # See if any of the selected are completely uneditable editTypes = self.getEditTypes(selectedList) - if (editTypes & EDIT_TYPE_UNEDITABLE) == EDIT_TYPE_UNEDITABLE: + if (editTypes & DG.EDIT_TYPE_UNEDITABLE) == DG.EDIT_TYPE_UNEDITABLE: return self.currEditTypes = editTypes if selectedList: @@ -568,13 +590,13 @@ class DirectManipulationControl(DirectObject): if self.constraint: type = self.constraint[2:] if self.useSeparateScaleHandles: - if type == 'post' and not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + if type == 'post' and not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: self.xlate1D(state) - elif type == 'disc' and not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + elif type == 'disc' and not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: self.xlate2D(state) - elif type == 'ring' and not self.currEditTypes & EDIT_TYPE_UNROTATABLE: + elif type == 'ring' and not self.currEditTypes & DG.EDIT_TYPE_UNROTATABLE: self.rotate1D(state) - elif type == 'scale' and not self.currEditTypes & EDIT_TYPE_UNSCALABLE: + elif type == 'scale' and not self.currEditTypes & DG.EDIT_TYPE_UNSCALABLE: if base.direct.fShift: self.fScaling3D = 1 self.scale3D(state) @@ -582,7 +604,7 @@ class DirectManipulationControl(DirectObject): self.fScaling1D = 1 self.scale1D(state) else: - if base.direct.fControl and not self.currEditTypes & EDIT_TYPE_UNSCALABLE: + if base.direct.fControl and not self.currEditTypes & DG.EDIT_TYPE_UNSCALABLE: if type == 'post': # [gjeon] non-uniform scaling self.fScaling1D = 1 @@ -592,11 +614,11 @@ class DirectManipulationControl(DirectObject): self.fScaling3D = 1 self.scale3D(state) else: - if type == 'post' and not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + if type == 'post' and not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: self.xlate1D(state) - elif type == 'disc' and not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + elif type == 'disc' and not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: self.xlate2D(state) - elif type == 'ring' and not self.currEditTypes & EDIT_TYPE_UNROTATABLE: + elif type == 'ring' and not self.currEditTypes & DG.EDIT_TYPE_UNROTATABLE: self.rotate1D(state) # No widget interaction, determine free manip mode elif self.fFreeManip and not self.useSeparateScaleHandles: @@ -610,17 +632,17 @@ class DirectManipulationControl(DirectObject): self.fScaling1D = 0 self.fScaling3D = 0 # Alt key switches to a scaling mode - if base.direct.fControl and not self.currEditTypes & EDIT_TYPE_UNSCALABLE: + if base.direct.fControl and not self.currEditTypes & DG.EDIT_TYPE_UNSCALABLE: self.fScaling3D = 1 self.scale3D(state) # Otherwise, manip mode depends on where you started - elif state.fMouseX and state.fMouseY and not self.currEditTypes & EDIT_TYPE_UNROTATABLE: + elif state.fMouseX and state.fMouseY and not self.currEditTypes & DG.EDIT_TYPE_UNROTATABLE: # In the corner, spin around camera's axis self.rotateAboutViewVector(state) - elif state.fMouseX or state.fMouseY and not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + elif state.fMouseX or state.fMouseY and not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: # Mouse started elsewhere in the outer frame, rotate self.rotate2D(state) - elif not self.currEditTypes & EDIT_TYPE_UNMOVABLE: + elif not self.currEditTypes & DG.EDIT_TYPE_UNMOVABLE: # Mouse started in central region, xlate # Mode depends on shift key if base.direct.fShift or base.direct.fControl: @@ -805,11 +827,11 @@ class DirectManipulationControl(DirectObject): widgetDir.normalize() # Convert specified widget axis to view space if axis == 'x': - widgetAxis = Vec3(mWidget2Cam.xformVec(X_AXIS)) + widgetAxis = Vec3(mWidget2Cam.xformVec(DG.X_AXIS)) elif axis == 'y': - widgetAxis = Vec3(mWidget2Cam.xformVec(Y_AXIS)) + widgetAxis = Vec3(mWidget2Cam.xformVec(DG.Y_AXIS)) elif axis == 'z': - widgetAxis = Vec3(mWidget2Cam.xformVec(Z_AXIS)) + widgetAxis = Vec3(mWidget2Cam.xformVec(DG.Z_AXIS)) widgetAxis.normalize() if type == 'top?': # Check sign of angle between two vectors @@ -868,7 +890,7 @@ class DirectManipulationControl(DirectObject): moveDir.assign(moveDir * -1) moveDir.normalize() else: - moveDir = Vec3(Y_AXIS) + moveDir = Vec3(DG.Y_AXIS) # Move selected objects dr = base.direct.dr # Scale move dir @@ -1043,7 +1065,7 @@ class DirectManipulationControl(DirectObject): """ Move selected object to intersection point of cursor on scene """ # Check for intersection entry = base.direct.iRay.pickGeom( - skipFlags = SKIP_HIDDEN | SKIP_BACKFACE | SKIP_CAMERA) + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_BACKFACE | DG.SKIP_CAMERA) # MRM: Need to handle moving COA if entry is not None and base.direct.selected.last is not None: # Record undo point @@ -1642,32 +1664,32 @@ class ObjectHandles(NodePath, DirectObject): # by comparing lineDir with plane normals. The plane with the # largest dotProduct is most "normal" if axis == 'x': - if abs(lineDir.dot(Y_AXIS)) > abs(lineDir.dot(Z_AXIS)): + if abs(lineDir.dot(DG.Y_AXIS)) > abs(lineDir.dot(DG.Z_AXIS)): self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, Y_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.Y_AXIS)) else: self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, Z_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.Z_AXIS)) # We really only care about the nearest point on the axis self.hitPt.setY(0) self.hitPt.setZ(0) elif axis == 'y': - if abs(lineDir.dot(X_AXIS)) > abs(lineDir.dot(Z_AXIS)): + if abs(lineDir.dot(DG.X_AXIS)) > abs(lineDir.dot(DG.Z_AXIS)): self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, X_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.X_AXIS)) else: self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, Z_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.Z_AXIS)) # We really only care about the nearest point on the axis self.hitPt.setX(0) self.hitPt.setZ(0) elif axis == 'z': - if abs(lineDir.dot(X_AXIS)) > abs(lineDir.dot(Y_AXIS)): + if abs(lineDir.dot(DG.X_AXIS)) > abs(lineDir.dot(DG.Y_AXIS)): self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, X_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.X_AXIS)) else: self.hitPt.assign( - planeIntersect(lineOrigin, lineDir, ORIGIN, Y_AXIS)) + planeIntersect(lineOrigin, lineDir, DG.ORIGIN, DG.Y_AXIS)) # We really only care about the nearest point on the axis self.hitPt.setX(0) self.hitPt.setY(0) @@ -1722,13 +1744,13 @@ class ObjectHandles(NodePath, DirectObject): # Find the hit point if plane == 'x': self.hitPt.assign(planeIntersect( - lineOrigin, lineDir, ORIGIN, X_AXIS)) + lineOrigin, lineDir, DG.ORIGIN, DG.X_AXIS)) elif plane == 'y': self.hitPt.assign(planeIntersect( - lineOrigin, lineDir, ORIGIN, Y_AXIS)) + lineOrigin, lineDir, DG.ORIGIN, DG.Y_AXIS)) elif plane == 'z': self.hitPt.assign(planeIntersect( - lineOrigin, lineDir, ORIGIN, Z_AXIS)) + lineOrigin, lineDir, DG.ORIGIN, DG.Z_AXIS)) return self.hitPt diff --git a/direct/src/directtools/DirectSelection.py b/direct/src/directtools/DirectSelection.py index 2e0848ab81..1c6efed7b5 100644 --- a/direct/src/directtools/DirectSelection.py +++ b/direct/src/directtools/DirectSelection.py @@ -1,8 +1,26 @@ +from panda3d.core import ( + BitMask32, + BoundingSphere, + CollisionHandlerQueue, + CollisionNode, + CollisionRay, + CollisionSegment, + CollisionSphere, + CollisionTraverser, + GeomNode, + Mat4, + NodePath, + Point3, + TransformState, + VBase4, + Vec3, + Vec4, +) from direct.showbase.DirectObject import DirectObject from direct.showbase.MessengerGlobal import messenger -from .DirectGlobals import * -from .DirectUtil import * -from .DirectGeometry import * +from . import DirectGlobals as DG +from .DirectUtil import useDirectRenderStyle +from .DirectGeometry import LineNodePath COA_ORIGIN = 0 COA_CENTER = 1 @@ -439,7 +457,7 @@ class SelectionQueue(CollisionHandlerQueue): # Current index and entry in collision queue self.index = -1 self.entry = None - self.skipFlags = SKIP_NONE + self.skipFlags = DG.SKIP_NONE # Create a collision node path attached to the given NP self.collisionNodePath = NodePath(CollisionNode("collisionNP")) self.setParentNP(parentNP) @@ -454,7 +472,7 @@ class SelectionQueue(CollisionHandlerQueue): # Let the traverser know about the collision node and the queue self.ct.addCollider(self.collisionNodePath, self) # List of objects that can't be selected - self.unpickable = UNPICKABLE + self.unpickable = DG.UNPICKABLE # Derived class must add Collider to complete initialization def setParentNP(self, parentNP): @@ -548,10 +566,10 @@ class SelectionQueue(CollisionHandlerQueue): v.normalize() return v.dot(n) >= 0 - def findNextCollisionEntry(self, skipFlags = SKIP_NONE): + def findNextCollisionEntry(self, skipFlags = DG.SKIP_NONE): return self.findCollisionEntry(skipFlags, self.index + 1) - def findCollisionEntry(self, skipFlags = SKIP_NONE, startIndex = 0): + def findCollisionEntry(self, skipFlags = DG.SKIP_NONE, startIndex = 0): # Init self.index and self.entry self.setCurrentIndex(-1) self.setCurrentEntry(None) @@ -559,28 +577,28 @@ class SelectionQueue(CollisionHandlerQueue): for i in range(startIndex, self.getNumEntries()): entry = self.getEntry(i) nodePath = entry.getIntoNodePath() - if (skipFlags & SKIP_HIDDEN) and nodePath.isHidden(): + if (skipFlags & DG.SKIP_HIDDEN) and nodePath.isHidden(): # Skip if hidden node pass - elif (skipFlags & SKIP_BACKFACE) and self.isEntryBackfacing(entry): + elif (skipFlags & DG.SKIP_BACKFACE) and self.isEntryBackfacing(entry): # Skip, if backfacing poly pass - elif (skipFlags & SKIP_CAMERA) and \ + elif (skipFlags & DG.SKIP_CAMERA) and \ (base.camera in nodePath.getAncestors()): # Skip if parented to a camera. pass # Can pick unpickable, use the first visible node - elif (skipFlags & SKIP_UNPICKABLE) and\ + elif (skipFlags & DG.SKIP_UNPICKABLE) and\ (nodePath.getName() in self.unpickable): # Skip if in unpickable list pass elif base.direct and\ - ((skipFlags & SKIP_WIDGET) and + ((skipFlags & DG.SKIP_WIDGET) and (nodePath.getTag('WidgetName') != base.direct.widget.getName())): # Skip if this widget part is not belong to current widget pass elif base.direct and\ - ((skipFlags & SKIP_WIDGET) and base.direct.fControl and + ((skipFlags & DG.SKIP_WIDGET) and base.direct.fControl and (nodePath.getName()[2:] == 'ring')): # Skip when ununiformly scale in ortho view pass @@ -623,7 +641,7 @@ class SelectionRay(SelectionQueue): def pickBitMask(self, bitMask = BitMask32.allOff(), targetNodePath = None, - skipFlags = SKIP_ALL): + skipFlags = DG.SKIP_ALL): if targetNodePath is None: targetNodePath = render self.collideWithBitMask(bitMask) @@ -631,7 +649,7 @@ class SelectionRay(SelectionQueue): # Determine collision entry return self.findCollisionEntry(skipFlags) - def pickGeom(self, targetNodePath = None, skipFlags = SKIP_ALL, + def pickGeom(self, targetNodePath = None, skipFlags = DG.SKIP_ALL, xy = None): if targetNodePath is None: targetNodePath = render @@ -640,7 +658,7 @@ class SelectionRay(SelectionQueue): # Determine collision entry return self.findCollisionEntry(skipFlags) - def pickWidget(self, targetNodePath = None, skipFlags = SKIP_NONE): + def pickWidget(self, targetNodePath = None, skipFlags = DG.SKIP_NONE): if targetNodePath is None: targetNodePath = render self.collideWithWidget() @@ -657,7 +675,7 @@ class SelectionRay(SelectionQueue): def pickGeom3D(self, targetNodePath = None, origin = Point3(0), dir = Vec3(0, 0, -1), - skipFlags = SKIP_HIDDEN | SKIP_CAMERA): + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_CAMERA): if targetNodePath is None: targetNodePath = render self.collideWithGeom() @@ -668,7 +686,7 @@ class SelectionRay(SelectionQueue): def pickBitMask3D(self, bitMask = BitMask32.allOff(), targetNodePath = None, origin = Point3(0), dir = Vec3(0, 0, -1), - skipFlags = SKIP_ALL): + skipFlags = DG.SKIP_ALL): if targetNodePath is None: targetNodePath = render self.collideWithBitMask(bitMask) @@ -698,7 +716,7 @@ class SelectionSegment(SelectionQueue): self.numColliders += 1 def pickGeom(self, targetNodePath = None, endPointList = [], - skipFlags = SKIP_HIDDEN | SKIP_CAMERA): + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_CAMERA): if targetNodePath is None: targetNodePath = render self.collideWithGeom() @@ -713,7 +731,7 @@ class SelectionSegment(SelectionQueue): def pickBitMask(self, bitMask = BitMask32.allOff(), targetNodePath = None, endPointList = [], - skipFlags = SKIP_HIDDEN | SKIP_CAMERA): + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_CAMERA): if targetNodePath is None: targetNodePath = render self.collideWithBitMask(bitMask) @@ -781,7 +799,7 @@ class SelectionSphere(SelectionQueue): return self.findCollisionEntry(skipFlags) def pickGeom(self, targetNodePath = None, - skipFlags = SKIP_HIDDEN | SKIP_CAMERA): + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_CAMERA): if targetNodePath is None: targetNodePath = render self.collideWithGeom() @@ -789,7 +807,7 @@ class SelectionSphere(SelectionQueue): def pickBitMask(self, bitMask = BitMask32.allOff(), targetNodePath = None, - skipFlags = SKIP_HIDDEN | SKIP_CAMERA): + skipFlags = DG.SKIP_HIDDEN | DG.SKIP_CAMERA): if targetNodePath is None: targetNodePath = render self.collideWithBitMask(bitMask) diff --git a/direct/src/directtools/DirectSession.py b/direct/src/directtools/DirectSession.py index cddfb0ab00..7ab9584907 100644 --- a/direct/src/directtools/DirectSession.py +++ b/direct/src/directtools/DirectSession.py @@ -1,13 +1,27 @@ import math -from panda3d.core import * -from .DirectUtil import * +from panda3d.core import ( + CollisionNode, + ConfigVariableBool, + ConfigVariableString, + CSDefault, + NodePath, + Point3, + TextNode, + VBase3, + VBase4, + Vec3, + Vec4, + decomposeMatrix, + deg2Rad, +) +from .DirectUtil import useDirectRenderStyle from direct.showbase.DirectObject import DirectObject from direct.showbase.BulletinBoardGlobal import bulletinBoard as bboard from direct.task import Task -from .DirectGlobals import DIRECT_NO_MOD +from . import DirectGlobals as DG from .DirectCameraControl import DirectCameraControl from .DirectManipulation import DirectManipulationControl from .DirectSelection import SelectionRay, COA_ORIGIN, SelectedNodePaths @@ -20,7 +34,8 @@ from direct.cluster.ClusterServer import ClusterServer ## from direct.tkwidgets import Slider ## from direct.tkwidgets import SceneGraphExplorer from direct.gui import OnscreenText -from direct.interval.IntervalGlobal import * +from direct.interval.IntervalGlobal import Func, Sequence +from direct.task.TaskManagerGlobal import taskMgr class DirectSession(DirectObject): @@ -541,7 +556,7 @@ class DirectSession(DirectObject): base.mouseWatcher = winCtrl.mouseWatcher base.mouseWatcherNode = winCtrl.mouseWatcher.node() base.direct.dr.mouseUpdate() - LE_showInOneCam(self.selectedNPReadout, self.camera.getName()) + DG.LE_showInOneCam(self.selectedNPReadout, self.camera.getName()) base.direct.widget = base.direct.manipulationControl.widgetList[base.camList.index(NodePath(winCtrl.camNode))] input = input[8:] # get rid of camera prefix @@ -590,8 +605,8 @@ class DirectSession(DirectObject): self.fControl = 1 # [gjeon] to update control key information while mouse1 is pressed if self.fMouse1: - modifiers = DIRECT_NO_MOD - modifiers |= DIRECT_CONTROL_MOD + modifiers = DG.DIRECT_NO_MOD + modifiers |= DG.DIRECT_CONTROL_MOD messenger.send('DIRECT-mouse1', sentArgs = [modifiers]) elif input == 'control-up': self.fControl = 0 @@ -601,16 +616,16 @@ class DirectSession(DirectObject): self.fAlt = 1 # [gjeon] to update alt key information while mouse1 is pressed if self.fMouse1: - modifiers = DIRECT_NO_MOD - modifiers |= DIRECT_ALT_MOD + modifiers = DG.DIRECT_NO_MOD + modifiers |= DG.DIRECT_ALT_MOD messenger.send('DIRECT-mouse1', sentArgs = [modifiers]) elif self.fMouse2: - modifiers = DIRECT_NO_MOD - modifiers |= DIRECT_ALT_MOD + modifiers = DG.DIRECT_NO_MOD + modifiers |= DG.DIRECT_ALT_MOD messenger.send('DIRECT-mouse2', sentArgs = [modifiers]) elif self.fMouse3: - modifiers = DIRECT_NO_MOD - modifiers |= DIRECT_ALT_MOD + modifiers = DG.DIRECT_NO_MOD + modifiers |= DG.DIRECT_ALT_MOD messenger.send('DIRECT-mouse3', sentArgs = [modifiers]) elif input == 'alt-up': self.fAlt = 0 @@ -637,24 +652,24 @@ class DirectSession(DirectObject): self.select(self.selected.last) def getModifiers(self, input, base): - modifiers = DIRECT_NO_MOD + modifiers = DG.DIRECT_NO_MOD modifierString = input[: input.find(base)] if modifierString.find('shift') != -1: - modifiers |= DIRECT_SHIFT_MOD + modifiers |= DG.DIRECT_SHIFT_MOD if modifierString.find('control') != -1: - modifiers |= DIRECT_CONTROL_MOD + modifiers |= DG.DIRECT_CONTROL_MOD if modifierString.find('alt') != -1: - modifiers |= DIRECT_ALT_MOD + modifiers |= DG.DIRECT_ALT_MOD return modifiers def gotShift(self, modifiers): - return modifiers & DIRECT_SHIFT_MOD + return modifiers & DG.DIRECT_SHIFT_MOD def gotControl(self, modifiers): - return modifiers & DIRECT_CONTROL_MOD + return modifiers & DG.DIRECT_CONTROL_MOD def gotAlt(self, modifiers): - return modifiers & DIRECT_ALT_MOD + return modifiers & DG.DIRECT_ALT_MOD def setFScaleWidgetByCam(self, flag): self.fScaleWidgetByCam = flag @@ -708,7 +723,7 @@ class DirectSession(DirectObject): else: self.widget.showWidget() editTypes = self.manipulationControl.getEditTypes([dnp]) - if (editTypes & EDIT_TYPE_UNEDITABLE) == EDIT_TYPE_UNEDITABLE: + if (editTypes & DG.EDIT_TYPE_UNEDITABLE) == DG.EDIT_TYPE_UNEDITABLE: self.manipulationControl.disableWidgetMove() else: self.manipulationControl.enableWidgetMove() @@ -831,7 +846,7 @@ class DirectSession(DirectObject): # Temporarily set node path color nodePath.setColor(flashColor) # Clean up color in a few seconds - t = taskMgr.doMethodLater(DIRECT_FLASH_DURATION, + t = taskMgr.doMethodLater(DG.DIRECT_FLASH_DURATION, # This is just a dummy task self.flashDummy, 'flashNodePath',) @@ -1272,7 +1287,7 @@ class DisplayRegionList(DirectObject): for dr in self.displayRegionList: dr.setVfov(fov) - def mouseUpdate(self, modifiers = DIRECT_NO_MOD): + def mouseUpdate(self, modifiers = DG.DIRECT_NO_MOD): for dr in self.displayRegionList: dr.mouseUpdate() #base.direct.dr = self.getCurrentDr() diff --git a/direct/src/directtools/DirectUtil.py b/direct/src/directtools/DirectUtil.py index df5b75e378..134832973d 100644 --- a/direct/src/directtools/DirectUtil.py +++ b/direct/src/directtools/DirectUtil.py @@ -1,5 +1,3 @@ - -from .DirectGlobals import * from panda3d.core import VBase4 from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr diff --git a/direct/src/directutil/Mopath.py b/direct/src/directutil/Mopath.py index 7661ea1da6..ca276b7be9 100644 --- a/direct/src/directutil/Mopath.py +++ b/direct/src/directutil/Mopath.py @@ -1,8 +1,20 @@ from direct.showbase.DirectObject import DirectObject from direct.showbase.MessengerGlobal import messenger -from direct.directtools.DirectGeometry import * +from direct.directtools.DirectUtil import CLAMP +from direct.task.TaskManagerGlobal import taskMgr -from panda3d.core import NodePath, LineSegs, ClockObject +from panda3d.core import ( + PCTHPR, + PCTNONE, + PCTT, + PCTXYZ, + ClockObject, + LineSegs, + NodePath, + ParametricCurve, + Point3, + Vec3, +) class Mopath(DirectObject): diff --git a/direct/src/dist/FreezeTool.py b/direct/src/dist/FreezeTool.py index 0dfe2977d8..19644d20fb 100644 --- a/direct/src/dist/FreezeTool.py +++ b/direct/src/dist/FreezeTool.py @@ -22,7 +22,7 @@ try: except ImportError: p3extend_frozen = None -from panda3d.core import * +from panda3d.core import Filename, Multifile, PandaSystem, StringStream # Check to see if we are running python_d, which implies we have a # debug build, and we have to build the module with debug options. diff --git a/direct/src/dist/icon.py b/direct/src/dist/icon.py index a4f4b9abac..e6873f45f6 100644 --- a/direct/src/dist/icon.py +++ b/direct/src/dist/icon.py @@ -1,4 +1,4 @@ -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify from panda3d.core import PNMImage, Filename, PNMFileTypeRegistry, StringStream import struct diff --git a/direct/src/distributed/AsyncRequest.py b/direct/src/distributed/AsyncRequest.py index 533cedf9bf..37df8096ca 100755 --- a/direct/src/distributed/AsyncRequest.py +++ b/direct/src/distributed/AsyncRequest.py @@ -2,7 +2,8 @@ from direct.directnotify import DirectNotifyGlobal from direct.showbase.DirectObject import DirectObject from direct.showbase.MessengerGlobal import messenger -from .ConnectionRepository import * +from direct.task import Task +from direct.task.TaskManagerGlobal import taskMgr from panda3d.core import ConfigVariableDouble, ConfigVariableInt, ConfigVariableBool ASYNC_REQUEST_DEFAULT_TIMEOUT_IN_SECONDS = 8.0 diff --git a/direct/src/distributed/ClientRepository.py b/direct/src/distributed/ClientRepository.py index 9d8e219fa3..c91a2f4e28 100644 --- a/direct/src/distributed/ClientRepository.py +++ b/direct/src/distributed/ClientRepository.py @@ -3,7 +3,19 @@ from .ClientRepositoryBase import ClientRepositoryBase from direct.directnotify import DirectNotifyGlobal from direct.showbase.MessengerGlobal import messenger -from .MsgTypesCMU import * +from .MsgTypesCMU import ( + CLIENT_DISCONNECT_CMU, + CLIENT_HEARTBEAT_CMU, + CLIENT_OBJECT_UPDATE_FIELD_TARGETED_CMU, + CLIENT_SET_INTEREST_CMU, + OBJECT_DELETE_CMU, + OBJECT_DISABLE_CMU, + OBJECT_GENERATE_CMU, + OBJECT_SET_ZONE_CMU, + OBJECT_UPDATE_FIELD_CMU, + REQUEST_GENERATES_CMU, + SET_DOID_RANGE_CMU, +) from .PyDatagram import PyDatagram from .PyDatagramIterator import PyDatagramIterator from panda3d.core import UniqueIdAllocator, Notify, ClockObject diff --git a/direct/src/distributed/ClientRepositoryBase.py b/direct/src/distributed/ClientRepositoryBase.py index e6a957e279..75c384bf94 100644 --- a/direct/src/distributed/ClientRepositoryBase.py +++ b/direct/src/distributed/ClientRepositoryBase.py @@ -1,5 +1,10 @@ -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import ( + ClockObject, + ConfigVariableBool, + ConfigVariableDouble, + Datagram, + DatagramIterator, +) from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.directnotify import DirectNotifyGlobal @@ -7,11 +12,10 @@ from direct.distributed.CRDataCache import CRDataCache from direct.distributed.ConnectionRepository import ConnectionRepository from direct.showbase.PythonUtil import safeRepr, itype, makeList from direct.showbase.MessengerGlobal import messenger -from .MsgTypes import * +from .MsgTypes import CLIENT_ENTER_OBJECT_REQUIRED_OTHER, MsgId2Names from . import CRCache from . import ParentMgr from . import RelatedObjectMgr -from .ClockDelta import * import time diff --git a/direct/src/distributed/ConnectionRepository.py b/direct/src/distributed/ConnectionRepository.py index fb9d645646..f85467a947 100644 --- a/direct/src/distributed/ConnectionRepository.py +++ b/direct/src/distributed/ConnectionRepository.py @@ -1,5 +1,5 @@ -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import DocumentSpec, Filename, HTTPClient, VirtualFileSystem, getModelPath +from panda3d.direct import CConnectionRepository, DCPacker from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.directnotify.DirectNotifyGlobal import directNotify diff --git a/direct/src/distributed/DistributedCamera.py b/direct/src/distributed/DistributedCamera.py index 39fbb4c65a..5fc48df33b 100755 --- a/direct/src/distributed/DistributedCamera.py +++ b/direct/src/distributed/DistributedCamera.py @@ -1,7 +1,6 @@ -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import ConfigVariableInt, GeomNode, NodePath, PerspectiveLens, Point3, VBase2 from direct.fsm.FSM import FSM -from direct.interval.IntervalGlobal import * +from direct.interval.IntervalGlobal import LerpScaleInterval, Sequence from direct.distributed.DistributedObject import DistributedObject diff --git a/direct/src/distributed/DistributedCameraOV.py b/direct/src/distributed/DistributedCameraOV.py index bdf9369b45..cfae139b23 100755 --- a/direct/src/distributed/DistributedCameraOV.py +++ b/direct/src/distributed/DistributedCameraOV.py @@ -1,5 +1,3 @@ -from panda3d.core import * -from panda3d.direct import * from direct.distributed.DistributedObjectOV import DistributedObjectOV class DistributedCameraOV(DistributedObjectOV): diff --git a/direct/src/distributed/DistributedCartesianGrid.py b/direct/src/distributed/DistributedCartesianGrid.py index 9f124521a9..6b65bcbebb 100755 --- a/direct/src/distributed/DistributedCartesianGrid.py +++ b/direct/src/distributed/DistributedCartesianGrid.py @@ -1,7 +1,4 @@ - -from panda3d.core import * -from panda3d.direct import * -from direct.interval.IntervalGlobal import * +from panda3d.core import ConfigVariableBool, TextNode, VBase4, Vec3 from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedNode import DistributedNode @@ -13,7 +10,7 @@ from direct.distributed.GridParent import GridParent if __debug__: # For grid drawing - from direct.directtools.DirectGeometry import * + from direct.directtools.DirectGeometry import LineNodePath from direct.showbase.PythonUtil import randFloat from .CartesianGridBase import CartesianGridBase diff --git a/direct/src/distributed/DistributedCartesianGridAI.py b/direct/src/distributed/DistributedCartesianGridAI.py index e8516ee4ba..7dc7e33036 100755 --- a/direct/src/distributed/DistributedCartesianGridAI.py +++ b/direct/src/distributed/DistributedCartesianGridAI.py @@ -1,6 +1,3 @@ - -from panda3d.core import * -from panda3d.direct import * from direct.directnotify.DirectNotifyGlobal import directNotify from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr diff --git a/direct/src/distributed/DistributedObject.py b/direct/src/distributed/DistributedObject.py index 424f1db049..d2bbd33d2a 100644 --- a/direct/src/distributed/DistributedObject.py +++ b/direct/src/distributed/DistributedObject.py @@ -1,7 +1,6 @@ """DistributedObject module: contains the DistributedObject class""" -from panda3d.core import * -from panda3d.direct import * +from panda3d.direct import DCPacker from direct.showbase.MessengerGlobal import messenger from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedObjectBase import DistributedObjectBase diff --git a/direct/src/distributed/DistributedObjectAI.py b/direct/src/distributed/DistributedObjectAI.py index 9b3878a6ff..94de96abd5 100644 --- a/direct/src/distributed/DistributedObjectAI.py +++ b/direct/src/distributed/DistributedObjectAI.py @@ -4,8 +4,6 @@ from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedObjectBase import DistributedObjectBase from direct.showbase.MessengerGlobal import messenger from direct.showbase import PythonUtil -from panda3d.core import * -from panda3d.direct import * #from PyDatagram import PyDatagram #from PyDatagramIterator import PyDatagramIterator diff --git a/direct/src/distributed/DistributedObjectUD.py b/direct/src/distributed/DistributedObjectUD.py index 24f18bd2b2..6874185a86 100755 --- a/direct/src/distributed/DistributedObjectUD.py +++ b/direct/src/distributed/DistributedObjectUD.py @@ -4,8 +4,6 @@ from direct.directnotify.DirectNotifyGlobal import directNotify from direct.distributed.DistributedObjectBase import DistributedObjectBase from direct.showbase.MessengerGlobal import messenger from direct.showbase import PythonUtil -from panda3d.core import * -from panda3d.direct import * #from PyDatagram import PyDatagram #from PyDatagramIterator import PyDatagramIterator diff --git a/direct/src/distributed/DistributedSmoothNode.py b/direct/src/distributed/DistributedSmoothNode.py index 7489dea06c..118f0b3e78 100644 --- a/direct/src/distributed/DistributedSmoothNode.py +++ b/direct/src/distributed/DistributedSmoothNode.py @@ -1,8 +1,9 @@ """DistributedSmoothNode module: contains the DistributedSmoothNode class""" -from panda3d.core import * -from panda3d.direct import * -from .ClockDelta import * +import math +from panda3d.core import ClockObject, ConfigVariableBool, ConfigVariableDouble, NodePath +from panda3d.direct import SmoothMover +from .ClockDelta import globalClockDelta from . import DistributedNode from . import DistributedSmoothNodeBase from direct.task.Task import cont diff --git a/direct/src/distributed/DistributedSmoothNodeBase.py b/direct/src/distributed/DistributedSmoothNodeBase.py index 86e56f9477..d27b13e0cd 100755 --- a/direct/src/distributed/DistributedSmoothNodeBase.py +++ b/direct/src/distributed/DistributedSmoothNodeBase.py @@ -1,6 +1,6 @@ """DistributedSmoothNodeBase module: contains the DistributedSmoothNodeBase class""" -from .ClockDelta import * +from .ClockDelta import globalClockDelta from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.showbase.PythonUtil import randFloat diff --git a/direct/src/distributed/DoInterestManager.py b/direct/src/distributed/DoInterestManager.py index ca17e774be..7be8d0d294 100755 --- a/direct/src/distributed/DoInterestManager.py +++ b/direct/src/distributed/DoInterestManager.py @@ -7,16 +7,22 @@ zone, remove interest in that zone. p.s. A great deal of this code is just code moved from ClientRepository.py. """ -from panda3d.core import * -from panda3d.direct import * -from .MsgTypes import * -from direct.showbase.PythonUtil import * +from panda3d.core import ConfigVariableBool +from .MsgTypes import CLIENT_ADD_INTEREST, CLIENT_ADD_INTEREST_MULTIPLE, CLIENT_REMOVE_INTEREST from direct.showbase import DirectObject from direct.showbase.MessengerGlobal import messenger from .PyDatagram import PyDatagram from direct.directnotify.DirectNotifyGlobal import directNotify import types -from direct.showbase.PythonUtil import report +from direct.showbase.PythonUtil import ( + FrameDelayedCall, + ScratchPad, + SerialNumGen, + report, + serialNum, + uniqueElements, + uniqueName, +) class InterestState: StateActive = 'Active' diff --git a/direct/src/distributed/GridParent.py b/direct/src/distributed/GridParent.py index c17d980c27..3a38ae5d3a 100755 --- a/direct/src/distributed/GridParent.py +++ b/direct/src/distributed/GridParent.py @@ -1,6 +1,4 @@ - -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import NodePath # # GridParent.py diff --git a/direct/src/distributed/PyDatagram.py b/direct/src/distributed/PyDatagram.py index 98d4ed8504..6fbd5abfff 100755 --- a/direct/src/distributed/PyDatagram.py +++ b/direct/src/distributed/PyDatagram.py @@ -4,10 +4,30 @@ # of the file rather than every time we call the putArg function. from panda3d.core import Datagram -from panda3d.direct import * +from panda3d.direct import ( + STInt8, + STInt16, + STInt32, + STInt64, + STUint8, + STUint16, + STUint32, + STUint64, + STFloat64, + STString, + STBlob, + STBlob32, + STInt16array, + STInt32array, + STUint16array, + STUint32array, + STInt8array, + STUint8array, + STUint32uint8array, +) # Import the type numbers -from direct.distributed.MsgTypes import * +from direct.distributed.MsgTypes import CONTROL_CHANNEL class PyDatagram(Datagram): diff --git a/direct/src/distributed/PyDatagramIterator.py b/direct/src/distributed/PyDatagramIterator.py index 591734c0dc..6e9b6c532b 100755 --- a/direct/src/distributed/PyDatagramIterator.py +++ b/direct/src/distributed/PyDatagramIterator.py @@ -3,8 +3,28 @@ # class variable FuncDict and so we can import DCSubatomicType at the top # of the file rather than every time we call the putArg function. -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import DatagramIterator +from panda3d.direct import ( + STInt8, + STInt16, + STInt32, + STInt64, + STUint8, + STUint16, + STUint32, + STUint64, + STFloat64, + STString, + STBlob, + STBlob32, + STInt16array, + STInt32array, + STUint16array, + STUint32array, + STInt8array, + STUint8array, + STUint32uint8array, +) # Import the type numbers diff --git a/direct/src/distributed/SampleObject.py b/direct/src/distributed/SampleObject.py index 67ff510410..940cf91e11 100644 --- a/direct/src/distributed/SampleObject.py +++ b/direct/src/distributed/SampleObject.py @@ -1,7 +1,7 @@ """SampleObject module: contains the SampleObject class""" -from direct.directnotify.DirectNotifyGlobal import * -from direct.distributed.DistributedObject import * +from direct.directnotify.DirectNotifyGlobal import directNotify +from direct.distributed.DistributedObject import DistributedObject class SampleObject(DistributedObject): diff --git a/direct/src/distributed/ServerRepository.py b/direct/src/distributed/ServerRepository.py index add0b80981..58ffc5dde7 100644 --- a/direct/src/distributed/ServerRepository.py +++ b/direct/src/distributed/ServerRepository.py @@ -1,8 +1,38 @@ """ServerRepository module: contains the ServerRepository class""" -from panda3d.core import * -from panda3d.direct import * -from direct.distributed.MsgTypesCMU import * +from panda3d.core import ( + ConfigVariableBool, + ConfigVariableDouble, + ConfigVariableInt, + ConnectionWriter, + DatagramIterator, + Filename, + NetAddress, + NetDatagram, + PointerToConnection, + QueuedConnectionListener, + QueuedConnectionManager, + QueuedConnectionReader, + TPLow, + UniqueIdAllocator, + VirtualFileSystem, + getModelPath, +) +from panda3d.direct import DCFile +from direct.distributed.MsgTypesCMU import ( + CLIENT_DISCONNECT_CMU, + CLIENT_OBJECT_GENERATE_CMU, + CLIENT_OBJECT_UPDATE_FIELD, + CLIENT_OBJECT_UPDATE_FIELD_TARGETED_CMU, + CLIENT_SET_INTEREST_CMU, + OBJECT_DELETE_CMU, + OBJECT_DISABLE_CMU, + OBJECT_GENERATE_CMU, + OBJECT_SET_ZONE_CMU, + OBJECT_UPDATE_FIELD_CMU, + REQUEST_GENERATES_CMU, + SET_DOID_RANGE_CMU, +) from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.directnotify import DirectNotifyGlobal diff --git a/direct/src/distributed/TimeManager.py b/direct/src/distributed/TimeManager.py index cb29b0a8ac..a16318544a 100644 --- a/direct/src/distributed/TimeManager.py +++ b/direct/src/distributed/TimeManager.py @@ -1,5 +1,4 @@ -from panda3d.core import * -from direct.showbase.DirectObject import * +from panda3d.core import ClockObject, ConfigVariableDouble, ConfigVariableInt from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.distributed import DistributedObject diff --git a/direct/src/distributed/TimeManagerAI.py b/direct/src/distributed/TimeManagerAI.py index fab2e8090f..38f3e4eb47 100644 --- a/direct/src/distributed/TimeManagerAI.py +++ b/direct/src/distributed/TimeManagerAI.py @@ -1,5 +1,5 @@ -from panda3d.core import * -from direct.distributed.ClockDelta import * +from direct.directnotify import DirectNotifyGlobal +from direct.distributed.ClockDelta import globalClockDelta from direct.distributed import DistributedObjectAI class TimeManagerAI(DistributedObjectAI.DistributedObjectAI): diff --git a/direct/src/filter/FilterManager.py b/direct/src/filter/FilterManager.py index fee9a02365..7422477324 100644 --- a/direct/src/filter/FilterManager.py +++ b/direct/src/filter/FilterManager.py @@ -25,7 +25,7 @@ from panda3d.core import Camera from panda3d.core import OrthographicLens from panda3d.core import AuxBitplaneAttrib from panda3d.core import LightRampAttrib -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.DirectObject import DirectObject __all__ = ["FilterManager"] diff --git a/direct/src/gui/DirectButton.py b/direct/src/gui/DirectButton.py index f1fd744af6..17fbe8a75f 100644 --- a/direct/src/gui/DirectButton.py +++ b/direct/src/gui/DirectButton.py @@ -6,9 +6,9 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectButton'] -from panda3d.core import * +from panda3d.core import Mat4, MouseButton, PGButton from . import DirectGuiGlobals as DGG -from .DirectFrame import * +from .DirectFrame import DirectFrame class DirectButton(DirectFrame): """ diff --git a/direct/src/gui/DirectCheckBox.py b/direct/src/gui/DirectCheckBox.py index adaf11258d..8488f701d2 100755 --- a/direct/src/gui/DirectCheckBox.py +++ b/direct/src/gui/DirectCheckBox.py @@ -1,5 +1,5 @@ -from direct.gui.DirectGui import * -from panda3d.core import * +from direct.gui.DirectGui import DGG, DirectButton +from panda3d.core import PGButton class DirectCheckBox(DirectButton): diff --git a/direct/src/gui/DirectCheckButton.py b/direct/src/gui/DirectCheckButton.py index 22f7a88f93..0f8344cdad 100644 --- a/direct/src/gui/DirectCheckButton.py +++ b/direct/src/gui/DirectCheckButton.py @@ -8,9 +8,9 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectCheckButton'] -from panda3d.core import * -from .DirectButton import * -from .DirectLabel import * +from panda3d.core import PGFrameStyle, VBase4 +from .DirectButton import DirectButton +from .DirectLabel import DirectLabel class DirectCheckButton(DirectButton): """ diff --git a/direct/src/gui/DirectDialog.py b/direct/src/gui/DirectDialog.py index 7e9fce72a7..e6c1642f81 100644 --- a/direct/src/gui/DirectDialog.py +++ b/direct/src/gui/DirectDialog.py @@ -9,11 +9,11 @@ __all__ = [ 'OkCancelDialog', 'YesNoDialog', 'YesNoCancelDialog', 'RetryCancelDialog', ] -from panda3d.core import * +from panda3d.core import NodePath, Point3, TextNode, VBase3 from direct.showbase import ShowBaseGlobal from . import DirectGuiGlobals as DGG -from .DirectFrame import * -from .DirectButton import * +from .DirectFrame import DirectFrame +from .DirectButton import DirectButton def findDialog(uniqueName): diff --git a/direct/src/gui/DirectEntry.py b/direct/src/gui/DirectEntry.py index cc402d853e..e8e1293b9d 100644 --- a/direct/src/gui/DirectEntry.py +++ b/direct/src/gui/DirectEntry.py @@ -7,10 +7,10 @@ explanation and an example of how to use this class. __all__ = ['DirectEntry'] -from panda3d.core import * +from panda3d.core import ConfigVariableBool, PGEntry, Point3, TextNode, Vec3 from direct.showbase import ShowBaseGlobal from . import DirectGuiGlobals as DGG -from .DirectFrame import * +from .DirectFrame import DirectFrame from .OnscreenText import OnscreenText # import this to make sure it gets pulled into the publish import encodings.utf_8 diff --git a/direct/src/gui/DirectEntryScroll.py b/direct/src/gui/DirectEntryScroll.py index 10fc2f6c9d..d846561a10 100644 --- a/direct/src/gui/DirectEntryScroll.py +++ b/direct/src/gui/DirectEntryScroll.py @@ -1,10 +1,9 @@ __all__ = ['DirectEntryScroll'] -from panda3d.core import * +from panda3d.core import NodePath, OmniBoundingVolume, PGVirtualFrame from . import DirectGuiGlobals as DGG -from .DirectScrolledFrame import * -from .DirectFrame import * -from .DirectEntry import * +from .DirectFrame import DirectFrame +from .DirectEntry import DirectEntry class DirectEntryScroll(DirectFrame): def __init__(self, entry, parent = None, **kw): diff --git a/direct/src/gui/DirectFrame.py b/direct/src/gui/DirectFrame.py index 96b782a666..6f5cf69be4 100644 --- a/direct/src/gui/DirectFrame.py +++ b/direct/src/gui/DirectFrame.py @@ -18,9 +18,9 @@ explanation and an example of how to use this class. __all__ = ['DirectFrame'] -from panda3d.core import * +from panda3d.core import Filename, NodePath, PGItem, Texture from . import DirectGuiGlobals as DGG -from .DirectGuiBase import * +from .DirectGuiBase import DirectGuiWidget from .OnscreenImage import OnscreenImage from .OnscreenGeom import OnscreenGeom from .OnscreenText import OnscreenText diff --git a/direct/src/gui/DirectGuiBase.py b/direct/src/gui/DirectGuiBase.py index 159c2f2063..4c7b85a232 100644 --- a/direct/src/gui/DirectGuiBase.py +++ b/direct/src/gui/DirectGuiBase.py @@ -87,14 +87,21 @@ Code overview: __all__ = ['DirectGuiBase', 'DirectGuiWidget'] -from panda3d.core import * +from panda3d.core import ( + ConfigVariableBool, + KeyboardButton, + MouseWatcherRegion, + NodePath, + PGFrameStyle, + PGItem, + Point3, + Texture, + Vec3, +) from direct.showbase import ShowBaseGlobal from direct.showbase.ShowBase import ShowBase from direct.showbase.MessengerGlobal import messenger from . import DirectGuiGlobals as DGG -from .OnscreenText import * -from .OnscreenGeom import * -from .OnscreenImage import * from direct.directtools.DirectUtil import ROUND_TO from direct.showbase import DirectObject from direct.task import Task diff --git a/direct/src/gui/DirectGuiGlobals.py b/direct/src/gui/DirectGuiGlobals.py index 7cb985e972..5d357808f8 100644 --- a/direct/src/gui/DirectGuiGlobals.py +++ b/direct/src/gui/DirectGuiGlobals.py @@ -5,7 +5,15 @@ that can be used during widget construction __all__ = [] -from panda3d.core import * +from panda3d.core import ( + KeyboardButton, + MouseButton, + PGButton, + PGEntry, + PGFrameStyle, + PGSliderBar, + TextNode, +) defaultFont = None defaultFontFunc = TextNode.getDefaultFont diff --git a/direct/src/gui/DirectGuiTest.py b/direct/src/gui/DirectGuiTest.py index 2a33d1600b..622bd17d77 100644 --- a/direct/src/gui/DirectGuiTest.py +++ b/direct/src/gui/DirectGuiTest.py @@ -4,12 +4,13 @@ __all__ = [] if __name__ == "__main__": + from panda3d.core import Point3 from direct.showbase.ShowBase import ShowBase from direct.task.TaskManagerGlobal import taskMgr from . import DirectGuiGlobals - from .DirectGui import * + from .DirectGui import DirectButton, DirectDialog, DirectEntry, DirectFrame, YesNoDialog #from whrandom import * - from random import * + from random import random base = ShowBase() diff --git a/direct/src/gui/DirectLabel.py b/direct/src/gui/DirectLabel.py index aa965bbe61..5b676daf65 100644 --- a/direct/src/gui/DirectLabel.py +++ b/direct/src/gui/DirectLabel.py @@ -6,8 +6,8 @@ explanation and an example of how to use this class. __all__ = ['DirectLabel'] -from panda3d.core import * -from .DirectFrame import * +from panda3d.core import PGItem +from .DirectFrame import DirectFrame class DirectLabel(DirectFrame): """ diff --git a/direct/src/gui/DirectOptionMenu.py b/direct/src/gui/DirectOptionMenu.py index be6af85ee8..2b09943906 100644 --- a/direct/src/gui/DirectOptionMenu.py +++ b/direct/src/gui/DirectOptionMenu.py @@ -6,12 +6,11 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectOptionMenu'] -from panda3d.core import * +from panda3d.core import OmniBoundingVolume, TextNode, VBase3 from direct.showbase import ShowBaseGlobal from . import DirectGuiGlobals as DGG -from .DirectButton import * -from .DirectLabel import * -from .DirectFrame import * +from .DirectButton import DirectButton +from .DirectFrame import DirectFrame class DirectOptionMenu(DirectButton): diff --git a/direct/src/gui/DirectRadioButton.py b/direct/src/gui/DirectRadioButton.py index cbc16698b9..d395c3f2de 100755 --- a/direct/src/gui/DirectRadioButton.py +++ b/direct/src/gui/DirectRadioButton.py @@ -9,10 +9,10 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectRadioButton'] -from panda3d.core import * +from panda3d.core import PGFrameStyle, VBase4 from . import DirectGuiGlobals as DGG -from .DirectButton import * -from .DirectLabel import * +from .DirectButton import DirectButton +from .DirectLabel import DirectLabel class DirectRadioButton(DirectButton): """ diff --git a/direct/src/gui/DirectScrollBar.py b/direct/src/gui/DirectScrollBar.py index e9540529f2..fc10a88d7d 100644 --- a/direct/src/gui/DirectScrollBar.py +++ b/direct/src/gui/DirectScrollBar.py @@ -6,10 +6,10 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectScrollBar'] -from panda3d.core import * +from panda3d.core import PGSliderBar, Vec3 from . import DirectGuiGlobals as DGG -from .DirectFrame import * -from .DirectButton import * +from .DirectFrame import DirectFrame +from .DirectButton import DirectButton class DirectScrollBar(DirectFrame): diff --git a/direct/src/gui/DirectScrolledFrame.py b/direct/src/gui/DirectScrolledFrame.py index 73e35c9440..ca434304e3 100644 --- a/direct/src/gui/DirectScrolledFrame.py +++ b/direct/src/gui/DirectScrolledFrame.py @@ -6,10 +6,10 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectScrolledFrame'] -from panda3d.core import * +from panda3d.core import NodePath, PGScrollFrame from . import DirectGuiGlobals as DGG -from .DirectFrame import * -from .DirectScrollBar import * +from .DirectFrame import DirectFrame +from .DirectScrollBar import DirectScrollBar class DirectScrolledFrame(DirectFrame): diff --git a/direct/src/gui/DirectScrolledList.py b/direct/src/gui/DirectScrolledList.py index 70331e67f1..438c601520 100644 --- a/direct/src/gui/DirectScrolledList.py +++ b/direct/src/gui/DirectScrolledList.py @@ -6,14 +6,14 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectScrolledListItem', 'DirectScrolledList'] -from panda3d.core import * +from panda3d.core import TextNode from direct.showbase import ShowBaseGlobal from . import DirectGuiGlobals as DGG from direct.directnotify import DirectNotifyGlobal from direct.task.Task import Task from direct.task.TaskManagerGlobal import taskMgr -from .DirectFrame import * -from .DirectButton import * +from .DirectFrame import DirectFrame +from .DirectButton import DirectButton class DirectScrolledListItem(DirectButton): diff --git a/direct/src/gui/DirectSlider.py b/direct/src/gui/DirectSlider.py index 61e8957de2..6f3e8d7825 100644 --- a/direct/src/gui/DirectSlider.py +++ b/direct/src/gui/DirectSlider.py @@ -6,10 +6,10 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectSlider'] -from panda3d.core import * +from panda3d.core import PGSliderBar, Vec3 from . import DirectGuiGlobals as DGG -from .DirectFrame import * -from .DirectButton import * +from .DirectFrame import DirectFrame +from .DirectButton import DirectButton from math import isnan diff --git a/direct/src/gui/DirectWaitBar.py b/direct/src/gui/DirectWaitBar.py index 5afecfe64c..c6a42d8947 100644 --- a/direct/src/gui/DirectWaitBar.py +++ b/direct/src/gui/DirectWaitBar.py @@ -6,9 +6,9 @@ in-depth explanation and an example of how to use this class. __all__ = ['DirectWaitBar'] -from panda3d.core import * +from panda3d.core import PGFrameStyle, PGWaitBar from . import DirectGuiGlobals as DGG -from .DirectFrame import * +from .DirectFrame import DirectFrame class DirectWaitBar(DirectFrame): diff --git a/direct/src/gui/OnscreenGeom.py b/direct/src/gui/OnscreenGeom.py index daa1a8de5d..e764ece595 100644 --- a/direct/src/gui/OnscreenGeom.py +++ b/direct/src/gui/OnscreenGeom.py @@ -2,7 +2,7 @@ __all__ = ['OnscreenGeom'] -from panda3d.core import * +from panda3d.core import NodePath, VBase3 from direct.showbase.DirectObject import DirectObject diff --git a/direct/src/gui/OnscreenImage.py b/direct/src/gui/OnscreenImage.py index bb1494b60a..aa8a2875fb 100644 --- a/direct/src/gui/OnscreenImage.py +++ b/direct/src/gui/OnscreenImage.py @@ -6,7 +6,7 @@ this class. __all__ = ['OnscreenImage'] -from panda3d.core import * +from panda3d.core import CardMaker, NodePath, Texture, TexturePool, VBase3 from direct.showbase.DirectObject import DirectObject diff --git a/direct/src/gui/OnscreenText.py b/direct/src/gui/OnscreenText.py index fa0ff99830..67a9358957 100644 --- a/direct/src/gui/OnscreenText.py +++ b/direct/src/gui/OnscreenText.py @@ -6,7 +6,7 @@ this class. __all__ = ['OnscreenText', 'Plain', 'ScreenTitle', 'ScreenPrompt', 'NameConfirm', 'BlackOnWhite'] -from panda3d.core import * +from panda3d.core import LColor, Mat4, NodePath, Point3, TextNode, TextProperties, Vec3 from . import DirectGuiGlobals as DGG import warnings diff --git a/direct/src/interval/ActorInterval.py b/direct/src/interval/ActorInterval.py index 76b741820a..8b12c9e5f2 100644 --- a/direct/src/interval/ActorInterval.py +++ b/direct/src/interval/ActorInterval.py @@ -6,9 +6,8 @@ of this class. __all__ = ['ActorInterval', 'LerpAnimInterval'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.direct import CInterval, CLerpAnimEffectInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval import math diff --git a/direct/src/interval/AnimControlInterval.py b/direct/src/interval/AnimControlInterval.py index 1c2abf090f..4bfe06b1b1 100755 --- a/direct/src/interval/AnimControlInterval.py +++ b/direct/src/interval/AnimControlInterval.py @@ -2,9 +2,9 @@ __all__ = ['AnimControlInterval'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.core import AnimControl, AnimControlCollection, ConfigVariableBool +from panda3d.direct import CInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval import math diff --git a/direct/src/interval/FunctionInterval.py b/direct/src/interval/FunctionInterval.py index e7e0c490c9..c12be80189 100644 --- a/direct/src/interval/FunctionInterval.py +++ b/direct/src/interval/FunctionInterval.py @@ -2,9 +2,8 @@ __all__ = ['FunctionInterval', 'EventInterval', 'AcceptInterval', 'IgnoreInterval', 'ParentInterval', 'WrtParentInterval', 'PosInterval', 'HprInterval', 'ScaleInterval', 'PosHprInterval', 'HprScaleInterval', 'PosHprScaleInterval', 'Func', 'Wait'] -from panda3d.core import * -from panda3d.direct import * -from direct.showbase.MessengerGlobal import * +from panda3d.direct import WaitInterval +from direct.showbase.MessengerGlobal import messenger from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval diff --git a/direct/src/interval/IndirectInterval.py b/direct/src/interval/IndirectInterval.py index 901940077f..4cf31eabc2 100644 --- a/direct/src/interval/IndirectInterval.py +++ b/direct/src/interval/IndirectInterval.py @@ -2,9 +2,8 @@ __all__ = ['IndirectInterval'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.direct import CInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval from . import LerpBlendHelpers diff --git a/direct/src/interval/Interval.py b/direct/src/interval/Interval.py index 4172c1c982..656edcc912 100644 --- a/direct/src/interval/Interval.py +++ b/direct/src/interval/Interval.py @@ -2,8 +2,8 @@ __all__ = ['Interval'] -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import ClockObject, PStatCollector +from panda3d.direct import CInterval from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.DirectObject import DirectObject from direct.showbase.MessengerGlobal import messenger diff --git a/direct/src/interval/IntervalManager.py b/direct/src/interval/IntervalManager.py index 433814fee7..f3e3f7d13d 100644 --- a/direct/src/interval/IntervalManager.py +++ b/direct/src/interval/IntervalManager.py @@ -3,9 +3,8 @@ this class, ivalMgr.""" __all__ = ['IntervalManager', 'ivalMgr'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.core import EventQueue +from panda3d.direct import CIntervalManager, Dtool_BorrowThisReference from direct.showbase import EventManager import fnmatch diff --git a/direct/src/interval/IntervalTest.py b/direct/src/interval/IntervalTest.py index c89ea26e9d..74c06e4fab 100644 --- a/direct/src/interval/IntervalTest.py +++ b/direct/src/interval/IntervalTest.py @@ -4,11 +4,23 @@ __all__ = [] if __name__ == "__main__": - from panda3d.core import * + from panda3d.core import Filename, Point3, Vec3 + from direct.showbase.DirectObject import DirectObject from direct.showbase.ShowBase import ShowBase - from direct.actor.Actor import * + from direct.actor.Actor import Actor from direct.directutil import Mopath - from .IntervalGlobal import * + from .ActorInterval import ActorInterval + from .FunctionInterval import ( + AcceptInterval, + EventInterval, + FunctionInterval, + IgnoreInterval, + PosHprInterval, + ) + from .LerpInterval import LerpPosInterval, LerpHprInterval, LerpPosHprInterval + from .MopathInterval import MopathInterval + from .SoundInterval import SoundInterval + from .MetaInterval import PREVIOUS_END, PREVIOUS_START, TRACK_START, Track base = ShowBase() diff --git a/direct/src/interval/LerpBlendHelpers.py b/direct/src/interval/LerpBlendHelpers.py index c723b373e8..955f2ce027 100644 --- a/direct/src/interval/LerpBlendHelpers.py +++ b/direct/src/interval/LerpBlendHelpers.py @@ -2,7 +2,7 @@ __all__ = ['getBlend'] -from panda3d.direct import * +from panda3d.direct import EaseInBlendType, EaseInOutBlendType, EaseOutBlendType, NoBlendType easeIn = EaseInBlendType() diff --git a/direct/src/interval/LerpInterval.py b/direct/src/interval/LerpInterval.py index 806299307f..2dbeb018bd 100644 --- a/direct/src/interval/LerpInterval.py +++ b/direct/src/interval/LerpInterval.py @@ -12,9 +12,9 @@ __all__ = [ 'LerpFunctionInterval', 'LerpFunc','LerpFunctionNoStateInterval','LerpFuncNS' ] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.core import LOrientationf, NodePath +from panda3d.direct import CInterval, CLerpNodePathInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval from . import LerpBlendHelpers diff --git a/direct/src/interval/MetaInterval.py b/direct/src/interval/MetaInterval.py index f2b8166e79..d6336dc1fa 100644 --- a/direct/src/interval/MetaInterval.py +++ b/direct/src/interval/MetaInterval.py @@ -5,9 +5,9 @@ intervals either in parallel or in a specified sequential order. __all__ = ['MetaInterval', 'Sequence', 'Parallel', 'ParallelEndTogether', 'Track'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.core import PStatCollector, ostream +from panda3d.direct import CInterval, CMetaInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from .IntervalManager import ivalMgr from . import Interval from direct.task.Task import TaskManager diff --git a/direct/src/interval/MopathInterval.py b/direct/src/interval/MopathInterval.py index cc5dafc74d..ccf3c72055 100644 --- a/direct/src/interval/MopathInterval.py +++ b/direct/src/interval/MopathInterval.py @@ -3,9 +3,7 @@ __all__ = ['MopathInterval'] from . import LerpInterval -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify # import Mopath diff --git a/direct/src/interval/ParticleInterval.py b/direct/src/interval/ParticleInterval.py index d119853b60..d9b2c42db4 100644 --- a/direct/src/interval/ParticleInterval.py +++ b/direct/src/interval/ParticleInterval.py @@ -4,8 +4,7 @@ Contains the ParticleInterval class __all__ = ['ParticleInterval'] -from panda3d.core import * -from panda3d.direct import * +from panda3d.direct import CInterval from direct.directnotify.DirectNotifyGlobal import directNotify from .Interval import Interval diff --git a/direct/src/interval/ProjectileInterval.py b/direct/src/interval/ProjectileInterval.py index b6d0d9ea1d..fb85f4164c 100755 --- a/direct/src/interval/ProjectileInterval.py +++ b/direct/src/interval/ProjectileInterval.py @@ -2,9 +2,8 @@ __all__ = ['ProjectileInterval'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.core import CollisionParabola, LParabola, NodePath, Point3, VBase3 +from direct.directnotify.DirectNotifyGlobal import directNotify from .Interval import Interval from direct.showbase import PythonUtil diff --git a/direct/src/interval/ProjectileIntervalTest.py b/direct/src/interval/ProjectileIntervalTest.py index fedbfcefac..ca790fa21d 100755 --- a/direct/src/interval/ProjectileIntervalTest.py +++ b/direct/src/interval/ProjectileIntervalTest.py @@ -2,9 +2,8 @@ __all__ = ['doTest'] -from panda3d.core import * -from panda3d.direct import * -from .IntervalGlobal import * +from panda3d.core import Point3 +from .ProjectileInterval import ProjectileInterval def doTest(): diff --git a/direct/src/interval/SoundInterval.py b/direct/src/interval/SoundInterval.py index f523fbb9b0..fc950036a9 100644 --- a/direct/src/interval/SoundInterval.py +++ b/direct/src/interval/SoundInterval.py @@ -2,9 +2,8 @@ __all__ = ['SoundInterval'] -from panda3d.core import * -from panda3d.direct import * -from direct.directnotify.DirectNotifyGlobal import * +from panda3d.direct import CInterval +from direct.directnotify.DirectNotifyGlobal import directNotify from . import Interval import random diff --git a/direct/src/interval/TestInterval.py b/direct/src/interval/TestInterval.py index ab729ff941..65cb84d895 100755 --- a/direct/src/interval/TestInterval.py +++ b/direct/src/interval/TestInterval.py @@ -4,8 +4,7 @@ Contains the TestInterval class __all__ = ['TestInterval'] -from panda3d.core import * -from panda3d.direct import * +from panda3d.direct import CInterval from direct.directnotify.DirectNotifyGlobal import directNotify from .Interval import Interval diff --git a/direct/src/leveleditor/ActionMgr.py b/direct/src/leveleditor/ActionMgr.py index 1b7f340fb1..efae09d989 100755 --- a/direct/src/leveleditor/ActionMgr.py +++ b/direct/src/leveleditor/ActionMgr.py @@ -1,4 +1,4 @@ -from panda3d.core import * +from panda3d.core import Mat4 from direct.showbase.PythonUtil import Functor from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/AnimControlUI.py b/direct/src/leveleditor/AnimControlUI.py index b10bb32647..8381e68b83 100755 --- a/direct/src/leveleditor/AnimControlUI.py +++ b/direct/src/leveleditor/AnimControlUI.py @@ -1,8 +1,6 @@ """ This is the GUI for the Animation Control Panel """ -from direct.interval.IntervalGlobal import * -from direct.actor.Actor import * from . import ObjectGlobals as OG import os diff --git a/direct/src/leveleditor/AnimMgr.py b/direct/src/leveleditor/AnimMgr.py index f57766f791..60b5469978 100755 --- a/direct/src/leveleditor/AnimMgr.py +++ b/direct/src/leveleditor/AnimMgr.py @@ -1,7 +1,7 @@ """ Defines AnimMgr """ -from .AnimMgrBase import * +from .AnimMgrBase import AnimMgrBase class AnimMgr(AnimMgrBase): """ Animation will create, manage, update animations in the scene """ diff --git a/direct/src/leveleditor/AnimMgrBase.py b/direct/src/leveleditor/AnimMgrBase.py index 56d512c365..40f8cdf59b 100755 --- a/direct/src/leveleditor/AnimMgrBase.py +++ b/direct/src/leveleditor/AnimMgrBase.py @@ -5,7 +5,9 @@ Defines AnimMgrBase import os import math -from direct.interval.IntervalGlobal import * +from direct.interval.ActorInterval import ActorInterval +from direct.interval.LerpInterval import LerpFunc, LerpPosHprInterval +from direct.interval.MetaInterval import Parallel, Sequence from panda3d.core import VBase3 from . import ObjectGlobals as OG from . import AnimGlobals as AG diff --git a/direct/src/leveleditor/CurveAnimUI.py b/direct/src/leveleditor/CurveAnimUI.py index 37a16245fb..ca6a47b489 100755 --- a/direct/src/leveleditor/CurveAnimUI.py +++ b/direct/src/leveleditor/CurveAnimUI.py @@ -3,8 +3,6 @@ """ import wx -from direct.interval.IntervalGlobal import * -from direct.actor.Actor import * from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/CurveEditor.py b/direct/src/leveleditor/CurveEditor.py index 8142a69c07..4fb846037d 100755 --- a/direct/src/leveleditor/CurveEditor.py +++ b/direct/src/leveleditor/CurveEditor.py @@ -2,12 +2,10 @@ This is the module for curve edit """ -from panda3d.core import * -from direct.wxwidgets.WxPandaShell import * -from direct.showbase.DirectObject import * +from panda3d.core import BitMask32, Mat4, NodePath +from direct.showbase.DirectObject import DirectObject from direct.directtools.DirectSelection import SelectionRay from direct.showutil.Rope import Rope -from .ActionMgr import * from direct.task import Task diff --git a/direct/src/leveleditor/GraphEditorUI.py b/direct/src/leveleditor/GraphEditorUI.py index 2521c8d8be..25efd64155 100755 --- a/direct/src/leveleditor/GraphEditorUI.py +++ b/direct/src/leveleditor/GraphEditorUI.py @@ -3,7 +3,6 @@ Defines Graph Editor """ import wx import math -from .PaletteTreeCtrl import * from . import ObjectGlobals as OG from . import AnimGlobals as AG from wx.lib.embeddedimage import PyEmbeddedImage diff --git a/direct/src/leveleditor/LayerEditorUI.py b/direct/src/leveleditor/LayerEditorUI.py index 2db7929fee..c2fccfd7b1 100644 --- a/direct/src/leveleditor/LayerEditorUI.py +++ b/direct/src/leveleditor/LayerEditorUI.py @@ -2,7 +2,6 @@ Defines Layer UI """ import wx -from panda3d.core import * from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/LevelEditor.py b/direct/src/leveleditor/LevelEditor.py index 36b1dd86e0..786f934095 100644 --- a/direct/src/leveleditor/LevelEditor.py +++ b/direct/src/leveleditor/LevelEditor.py @@ -5,13 +5,15 @@ LevelEditor, ObjectHandler, ObjectPalette should be rewritten to be game specific. """ -from .LevelEditorUI import * -from .LevelEditorBase import * -from .ObjectMgr import * -from .AnimMgr import * -from .ObjectHandler import * -from .ObjectPalette import * -from .ProtoPalette import * +import os +import wx +from .LevelEditorUI import LevelEditorUI +from .LevelEditorBase import LevelEditorBase +from .ObjectMgr import ObjectMgr +from .AnimMgr import AnimMgr +from .ObjectHandler import ObjectHandler +from .ObjectPalette import ObjectPalette +from .ProtoPalette import ProtoPalette class LevelEditor(LevelEditorBase): """ Class for Panda3D LevelEditor """ diff --git a/direct/src/leveleditor/LevelEditorBase.py b/direct/src/leveleditor/LevelEditorBase.py index 646be9e86e..97fbddf1fe 100755 --- a/direct/src/leveleditor/LevelEditorBase.py +++ b/direct/src/leveleditor/LevelEditorBase.py @@ -5,15 +5,25 @@ You should write your own LevelEditor class inheriting this. Refer LevelEditor.py for example. """ -from direct.showbase.DirectObject import * -from direct.directtools.DirectUtil import * -from direct.gui.DirectGui import * -from panda3d.core import ClockObject +import os +import wx -from .CurveEditor import * -from .FileMgr import * -from .ActionMgr import * -from .MayaConverter import * +from direct.showbase.DirectObject import DirectObject +from direct.directtools.DirectUtil import useDirectRenderStyle +from direct.gui.OnscreenText import OnscreenText +from panda3d.core import BitMask32, ClockObject, Mat4, NodePath, Point3, TextNode, Vec4 + +from . import ObjectGlobals as OG +from .CurveEditor import CurveEditor +from .FileMgr import FileMgr +from .ActionMgr import ( + ActionDeleteObj, + ActionDeselectAll, + ActionMgr, + ActionSelectObj, + ActionTransformObj, +) +from .MayaConverter import FROM_BAM_TO_MAYA, MayaConverter class LevelEditorBase(DirectObject): diff --git a/direct/src/leveleditor/LevelEditorUI.py b/direct/src/leveleditor/LevelEditorUI.py index 9fec2d28d8..1d32d6d0ba 100755 --- a/direct/src/leveleditor/LevelEditorUI.py +++ b/direct/src/leveleditor/LevelEditorUI.py @@ -1,4 +1,4 @@ -from .LevelEditorUIBase import * +from .LevelEditorUIBase import LevelEditorUIBase class LevelEditorUI(LevelEditorUIBase): """ Class for Panda3D LevelEditor """ diff --git a/direct/src/leveleditor/LevelEditorUIBase.py b/direct/src/leveleditor/LevelEditorUIBase.py index 6c9e6469b5..e5edfe5423 100755 --- a/direct/src/leveleditor/LevelEditorUIBase.py +++ b/direct/src/leveleditor/LevelEditorUIBase.py @@ -1,22 +1,24 @@ -## import wx -## import os +import wx +import os ## from wx.lib.agw import fourwaysplitter as FWS -from panda3d.core import * -from direct.wxwidgets.WxPandaShell import * +from panda3d.core import BitMask32, Mat4, NodePath, Vec3 +from direct.wxwidgets.WxPandaShell import WxPandaShell +from direct.wxwidgets.WxSlider import WxSlider from direct.directtools.DirectSelection import SelectionRay #from ViewPort import * -from .ObjectPaletteUI import * -from .ObjectPropertyUI import * -from .SceneGraphUI import * -from .LayerEditorUI import * -from .HotKeyUI import * -from .ProtoPaletteUI import * -from .ActionMgr import * -from .AnimControlUI import * -from .CurveAnimUI import * -from .GraphEditorUI import * +from . import ObjectGlobals as OG +from .ObjectPaletteUI import ObjectPaletteUI +from .ObjectPropertyUI import ObjectPropertyUI +from .SceneGraphUI import SceneGraphUI +from .LayerEditorUI import LayerEditorUI +from .HotKeyUI import HotKeyUI +from .ProtoPaletteUI import ProtoPaletteUI +from .ActionMgr import ActionAddNewObj, ActionTransformObj +from .AnimControlUI import AnimControlUI +from .CurveAnimUI import CurveAnimUI +from .GraphEditorUI import GraphEditorUI class PandaTextDropTarget(wx.TextDropTarget): def __init__(self, editor, view): diff --git a/direct/src/leveleditor/MayaConverter.py b/direct/src/leveleditor/MayaConverter.py index 712e03b99f..3ddcab1b94 100755 --- a/direct/src/leveleditor/MayaConverter.py +++ b/direct/src/leveleditor/MayaConverter.py @@ -1,4 +1,4 @@ -from direct.wxwidgets.WxAppShell import * +import wx import os from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/ObjectMgr.py b/direct/src/leveleditor/ObjectMgr.py index d80f8d4439..3c7e31578e 100755 --- a/direct/src/leveleditor/ObjectMgr.py +++ b/direct/src/leveleditor/ObjectMgr.py @@ -1,7 +1,7 @@ """ Defines ObjectMgr """ -from .ObjectMgrBase import * +from .ObjectMgrBase import ObjectMgrBase class ObjectMgr(ObjectMgrBase): """ ObjectMgr will create, manage, update objects in the scene """ diff --git a/direct/src/leveleditor/ObjectMgrBase.py b/direct/src/leveleditor/ObjectMgrBase.py index 84ddbeff43..a54c5350e7 100755 --- a/direct/src/leveleditor/ObjectMgrBase.py +++ b/direct/src/leveleditor/ObjectMgrBase.py @@ -6,11 +6,12 @@ import os import time import copy -from panda3d.core import * +from panda3d.core import ConfigVariableString, Filename, Mat4, NodePath from direct.actor.Actor import Actor +from direct.showbase.PythonUtil import Functor from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr -from .ActionMgr import * +from .ActionMgr import ActionTransformObj, ActionUpdateObjectProp from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/ObjectPalette.py b/direct/src/leveleditor/ObjectPalette.py index ff254cbb9c..157570b36c 100755 --- a/direct/src/leveleditor/ObjectPalette.py +++ b/direct/src/leveleditor/ObjectPalette.py @@ -14,7 +14,8 @@ Then you need implement ObjectPalette class inheriting ObjectPaletteBase, and in the populate function you can define ObjectPalette tree structure. """ -from .ObjectPaletteBase import * +from . import ObjectGlobals as OG +from .ObjectPaletteBase import ObjectBase, ObjectPaletteBase class ObjectProp(ObjectBase): def __init__(self, *args, **kw): diff --git a/direct/src/leveleditor/ObjectPaletteUI.py b/direct/src/leveleditor/ObjectPaletteUI.py index 050be1838e..c9ea35b9ed 100755 --- a/direct/src/leveleditor/ObjectPaletteUI.py +++ b/direct/src/leveleditor/ObjectPaletteUI.py @@ -2,7 +2,7 @@ Defines ObjectPalette tree UI """ import wx -from .PaletteTreeCtrl import * +from .PaletteTreeCtrl import PaletteTreeCtrl class ObjectPaletteUI(wx.Panel): diff --git a/direct/src/leveleditor/ObjectPropertyUI.py b/direct/src/leveleditor/ObjectPropertyUI.py index b1cb5259b0..2e6e7c0196 100755 --- a/direct/src/leveleditor/ObjectPropertyUI.py +++ b/direct/src/leveleditor/ObjectPropertyUI.py @@ -7,9 +7,9 @@ import math from wx.lib.embeddedimage import PyEmbeddedImage from wx.lib.scrolledpanel import ScrolledPanel -from wx.lib.agw.cubecolourdialog import * -from direct.wxwidgets.WxSlider import * -from panda3d.core import * +from wx.lib.agw.cubecolourdialog import CCD_SHOW_ALPHA, CubeColourDialog +from direct.wxwidgets.WxSlider import WxSlider +from panda3d.core import BitMask32, Filename from . import ObjectGlobals as OG from . import AnimGlobals as AG diff --git a/direct/src/leveleditor/PaletteTreeCtrl.py b/direct/src/leveleditor/PaletteTreeCtrl.py index a618ad5870..a60e4e4063 100644 --- a/direct/src/leveleditor/PaletteTreeCtrl.py +++ b/direct/src/leveleditor/PaletteTreeCtrl.py @@ -2,7 +2,7 @@ Defines Palette tree control """ import wx -from .ObjectPaletteBase import * +from .ObjectPaletteBase import ObjectBase, ObjectGen class PaletteTreeCtrl(wx.TreeCtrl): diff --git a/direct/src/leveleditor/ProtoObjsUI.py b/direct/src/leveleditor/ProtoObjsUI.py index 40a933ce1b..8ad9f3484d 100755 --- a/direct/src/leveleditor/ProtoObjsUI.py +++ b/direct/src/leveleditor/ProtoObjsUI.py @@ -4,8 +4,7 @@ Defines ProtoObjs List UI import wx import os -from panda3d.core import * -from .ProtoObjs import * +from panda3d.core import Filename class ProtoDropTarget(wx.PyDropTarget): diff --git a/direct/src/leveleditor/ProtoPalette.py b/direct/src/leveleditor/ProtoPalette.py index 12a3c4605c..0a84dc1f3a 100755 --- a/direct/src/leveleditor/ProtoPalette.py +++ b/direct/src/leveleditor/ProtoPalette.py @@ -2,7 +2,7 @@ Palette for Prototyping """ -from .ProtoPaletteBase import * +from .ProtoPaletteBase import ProtoPaletteBase import os class ProtoPalette(ProtoPaletteBase): diff --git a/direct/src/leveleditor/ProtoPaletteBase.py b/direct/src/leveleditor/ProtoPaletteBase.py index c9e50821a3..219abbbc48 100755 --- a/direct/src/leveleditor/ProtoPaletteBase.py +++ b/direct/src/leveleditor/ProtoPaletteBase.py @@ -3,7 +3,7 @@ Palette for Prototyping """ import imp -from .ObjectPaletteBase import * +from .ObjectPaletteBase import ObjectBase, ObjectPaletteBase class ProtoPaletteBase(ObjectPaletteBase): def __init__(self): diff --git a/direct/src/leveleditor/ProtoPaletteUI.py b/direct/src/leveleditor/ProtoPaletteUI.py index d07a6e4204..fb8fc1d3af 100755 --- a/direct/src/leveleditor/ProtoPaletteUI.py +++ b/direct/src/leveleditor/ProtoPaletteUI.py @@ -3,8 +3,9 @@ Defines ProtoPalette tree UI """ import wx import os -from panda3d.core import * -from .PaletteTreeCtrl import * +from panda3d.core import Filename +from .ObjectPaletteBase import ObjectBase +from .PaletteTreeCtrl import PaletteTreeCtrl class UniversalDropTarget(wx.DropTarget): diff --git a/direct/src/leveleditor/SceneGraphUI.py b/direct/src/leveleditor/SceneGraphUI.py index f3c99e617b..a13a6ad87c 100755 --- a/direct/src/leveleditor/SceneGraphUI.py +++ b/direct/src/leveleditor/SceneGraphUI.py @@ -1,7 +1,7 @@ """ Defines Scene Graph tree UI """ -from .SceneGraphUIBase import * +from .SceneGraphUIBase import SceneGraphUIBase class SceneGraphUI(SceneGraphUIBase): def __init__(self, parent, editor): diff --git a/direct/src/leveleditor/SceneGraphUIBase.py b/direct/src/leveleditor/SceneGraphUIBase.py index 0ca7e2f70c..258264fe69 100755 --- a/direct/src/leveleditor/SceneGraphUIBase.py +++ b/direct/src/leveleditor/SceneGraphUIBase.py @@ -2,8 +2,8 @@ Defines Scene Graph tree UI Base """ import wx -from panda3d.core import * -from .ActionMgr import * +from panda3d.core import NodePath +from .ActionMgr import ActionChangeHierarchy, ActionDeleteObjById from . import ObjectGlobals as OG diff --git a/direct/src/leveleditor/testData.py b/direct/src/leveleditor/testData.py index d35c01b103..994da998ab 100755 --- a/direct/src/leveleditor/testData.py +++ b/direct/src/leveleditor/testData.py @@ -1,4 +1,4 @@ -from panda3d.core import * +from panda3d.core import Point3, VBase3 if hasattr(base, 'le'): objectMgr = base.le.objectMgr diff --git a/direct/src/motiontrail/MotionTrail.py b/direct/src/motiontrail/MotionTrail.py index 24d63435b4..0c1ce26656 100644 --- a/direct/src/motiontrail/MotionTrail.py +++ b/direct/src/motiontrail/MotionTrail.py @@ -1,5 +1,22 @@ -from panda3d.core import * -from panda3d.direct import * +from panda3d.core import ( + BoundingVolume, + ColorBlendAttrib, + ColorWriteAttrib, + ConfigVariableBool, + Geom, + GeomNode, + GeomTriangles, + GeomVertexData, + GeomVertexFormat, + GeomVertexWriter, + Mat4, + NodePath, + NurbsCurveEvaluator, + Vec2, + Vec3, + Vec4, +) +from panda3d.direct import CMotionTrail from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from direct.showbase.DirectObject import DirectObject diff --git a/direct/src/particles/ForceGroup.py b/direct/src/particles/ForceGroup.py index 3623120783..9959bec76f 100644 --- a/direct/src/particles/ForceGroup.py +++ b/direct/src/particles/ForceGroup.py @@ -1,7 +1,19 @@ -from panda3d.core import * -from panda3d.physics import * +from panda3d.core import NodePath +from panda3d.physics import ( + AngularForce, + AngularVectorForce, + ForceNode, + LinearCylinderVortexForce, + LinearDistanceForce, + LinearForce, + LinearFrictionForce, + LinearJitterForce, + LinearNoiseForce, + LinearSinkForce, + LinearSourceForce, + LinearVectorForce, +) from direct.showbase.DirectObject import DirectObject -from direct.showbase.PhysicsManagerGlobal import * from direct.directnotify import DirectNotifyGlobal import sys diff --git a/direct/src/particles/ParticleEffect.py b/direct/src/particles/ParticleEffect.py index b6fafde27f..9918b57ff4 100644 --- a/direct/src/particles/ParticleEffect.py +++ b/direct/src/particles/ParticleEffect.py @@ -1,5 +1,5 @@ -from panda3d.core import * +from panda3d.core import Filename, NodePath, VirtualFileSystem, getModelPath # Leave these imports in, they may be used by ptf files. from panda3d.physics import * # pylint: disable=unused-import diff --git a/direct/src/particles/Particles.py b/direct/src/particles/Particles.py index f284fe86e5..48708cb472 100644 --- a/direct/src/particles/Particles.py +++ b/direct/src/particles/Particles.py @@ -4,7 +4,7 @@ See the :ref:`particle-effects` section in the manual for an explanation of the particle system. """ -from panda3d.core import * +from panda3d.core import ColorBlendAttrib, NodePath from panda3d.physics import PhysicalNode from panda3d.physics import ParticleSystem diff --git a/direct/src/physics/FallTest.py b/direct/src/physics/FallTest.py index f1e431aabe..5f47436e0f 100644 --- a/direct/src/physics/FallTest.py +++ b/direct/src/physics/FallTest.py @@ -1,5 +1,12 @@ from panda3d.core import NodePath -from panda3d.physics import * +from panda3d.physics import ( + ActorNode, + AngularEulerIntegrator, + ForceNode, + LinearEulerIntegrator, + LinearFrictionForce, + LinearVectorForce, +) class FallTest(NodePath): diff --git a/direct/src/physics/RotationTest.py b/direct/src/physics/RotationTest.py index aee5fe18cc..c3ff96b3c1 100644 --- a/direct/src/physics/RotationTest.py +++ b/direct/src/physics/RotationTest.py @@ -1,5 +1,13 @@ from panda3d.core import NodePath -from panda3d.physics import * +from panda3d.physics import ( + ActorNode, + AngularEulerIntegrator, + AngularVectorForce, + ForceNode, + LinearEulerIntegrator, + LinearFrictionForce, + LinearVectorForce, +) class RotationTest(NodePath): diff --git a/direct/src/showbase/BufferViewer.py b/direct/src/showbase/BufferViewer.py index f54edca7f9..373bd4da42 100644 --- a/direct/src/showbase/BufferViewer.py +++ b/direct/src/showbase/BufferViewer.py @@ -14,10 +14,29 @@ Or, you can enable the following variable in your Config.prc:: __all__ = ['BufferViewer'] -from panda3d.core import * +from panda3d.core import ( + CardMaker, + ConfigVariableBool, + ConfigVariableDouble, + ConfigVariableString, + Geom, + GeomNode, + GeomTriangles, + GeomVertexData, + GeomVertexFormat, + GeomVertexWriter, + GraphicsEngine, + GraphicsOutput, + NodePath, + Point3, + SamplerState, + Texture, + Vec3, + Vec3F, +) from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.DirectObject import DirectObject import math diff --git a/direct/src/showbase/DistancePhasedNode.py b/direct/src/showbase/DistancePhasedNode.py index 385f94ae70..3757cbd61f 100755 --- a/direct/src/showbase/DistancePhasedNode.py +++ b/direct/src/showbase/DistancePhasedNode.py @@ -1,6 +1,13 @@ from direct.showbase.DirectObject import DirectObject from direct.directnotify.DirectNotifyGlobal import directNotify -from panda3d.core import * +from panda3d.core import ( + BitMask32, + CollisionHandlerEvent, + CollisionNode, + CollisionSphere, + CollisionTraverser, + NodePath, +) from .PhasedObject import PhasedObject diff --git a/direct/src/showbase/EventManager.py b/direct/src/showbase/EventManager.py index 539c173e13..8a4e4230a5 100644 --- a/direct/src/showbase/EventManager.py +++ b/direct/src/showbase/EventManager.py @@ -4,8 +4,7 @@ global eventMgr instance.""" __all__ = ['EventManager'] -from .MessengerGlobal import * -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify from direct.task.TaskManagerGlobal import taskMgr from panda3d.core import PStatCollector, EventQueue, EventHandler from panda3d.core import ConfigVariableBool diff --git a/direct/src/showbase/ExceptionVarDump.py b/direct/src/showbase/ExceptionVarDump.py index 151ba35bcd..53d269f4ee 100755 --- a/direct/src/showbase/ExceptionVarDump.py +++ b/direct/src/showbase/ExceptionVarDump.py @@ -1,6 +1,6 @@ __all__ = ["install"] -from panda3d.core import * +from panda3d.core import ConfigVariableBool from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.PythonUtil import fastRepr, Stack import sys diff --git a/direct/src/showbase/LeakDetectors.py b/direct/src/showbase/LeakDetectors.py index ba93262158..8ac18ee415 100755 --- a/direct/src/showbase/LeakDetectors.py +++ b/direct/src/showbase/LeakDetectors.py @@ -2,7 +2,7 @@ ContainerLeakDetector. """ -from panda3d.core import * +from panda3d.core import ConfigVariableBool, MemoryUsage from direct.showbase.DirectObject import DirectObject from direct.showbase.PythonUtil import safeTypeName, typeName, uniqueName, serialNum from direct.showbase.Job import Job diff --git a/direct/src/showbase/Loader.py b/direct/src/showbase/Loader.py index b0a8594f08..272caa5f50 100644 --- a/direct/src/showbase/Loader.py +++ b/direct/src/showbase/Loader.py @@ -4,9 +4,25 @@ sound, music, shaders and fonts from disk. __all__ = ['Loader'] -from panda3d.core import * +from panda3d.core import ( + AudioLoadRequest, + ConfigVariableBool, + Filename, + FontPool, + LoaderFileTypeRegistry, + LoaderOptions, + ModelFlattenRequest, + ModelNode, + ModelPool, + NodePath, + PandaNode, + ShaderPool, + StaticTextFont, + TexturePool, + VBase4, +) from panda3d.core import Loader as PandaLoader -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify from direct.showbase.DirectObject import DirectObject import warnings diff --git a/direct/src/showbase/Messenger.py b/direct/src/showbase/Messenger.py index 359c09d82c..0740dec7da 100644 --- a/direct/src/showbase/Messenger.py +++ b/direct/src/showbase/Messenger.py @@ -6,7 +6,7 @@ __all__ = ['Messenger'] from direct.stdpy.threading import Lock from direct.directnotify import DirectNotifyGlobal -from .PythonUtil import * +from .PythonUtil import safeRepr import types diff --git a/direct/src/showbase/MirrorDemo.py b/direct/src/showbase/MirrorDemo.py index 732768c817..557fea8d8e 100755 --- a/direct/src/showbase/MirrorDemo.py +++ b/direct/src/showbase/MirrorDemo.py @@ -21,7 +21,19 @@ reflections, you will need to use a sphere map or a cube map.""" __all__ = ['setupMirror', 'showFrustum'] -from panda3d.core import * +from panda3d.core import ( + Camera, + CardMaker, + CullFaceAttrib, + GeomNode, + Lens, + NodePath, + PerspectiveLens, + Plane, + PlaneNode, + Point3, + Vec3, +) from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr diff --git a/direct/src/showbase/OnScreenDebug.py b/direct/src/showbase/OnScreenDebug.py index e5a1c7aedb..67b5cf2418 100755 --- a/direct/src/showbase/OnScreenDebug.py +++ b/direct/src/showbase/OnScreenDebug.py @@ -2,7 +2,13 @@ __all__ = ['OnScreenDebug'] -from panda3d.core import * +from panda3d.core import ( + ConfigVariableBool, + ConfigVariableDouble, + ConfigVariableString, + TextNode, + Vec4, +) from direct.gui import OnscreenText from direct.directtools import DirectUtil diff --git a/direct/src/showbase/PhasedObject.py b/direct/src/showbase/PhasedObject.py index bd3a2aad7d..3500199bc5 100755 --- a/direct/src/showbase/PhasedObject.py +++ b/direct/src/showbase/PhasedObject.py @@ -1,4 +1,4 @@ -from direct.directnotify.DirectNotifyGlobal import * +from direct.directnotify.DirectNotifyGlobal import directNotify class PhasedObject: diff --git a/direct/src/showbase/SfxPlayer.py b/direct/src/showbase/SfxPlayer.py index c543b5734b..c4edea0d5d 100644 --- a/direct/src/showbase/SfxPlayer.py +++ b/direct/src/showbase/SfxPlayer.py @@ -4,7 +4,7 @@ a particular location.""" __all__ = ['SfxPlayer'] import math -from panda3d.core import * +from panda3d.core import AudioSound class SfxPlayer: diff --git a/direct/src/showbase/ShadowDemo.py b/direct/src/showbase/ShadowDemo.py index 0fbe6a3c3c..b29706d854 100755 --- a/direct/src/showbase/ShadowDemo.py +++ b/direct/src/showbase/ShadowDemo.py @@ -11,7 +11,7 @@ way to do shadows. __all__ = ['ShadowCaster', 'avatarShadow', 'piratesAvatarShadow', 'arbitraryShadow'] -from panda3d.core import * +from panda3d.core import Camera, NodePath, OrthographicLens, Texture, TextureStage, VBase4 from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr diff --git a/direct/src/showbase/ShadowPlacer.py b/direct/src/showbase/ShadowPlacer.py index 845bb5e66e..82ffdb9277 100755 --- a/direct/src/showbase/ShadowPlacer.py +++ b/direct/src/showbase/ShadowPlacer.py @@ -10,7 +10,14 @@ __all__ = ['ShadowPlacer'] from direct.controls.ControlManager import CollisionHandlerRayStart from direct.directnotify import DirectNotifyGlobal -from panda3d.core import * +from panda3d.core import ( + BitMask32, + CollisionHandlerFloor, + CollisionNode, + CollisionRay, + CollisionTraverser, + NodePath, +) from . import DirectObject class ShadowPlacer(DirectObject.DirectObject): diff --git a/direct/src/showbase/ShowBase.py b/direct/src/showbase/ShowBase.py index 8c3555bf5f..5d12a0ab4c 100644 --- a/direct/src/showbase/ShowBase.py +++ b/direct/src/showbase/ShowBase.py @@ -39,7 +39,77 @@ __all__ = ['ShowBase', 'WindowControls'] # Annoying and very noisy, but sometimes useful #import VerboseImport -from panda3d.core import * +from panda3d.core import ( + AntialiasAttrib, + AudioManager, + AudioSound, + BitMask32, + ButtonThrower, + Camera, + ClockObject, + CollisionTraverser, + ColorBlendAttrib, + ConfigPageManager, + ConfigVariableBool, + ConfigVariableDouble, + ConfigVariableFilename, + ConfigVariableInt, + ConfigVariableManager, + ConfigVariableString, + DataGraphTraverser, + DepthTestAttrib, + DepthWriteAttrib, + DriveInterface, + ExecutionEnvironment, + Filename, + FisheyeMaker, + FrameBufferProperties, + FrameRateMeter, + GeomNode, + GraphicsEngine, + GraphicsOutput, + GraphicsPipe, + GraphicsPipeSelection, + GraphicsWindow, + InputDeviceManager, + InputDeviceNode, + KeyboardButton, + LensNode, + Mat4, + ModelNode, + ModifierButtons, + MouseAndKeyboard, + MouseRecorder, + MouseWatcher, + NodePath, + Notify, + OrthographicLens, + PandaNode, + PandaSystem, + PerspectiveLens, + PGMouseWatcherBackground, + PGTop, + PNMImage, + PStatClient, + PythonCallbackObject, + RecorderController, + RenderModeAttrib, + RenderState, + RescaleNormalAttrib, + SceneGraphAnalyzerMeter, + TexGenAttrib, + Texture, + TextureStage, + Thread, + Trackball, + Transform2SG, + TransformState, + TrueClock, + VBase4, + VirtualFileSystem, + WindowProperties, + getModelPath, +) from panda3d.direct import throw_new_frame, init_app_for_gui from panda3d.direct import storeAccessibilityShortcutKeys, allowAccessibilityShortcutKeys from . import DConfig diff --git a/direct/src/showbase/TkGlobal.py b/direct/src/showbase/TkGlobal.py index 072a9b65ab..2ba0be0788 100644 --- a/direct/src/showbase/TkGlobal.py +++ b/direct/src/showbase/TkGlobal.py @@ -2,7 +2,6 @@ import sys import Pmw -from tkinter import * # This is required by the ihooks.py module used by Squeeze (used by diff --git a/direct/src/showbase/Transitions.py b/direct/src/showbase/Transitions.py index 8eb2bd7012..d9fcc6cc07 100644 --- a/direct/src/showbase/Transitions.py +++ b/direct/src/showbase/Transitions.py @@ -4,7 +4,7 @@ a particular color.""" __all__ = ['Transitions'] -from panda3d.core import * +from panda3d.core import AsyncFuture, ConfigVariableBool, NodePath, TransparencyAttrib, Vec3, Vec4 from direct.showbase import ShowBaseGlobal from direct.showbase.MessengerGlobal import messenger from direct.gui.DirectGui import DirectFrame diff --git a/direct/src/showutil/BuildGeometry.py b/direct/src/showutil/BuildGeometry.py index b17b5d7d8e..ccf6979d46 100644 --- a/direct/src/showutil/BuildGeometry.py +++ b/direct/src/showutil/BuildGeometry.py @@ -1,5 +1,14 @@ -from panda3d.core import * -from math import * +from panda3d.core import ( + Geom, + GeomNode, + GeomTrifans, + GeomTristrips, + GeomVertexData, + GeomVertexFormat, + GeomVertexWriter, + Vec4, +) +from math import pi, cos, sin GEO_ID = 0 diff --git a/direct/src/showutil/Effects.py b/direct/src/showutil/Effects.py index 4ddf5d4b26..3cd4cd931b 100644 --- a/direct/src/showutil/Effects.py +++ b/direct/src/showutil/Effects.py @@ -1,7 +1,12 @@ """ Showutil Effects module: contains code for useful showcode effects. """ -from panda3d.core import * -from direct.interval.IntervalGlobal import * +from panda3d.core import Vec3 +from direct.interval.IntervalGlobal import ( + LerpHprInterval, + LerpPosInterval, + LerpScaleInterval, + Sequence, +) # bounce types SX_BOUNCE = 0 diff --git a/direct/src/showutil/Rope.py b/direct/src/showutil/Rope.py index 85541a0eef..c274310739 100644 --- a/direct/src/showutil/Rope.py +++ b/direct/src/showutil/Rope.py @@ -1,4 +1,12 @@ -from panda3d.core import * +from panda3d.core import ( + ConfigVariableBool, + NodePath, + NurbsCurveEvaluator, + Point3, + RopeNode, + VBase3, + VBase4, +) class Rope(NodePath): diff --git a/direct/src/showutil/TexMemWatcher.py b/direct/src/showutil/TexMemWatcher.py index 638101ead2..b054c78d3e 100644 --- a/direct/src/showutil/TexMemWatcher.py +++ b/direct/src/showutil/TexMemWatcher.py @@ -1,4 +1,26 @@ -from panda3d.core import * +from panda3d.core import ( + BitArray, + ButtonThrower, + Camera, + CardMaker, + ConfigVariableInt, + FrameBufferProperties, + GraphicsOutput, + GraphicsPipe, + LineSegs, + Mat4, + MouseAndKeyboard, + MouseWatcher, + MouseWatcherRegion, + NodePath, + OrthographicLens, + PNMImage, + TextNode, + Texture, + TextureStage, + TransparencyAttrib, + WindowProperties, +) from direct.showbase.DirectObject import DirectObject from direct.task.TaskManagerGlobal import taskMgr import math diff --git a/direct/src/showutil/TexViewer.py b/direct/src/showutil/TexViewer.py index c8bbd76b18..32b181b22a 100644 --- a/direct/src/showutil/TexViewer.py +++ b/direct/src/showutil/TexViewer.py @@ -1,4 +1,4 @@ -from panda3d.core import * +from panda3d.core import CardMaker, LineSegs, TextNode, Texture, TransparencyAttrib from direct.showbase.DirectObject import DirectObject from direct.showbase import ShowBaseGlobal diff --git a/direct/src/task/Task.py b/direct/src/task/Task.py index a6363e3644..c1847dbd6e 100644 --- a/direct/src/task/Task.py +++ b/direct/src/task/Task.py @@ -10,8 +10,8 @@ __all__ = ['Task', 'TaskManager', 'cont', 'done', 'again', 'pickup', 'exit', 'sequence', 'loop', 'pause'] -from direct.directnotify.DirectNotifyGlobal import * -from direct.showbase.PythonUtil import * +from direct.directnotify.DirectNotifyGlobal import directNotify +from direct.showbase.PythonUtil import Functor, ScratchPad from direct.showbase.MessengerGlobal import messenger import types import random @@ -28,7 +28,18 @@ else: except ImportError: signal = None -from panda3d.core import * +from panda3d.core import ( + AsyncTask, + AsyncTaskPause, + AsyncTaskManager, + AsyncTaskSequence, + ClockObject, + ConfigVariableBool, + GlobPattern, + PandaSystem, + PythonTask, + Thread, +) from direct.extensions_native import HTTPChannel_extensions diff --git a/direct/src/task/TaskTester.py b/direct/src/task/TaskTester.py index cbe8cd0bd7..81f20e9b6a 100755 --- a/direct/src/task/TaskTester.py +++ b/direct/src/task/TaskTester.py @@ -2,7 +2,7 @@ __all__ = [] -from direct.task.TaskManagerGlobal import * +from direct.task.TaskManagerGlobal import taskMgr from direct.task import Task import random diff --git a/direct/src/tkpanels/AnimPanel.py b/direct/src/tkpanels/AnimPanel.py index 93f221c2c3..6412673d10 100644 --- a/direct/src/tkpanels/AnimPanel.py +++ b/direct/src/tkpanels/AnimPanel.py @@ -6,14 +6,14 @@ __all__ = ['AnimPanel', 'ActorControl'] # Import Tkinter, Pmw, and the floater code from this directory tree. from panda3d.core import Filename, getModelPath, ClockObject -from direct.tkwidgets.AppShell import * -from direct.showbase.TkGlobal import * +from direct.tkwidgets.AppShell import AppShell from direct.task import Task from direct.task.TaskManagerGlobal import taskMgr from tkinter.simpledialog import askfloat from tkinter.filedialog import askopenfilename import Pmw import os +import tkinter as tk FRAMES = 0 @@ -101,84 +101,84 @@ class AnimPanel(AppShell): self.fToggleAll = 1 b = self.createcomponent( 'toggleEnableButton', (), None, - Button, (self.menuFrame,), + tk.Button, (self.menuFrame,), text = 'Toggle Enable', command = self.toggleAllControls) - b.pack(side = RIGHT, expand = 0) + b.pack(side = tk.RIGHT, expand = 0) b = self.createcomponent( 'showSecondsButton', (), None, - Button, (self.menuFrame,), + tk.Button, (self.menuFrame,), text = 'Show Seconds', command = self.displaySeconds) - b.pack(side = RIGHT, expand = 0) + b.pack(side = tk.RIGHT, expand = 0) b = self.createcomponent( 'showFramesButton', (), None, - Button, (self.menuFrame,), + tk.Button, (self.menuFrame,), text = 'Show Frames', command = self.displayFrameCounts) - b.pack(side = RIGHT, expand = 0) + b.pack(side = tk.RIGHT, expand = 0) self.actorFrame = None self.createActorControls() # Create a frame to hold the playback controls - controlFrame = Frame(interior) + controlFrame = tk.Frame(interior) self.toStartButton = self.createcomponent( 'toStart', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = '<<', width = 4, command = self.resetAllToZero) - self.toStartButton.pack(side = LEFT, expand = 1, fill = X) + self.toStartButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.toPreviousFrameButton = self.createcomponent( 'toPreviousFrame', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = '<', width = 4, command = self.previousFrame) - self.toPreviousFrameButton.pack(side = LEFT, expand = 1, fill = X) + self.toPreviousFrameButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.playButton = self.createcomponent( 'playButton', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = 'Play', width = 8, command = self.playActorControls) - self.playButton.pack(side = LEFT, expand = 1, fill = X) + self.playButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.stopButton = self.createcomponent( 'stopButton', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = 'Stop', width = 8, command = self.stopActorControls) - self.stopButton.pack(side = LEFT, expand = 1, fill = X) + self.stopButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.toNextFrameButton = self.createcomponent( 'toNextFrame', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = '>', width = 4, command = self.nextFrame) - self.toNextFrameButton.pack(side = LEFT, expand = 1, fill = X) + self.toNextFrameButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.toEndButton = self.createcomponent( 'toEnd', (), None, - Button, (controlFrame,), + tk.Button, (controlFrame,), text = '>>', width = 4, command = self.resetAllToEnd) - self.toEndButton.pack(side = LEFT, expand = 1, fill = X) + self.toEndButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) - self.loopVar = IntVar() + self.loopVar = tk.IntVar() self.loopVar.set(0) self.loopButton = self.createcomponent( 'loopButton', (), None, - Checkbutton, (controlFrame,), + tk.Checkbutton, (controlFrame,), text = 'Loop', width = 8, variable = self.loopVar) - self.loopButton.pack(side = LEFT, expand = 1, fill = X) + self.loopButton.pack(side = tk.LEFT, expand = 1, fill = tk.X) # add actors and animations, only allowed if a direct # session has been specified since these currently require @@ -193,11 +193,11 @@ class AnimPanel(AppShell): label = 'Load Anim', command = self.loadAnim) - controlFrame.pack(fill = X) + controlFrame.pack(fill = tk.X) def createActorControls(self): # Create a frame to hold all the actor controls - self.actorFrame = Frame(self.interior()) + self.actorFrame = tk.Frame(self.interior()) # Create a control for each actor self.actorControlList = [] for actor in self['actorList']: @@ -234,12 +234,12 @@ class AnimPanel(AppShell): text = actor.getName(), animList = anims, actor = actor) - ac.pack(expand = 1, fill = X) + ac.pack(expand = 1, fill = tk.X) self.actorControlList.append(ac) self.actorControlIndex = self.actorControlIndex + 1 # Now pack the actor frame - self.actorFrame.pack(expand = 1, fill = BOTH) + self.actorFrame.pack(expand = 1, fill = tk.BOTH) def clearActorControls(self): if self.actorFrame: @@ -399,7 +399,7 @@ class ActorControl(Pmw.MegaWidget): # Handle to the toplevels hull interior = self.interior() - interior.configure(relief = RAISED, bd = 2) + interior.configure(relief = tk.RAISED, bd = 2) # Instance variables self.fps = 24 @@ -412,18 +412,18 @@ class ActorControl(Pmw.MegaWidget): # Create component widgets self._label = self.createcomponent( 'label', (), None, - Menubutton, (interior,), + tk.Menubutton, (interior,), font=('MSSansSerif', 14, 'bold'), - relief = RAISED, bd = 1, + relief = tk.RAISED, bd = 1, activebackground = '#909090', text = self['text']) # Top level menu - labelMenu = Menu(self._label, tearoff = 0) + labelMenu = tk.Menu(self._label, tearoff = 0) # Menu to select display mode - self.unitsVar = IntVar() + self.unitsVar = tk.IntVar() self.unitsVar.set(FRAMES) - displayMenu = Menu(labelMenu, tearoff = 0) + displayMenu = tk.Menu(labelMenu, tearoff = 0) displayMenu.add_radiobutton(label = 'Frame count', value = FRAMES, variable = self.unitsVar, @@ -442,13 +442,13 @@ class ActorControl(Pmw.MegaWidget): # Now associate menu with menubutton self._label['menu'] = labelMenu - self._label.pack(side = LEFT, fill = X) + self._label.pack(side = tk.LEFT, fill = tk.X) # Combo box to select current animation self.animMenu = self.createcomponent( 'animMenu', (), None, Pmw.ComboBox, (interior,), - labelpos = W, label_text = 'Anim:', + labelpos = tk.W, label_text = 'Anim:', entry_width = 12, selectioncommand = self.selectAnimNamed, scrolledlist_items = self['animList']) self.animMenu.selectitem(self['active']) @@ -465,45 +465,45 @@ class ActorControl(Pmw.MegaWidget): playRateMenu = self.createcomponent( 'playRateMenu', (), None, Pmw.ComboBox, (interior,), - labelpos = W, label_text = 'Play Rate:', + labelpos = tk.W, label_text = 'Play Rate:', entry_width = 4, selectioncommand = self.setPlayRate, scrolledlist_items = playRateList) playRateMenu.selectitem(playRate) - playRateMenu.pack(side = LEFT, padx = 5, expand = 0) + playRateMenu.pack(side = tk.LEFT, padx = 5, expand = 0) # Scale to control animation - frameFrame = Frame(interior, relief = SUNKEN, bd = 1) + frameFrame = tk.Frame(interior, relief = tk.SUNKEN, bd = 1) self.minLabel = self.createcomponent( 'minLabel', (), 'sLabel', - Label, (frameFrame,), + tk.Label, (frameFrame,), text = 0) - self.minLabel.pack(side = LEFT) + self.minLabel.pack(side = tk.LEFT) self.frameControl = self.createcomponent( 'scale', (), None, - Scale, (frameFrame,), + tk.Scale, (frameFrame,), from_ = 0, to = 24, resolution = 1.0, command = self.goTo, - orient = HORIZONTAL, showvalue = 1) - self.frameControl.pack(side = LEFT, expand = 1) + orient = tk.HORIZONTAL, showvalue = 1) + self.frameControl.pack(side = tk.LEFT, expand = 1) self.frameControl.bind('', self.__onPress) self.frameControl.bind('', self.__onRelease) self.maxLabel = self.createcomponent( 'maxLabel', (), 'sLabel', - Label, (frameFrame,), + tk.Label, (frameFrame,), text = 24) - self.maxLabel.pack(side = LEFT) - frameFrame.pack(side = LEFT, expand = 1, fill = X) + self.maxLabel.pack(side = tk.LEFT) + frameFrame.pack(side = tk.LEFT, expand = 1, fill = tk.X) # Checkbutton to enable/disable control - self.frameActiveVar = IntVar() + self.frameActiveVar = tk.IntVar() self.frameActiveVar.set(1) frameActive = self.createcomponent( 'checkbutton', (), None, - Checkbutton, (interior,), + tk.Checkbutton, (interior,), variable = self.frameActiveVar) - frameActive.pack(side = LEFT, expand = 1) + frameActive.pack(side = tk.LEFT, expand = 1) # Execute option callbacks self.initialiseoptions(ActorControl) diff --git a/direct/src/tkpanels/DirectSessionPanel.py b/direct/src/tkpanels/DirectSessionPanel.py index 4f2865d441..7a74d8ab1a 100644 --- a/direct/src/tkpanels/DirectSessionPanel.py +++ b/direct/src/tkpanels/DirectSessionPanel.py @@ -3,9 +3,16 @@ __all__ = ['DirectSessionPanel'] # Import Tkinter, Pmw, and the dial code -from panda3d.core import * -from direct.showbase.TkGlobal import * -from direct.tkwidgets.AppShell import * +from panda3d.core import ( + AmbientLight, + DirectionalLight, + LightAttrib, + NodePath, + PointLight, + Spotlight, + Vec4, +) +from direct.tkwidgets.AppShell import AppShell from direct.tkwidgets import Dial from direct.tkwidgets import Floater from direct.tkwidgets import Slider @@ -14,6 +21,7 @@ from direct.tkwidgets import SceneGraphExplorer from direct.tkwidgets import MemoryExplorer from .TaskManagerPanel import TaskManagerWidget import Pmw +import tkinter as tk class DirectSessionPanel(AppShell): @@ -83,7 +91,7 @@ class DirectSessionPanel(AppShell): # Add placer commands to menubar self.menuBar.addmenu('DIRECT', 'Direct Session Panel Operations') - self.directEnabled = BooleanVar() + self.directEnabled = tk.BooleanVar() self.directEnabled.set(1) self.menuBar.addmenuitem('DIRECT', 'checkbutton', 'DIRECT Enabled', @@ -91,7 +99,7 @@ class DirectSessionPanel(AppShell): variable = self.directEnabled, command = self.toggleDirect) - self.directGridEnabled = BooleanVar() + self.directGridEnabled = tk.BooleanVar() self.directGridEnabled.set(base.direct.grid.isEnabled()) self.menuBar.addmenuitem('DIRECT', 'checkbutton', 'DIRECT Grid Enabled', @@ -110,7 +118,7 @@ class DirectSessionPanel(AppShell): label = 'Toggle Widget Mode', command = base.direct.manipulationControl.toggleObjectHandlesMode) - self.directWidgetOnTop = BooleanVar() + self.directWidgetOnTop = tk.BooleanVar() self.directWidgetOnTop.set(0) self.menuBar.addmenuitem('DIRECT', 'checkbutton', 'DIRECT Widget On Top', @@ -128,7 +136,7 @@ class DirectSessionPanel(AppShell): # Widget to select node paths (and display list of selected node paths) self.nodePathMenu = Pmw.ComboBox( - menuFrame, labelpos = W, label_text = 'DIRECT Select:', + menuFrame, labelpos = tk.W, label_text = 'DIRECT Select:', entry_width = 20, selectioncommand = self.selectNodePathNamed, scrolledlist_items = self.nodePathNames) @@ -137,32 +145,32 @@ class DirectSessionPanel(AppShell): self.nodePathMenu.component('entryfield_entry')) self.nodePathMenuBG = ( self.nodePathMenuEntry.configure('background')[3]) - self.nodePathMenu.pack(side = LEFT, fill = X, expand = 1) + self.nodePathMenu.pack(side = tk.LEFT, fill = tk.X, expand = 1) self.bind(self.nodePathMenu, 'Select node path to manipulate') - self.undoButton = Button(menuFrame, text = 'Undo', - command = base.direct.undo) + self.undoButton = tk.Button(menuFrame, text = 'Undo', + command = base.direct.undo) if base.direct.undoList: self.undoButton['state'] = 'normal' else: self.undoButton['state'] = 'disabled' - self.undoButton.pack(side = LEFT, expand = 0) + self.undoButton.pack(side = tk.LEFT, expand = 0) self.bind(self.undoButton, 'Undo last operation') - self.redoButton = Button(menuFrame, text = 'Redo', - command = base.direct.redo) + self.redoButton = tk.Button(menuFrame, text = 'Redo', + command = base.direct.redo) if base.direct.redoList: self.redoButton['state'] = 'normal' else: self.redoButton['state'] = 'disabled' - self.redoButton.pack(side = LEFT, expand = 0) + self.redoButton.pack(side = tk.LEFT, expand = 0) self.bind(self.redoButton, 'Redo last operation') # The master frame for the dials - mainFrame = Frame(interior) + mainFrame = tk.Frame(interior) # Paned widget for dividing two halves - framePane = Pmw.PanedWidget(mainFrame, orient = HORIZONTAL) + framePane = Pmw.PanedWidget(mainFrame, orient = tk.HORIZONTAL) sgeFrame = framePane.add('left', min = 250) notebookFrame = framePane.add('right', min = 300) @@ -171,12 +179,12 @@ class DirectSessionPanel(AppShell): sgeFrame, nodePath = render, scrolledCanvas_hull_width = 250, scrolledCanvas_hull_height = 300) - self.SGE.pack(fill = BOTH, expand = 1) - sgeFrame.pack(side = LEFT, fill = 'both', expand = 1) + self.SGE.pack(fill = tk.BOTH, expand = 1) + sgeFrame.pack(side = tk.LEFT, fill = 'both', expand = 1) # Create the notebook pages notebook = Pmw.NoteBook(notebookFrame) - notebook.pack(fill = BOTH, expand = 1) + notebook.pack(fill = tk.BOTH, expand = 1) self.createEnvPage(notebook.add('Environment')) self.createLightsPage(notebook.add('Lights')) self.createGridPage(notebook.add('Grid')) @@ -186,36 +194,36 @@ class DirectSessionPanel(AppShell): notebook.setnaturalsize() - framePane.pack(expand = 1, fill = BOTH) + framePane.pack(expand = 1, fill = tk.BOTH) mainFrame.pack(fill = 'both', expand = 1) # Put this here so it isn't called right away notebook['raisecommand'] = self.updateInfo def createEnvPage(self, envPage): - bkgrdFrame = Frame(envPage, borderwidth = 2, relief = 'sunken') + bkgrdFrame = tk.Frame(envPage, borderwidth = 2, relief = 'sunken') - Label(bkgrdFrame, text = 'Background', - font=('MSSansSerif', 14, 'bold')).pack(expand = 0) + tk.Label(bkgrdFrame, text = 'Background', + font=('MSSansSerif', 14, 'bold')).pack(expand = 0) self.backgroundColor = VectorWidgets.ColorEntry( bkgrdFrame, text = 'Background Color') self.backgroundColor['command'] = self.setBackgroundColorVec - self.backgroundColor.pack(fill = X, expand = 0) + self.backgroundColor.pack(fill = tk.X, expand = 0) self.bind(self.backgroundColor, 'Set background color') - bkgrdFrame.pack(fill = BOTH, expand = 0) + bkgrdFrame.pack(fill = tk.BOTH, expand = 0) - drFrame = Frame(envPage, borderwidth = 2, relief = 'sunken') - Label(drFrame, text = 'Display Region', - font=('MSSansSerif', 14, 'bold')).pack(expand = 0) + drFrame = tk.Frame(envPage, borderwidth = 2, relief = 'sunken') + tk.Label(drFrame, text = 'Display Region', + font=('MSSansSerif', 14, 'bold')).pack(expand = 0) nameList = ['Display Region ' + repr(x) for x in range(len(base.direct.drList))] self.drMenu = Pmw.ComboBox( - drFrame, labelpos = W, label_text = 'Display Region:', + drFrame, labelpos = tk.W, label_text = 'Display Region:', entry_width = 20, selectioncommand = self.selectDisplayRegionNamed, scrolledlist_items = nameList) - self.drMenu.pack(fill = X, expand = 0) + self.drMenu.pack(fill = tk.X, expand = 0) self.bind(self.drMenu, 'Select display region to configure') self.nearPlane = Floater.Floater( @@ -223,7 +231,7 @@ class DirectSessionPanel(AppShell): text = 'Near Plane', min = 0.01) self.nearPlane['command'] = self.setNear - self.nearPlane.pack(fill = X, expand = 0) + self.nearPlane.pack(fill = tk.X, expand = 0) self.bind(self.nearPlane, 'Set near plane distance') self.farPlane = Floater.Floater( @@ -231,17 +239,17 @@ class DirectSessionPanel(AppShell): text = 'Far Plane', min = 0.01) self.farPlane['command'] = self.setFar - self.farPlane.pack(fill = X, expand = 0) + self.farPlane.pack(fill = tk.X, expand = 0) self.bind(self.farPlane, 'Set far plane distance') - fovFrame = Frame(drFrame) - fovFloaterFrame = Frame(fovFrame) + fovFrame = tk.Frame(drFrame) + fovFloaterFrame = tk.Frame(fovFrame) self.hFov = Slider.Slider( fovFloaterFrame, text = 'Horizontal FOV', min = 0.01, max = 170.0) self.hFov['command'] = self.setHFov - self.hFov.pack(fill = X, expand = 0) + self.hFov.pack(fill = tk.X, expand = 0) self.bind(self.hFov, 'Set horizontal field of view') self.vFov = Slider.Slider( @@ -249,66 +257,66 @@ class DirectSessionPanel(AppShell): text = 'Vertical FOV', min = 0.01, max = 170.0) self.vFov['command'] = self.setVFov - self.vFov.pack(fill = X, expand = 0) + self.vFov.pack(fill = tk.X, expand = 0) self.bind(self.vFov, 'Set vertical field of view') - fovFloaterFrame.pack(side = LEFT, fill = X, expand = 1) + fovFloaterFrame.pack(side = tk.LEFT, fill = tk.X, expand = 1) - frame = Frame(fovFrame) - self.lockedFov = BooleanVar() + frame = tk.Frame(fovFrame) + self.lockedFov = tk.BooleanVar() self.lockedFov.set(1) - self.lockedFovButton = Checkbutton( + self.lockedFovButton = tk.Checkbutton( frame, text = 'Locked', - anchor = 'w', justify = LEFT, + anchor = 'w', justify = tk.LEFT, variable = self.lockedFov) - self.lockedFovButton.pack(fill = X, expand = 0) + self.lockedFovButton.pack(fill = tk.X, expand = 0) - self.resetFovButton = Button( + self.resetFovButton = tk.Button( frame, text = 'Reset', command = self.resetFov) - self.resetFovButton.pack(fill = X, expand = 0) - frame.pack(side = LEFT, fill = X, expand = 0) - fovFrame.pack(fill = X, expand = 1) + self.resetFovButton.pack(fill = tk.X, expand = 0) + frame.pack(side = tk.LEFT, fill = tk.X, expand = 0) + fovFrame.pack(fill = tk.X, expand = 1) - drFrame.pack(fill = BOTH, expand = 0) + drFrame.pack(fill = tk.BOTH, expand = 0) ## Render Style ## - toggleFrame = Frame(envPage, borderwidth = 2, relief = 'sunken') - Label(toggleFrame, text = 'Toggle Render Style', - font=('MSSansSerif', 14, 'bold')).pack(expand = 0) - self.toggleBackfaceButton = Button( + toggleFrame = tk.Frame(envPage, borderwidth = 2, relief = 'sunken') + tk.Label(toggleFrame, text = 'Toggle Render Style', + font=('MSSansSerif', 14, 'bold')).pack(expand = 0) + self.toggleBackfaceButton = tk.Button( toggleFrame, text = 'Backface', command = base.toggleBackface) - self.toggleBackfaceButton.pack(side = LEFT, fill = X, expand = 1) + self.toggleBackfaceButton.pack(side = tk.LEFT, fill = tk.X, expand = 1) - self.toggleLightsButton = Button( + self.toggleLightsButton = tk.Button( toggleFrame, text = 'Lights', command = base.direct.lights.toggle) - self.toggleLightsButton.pack(side = LEFT, fill = X, expand = 1) + self.toggleLightsButton.pack(side = tk.LEFT, fill = tk.X, expand = 1) - self.toggleTextureButton = Button( + self.toggleTextureButton = tk.Button( toggleFrame, text = 'Texture', command = base.toggleTexture) - self.toggleTextureButton.pack(side = LEFT, fill = X, expand = 1) + self.toggleTextureButton.pack(side = tk.LEFT, fill = tk.X, expand = 1) - self.toggleWireframeButton = Button( + self.toggleWireframeButton = tk.Button( toggleFrame, text = 'Wireframe', command = base.toggleWireframe) - self.toggleWireframeButton.pack(fill = X, expand = 1) - toggleFrame.pack(side = LEFT, fill = X, expand = 1) + self.toggleWireframeButton.pack(fill = tk.X, expand = 1) + toggleFrame.pack(side = tk.LEFT, fill = tk.X, expand = 1) def createLightsPage(self, lightsPage): # Lights # - lightFrame = Frame(lightsPage, borderwidth = 2, relief = 'sunken') - self.lightsButton = Menubutton(lightFrame, text = 'Lights', - font=('MSSansSerif', 14, 'bold'), - activebackground = '#909090') - lightsMenu = Menu(self.lightsButton) + lightFrame = tk.Frame(lightsPage, borderwidth = 2, relief = 'sunken') + self.lightsButton = tk.Menubutton(lightFrame, text = 'Lights', + font=('MSSansSerif', 14, 'bold'), + activebackground = '#909090') + lightsMenu = tk.Menu(self.lightsButton) lightsMenu.add_command(label = 'Add Ambient Light', command = self.addAmbient) lightsMenu.add_command(label = 'Add Directional Light', @@ -332,52 +340,52 @@ class DirectSessionPanel(AppShell): self.lightNotebook['raisecommand'] = self.updateLightInfo # Main light switch - mainSwitchFrame = Frame(lightFrame) - Label(mainSwitchFrame, - text = 'Lighting:').pack(side = LEFT, expand = 0) - self.enableLights = BooleanVar() - self.enableLightsButton = Checkbutton( + mainSwitchFrame = tk.Frame(lightFrame) + tk.Label(mainSwitchFrame, + text = 'Lighting:').pack(side = tk.LEFT, expand = 0) + self.enableLights = tk.BooleanVar() + self.enableLightsButton = tk.Checkbutton( mainSwitchFrame, text = 'Enabled/Disabled', variable = self.enableLights, command = self.toggleLights) - self.enableLightsButton.pack(side = LEFT, fill = X, expand = 0) - mainSwitchFrame.pack(fill = X, expand = 0) + self.enableLightsButton.pack(side = tk.LEFT, fill = tk.X, expand = 0) + mainSwitchFrame.pack(fill = tk.X, expand = 0) # Widget to select a light to configure nameList = base.direct.lights.getNameList() - lightMenuFrame = Frame(lightFrame) + lightMenuFrame = tk.Frame(lightFrame) self.lightMenu = Pmw.ComboBox( - lightMenuFrame, labelpos = W, label_text = 'Light:', + lightMenuFrame, labelpos = tk.W, label_text = 'Light:', entry_width = 20, selectioncommand = self.selectLightNamed, scrolledlist_items = nameList) - self.lightMenu.pack(side = LEFT, fill = X, expand = 0) + self.lightMenu.pack(side = tk.LEFT, fill = tk.X, expand = 0) self.bind(self.lightMenu, 'Select light to configure') - self.lightActive = BooleanVar() - self.lightActiveButton = Checkbutton( + self.lightActive = tk.BooleanVar() + self.lightActiveButton = tk.Checkbutton( lightMenuFrame, text = 'On/Off', variable = self.lightActive, command = self.toggleActiveLight) - self.lightActiveButton.pack(side = LEFT, fill = X, expand = 0) + self.lightActiveButton.pack(side = tk.LEFT, fill = tk.X, expand = 0) # Pack light menu - lightMenuFrame.pack(fill = X, expand = 0, padx = 2) + lightMenuFrame.pack(fill = tk.X, expand = 0, padx = 2) self.lightColor = VectorWidgets.ColorEntry( lightFrame, text = 'Light Color') self.lightColor['command'] = self.setLightColor - self.lightColor.pack(fill = X, expand = 0, padx = 4) + self.lightColor.pack(fill = tk.X, expand = 0, padx = 4) self.bind(self.lightColor, 'Set active light color') # Directional light controls self.dSpecularColor = VectorWidgets.ColorEntry( directionalPage, text = 'Specular Color') self.dSpecularColor['command'] = self.setSpecularColor - self.dSpecularColor.pack(fill = X, expand = 0) + self.dSpecularColor.pack(fill = tk.X, expand = 0) self.bind(self.dSpecularColor, 'Set directional light specular color') @@ -385,7 +393,7 @@ class DirectSessionPanel(AppShell): self.pSpecularColor = VectorWidgets.ColorEntry( pointPage, text = 'Specular Color') self.pSpecularColor['command'] = self.setSpecularColor - self.pSpecularColor.pack(fill = X, expand = 0) + self.pSpecularColor.pack(fill = tk.X, expand = 0) self.bind(self.pSpecularColor, 'Set point light specular color') @@ -394,7 +402,7 @@ class DirectSessionPanel(AppShell): text = 'Constant Attenuation', min = 0.0, max = 1.0, value = 1.0) self.pConstantAttenuation['command'] = self.setConstantAttenuation - self.pConstantAttenuation.pack(fill = X, expand = 0) + self.pConstantAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.pConstantAttenuation, 'Set point light constant attenuation') @@ -403,7 +411,7 @@ class DirectSessionPanel(AppShell): text = 'Linear Attenuation', min = 0.0, max = 1.0, value = 0.0) self.pLinearAttenuation['command'] = self.setLinearAttenuation - self.pLinearAttenuation.pack(fill = X, expand = 0) + self.pLinearAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.pLinearAttenuation, 'Set point light linear attenuation') @@ -412,7 +420,7 @@ class DirectSessionPanel(AppShell): text = 'Quadratic Attenuation', min = 0.0, max = 1.0, value = 0.0) self.pQuadraticAttenuation['command'] = self.setQuadraticAttenuation - self.pQuadraticAttenuation.pack(fill = X, expand = 0) + self.pQuadraticAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.pQuadraticAttenuation, 'Set point light quadratic attenuation') @@ -420,7 +428,7 @@ class DirectSessionPanel(AppShell): self.sSpecularColor = VectorWidgets.ColorEntry( spotPage, text = 'Specular Color') self.sSpecularColor['command'] = self.setSpecularColor - self.sSpecularColor.pack(fill = X, expand = 0) + self.sSpecularColor.pack(fill = tk.X, expand = 0) self.bind(self.sSpecularColor, 'Set spot light specular color') @@ -429,7 +437,7 @@ class DirectSessionPanel(AppShell): text = 'Constant Attenuation', min = 0.0, max = 1.0, value = 1.0) self.sConstantAttenuation['command'] = self.setConstantAttenuation - self.sConstantAttenuation.pack(fill = X, expand = 0) + self.sConstantAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.sConstantAttenuation, 'Set spot light constant attenuation') @@ -438,7 +446,7 @@ class DirectSessionPanel(AppShell): text = 'Linear Attenuation', min = 0.0, max = 1.0, value = 0.0) self.sLinearAttenuation['command'] = self.setLinearAttenuation - self.sLinearAttenuation.pack(fill = X, expand = 0) + self.sLinearAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.sLinearAttenuation, 'Set spot light linear attenuation') @@ -447,7 +455,7 @@ class DirectSessionPanel(AppShell): text = 'Quadratic Attenuation', min = 0.0, max = 1.0, value = 0.0) self.sQuadraticAttenuation['command'] = self.setQuadraticAttenuation - self.sQuadraticAttenuation.pack(fill = X, expand = 0) + self.sQuadraticAttenuation.pack(fill = tk.X, expand = 0) self.bind(self.sQuadraticAttenuation, 'Set spot light quadratic attenuation') @@ -456,47 +464,47 @@ class DirectSessionPanel(AppShell): text = 'Exponent', min = 0.0, max = 1.0, value = 0.0) self.sExponent['command'] = self.setExponent - self.sExponent.pack(fill = X, expand = 0) + self.sExponent.pack(fill = tk.X, expand = 0) self.bind(self.sExponent, 'Set spot light exponent') # MRM: Add frustum controls self.lightNotebook.setnaturalsize() - self.lightNotebook.pack(expand = 1, fill = BOTH) + self.lightNotebook.pack(expand = 1, fill = tk.BOTH) - lightFrame.pack(expand = 1, fill = BOTH) + lightFrame.pack(expand = 1, fill = tk.BOTH) def createGridPage(self, gridPage): - Label(gridPage, text = 'Grid', + tk.Label(gridPage, text = 'Grid', font=('MSSansSerif', 14, 'bold')).pack(expand = 0) - self.enableGrid = BooleanVar() - self.enableGridButton = Checkbutton( + self.enableGrid = tk.BooleanVar() + self.enableGridButton = tk.Checkbutton( gridPage, text = 'Enabled/Disabled', - anchor = 'w', justify = LEFT, + anchor = 'w', justify = tk.LEFT, variable = self.enableGrid, command = self.toggleGrid) - self.enableGridButton.pack(fill = X, expand = 0) + self.enableGridButton.pack(fill = tk.X, expand = 0) - self.xyzSnap = BooleanVar() - self.xyzSnapButton = Checkbutton( + self.xyzSnap = tk.BooleanVar() + self.xyzSnapButton = tk.Checkbutton( gridPage, text = 'XYZ Snap', - anchor = 'w', justify = LEFT, + anchor = 'w', justify = tk.LEFT, variable = self.xyzSnap, command = self.toggleXyzSnap) - self.xyzSnapButton.pack(fill = X, expand = 0) + self.xyzSnapButton.pack(fill = tk.X, expand = 0) - self.hprSnap = BooleanVar() - self.hprSnapButton = Checkbutton( + self.hprSnap = tk.BooleanVar() + self.hprSnapButton = tk.Checkbutton( gridPage, text = 'HPR Snap', - anchor = 'w', justify = LEFT, + anchor = 'w', justify = tk.LEFT, variable = self.hprSnap, command = self.toggleHprSnap) - self.hprSnapButton.pack(fill = X, expand = 0) + self.hprSnapButton.pack(fill = tk.X, expand = 0) self.gridSpacing = Floater.Floater( gridPage, @@ -504,7 +512,7 @@ class DirectSessionPanel(AppShell): min = 0.1, value = base.direct.grid.getGridSpacing()) self.gridSpacing['command'] = base.direct.grid.setGridSpacing - self.gridSpacing.pack(fill = X, expand = 0) + self.gridSpacing.pack(fill = tk.X, expand = 0) self.gridSize = Floater.Floater( gridPage, @@ -512,7 +520,7 @@ class DirectSessionPanel(AppShell): min = 1.0, value = base.direct.grid.getGridSize()) self.gridSize['command'] = base.direct.grid.setGridSize - self.gridSize.pack(fill = X, expand = 0) + self.gridSize.pack(fill = tk.X, expand = 0) self.gridSnapAngle = Dial.AngleDial( gridPage, @@ -520,29 +528,29 @@ class DirectSessionPanel(AppShell): style = 'mini', value = base.direct.grid.getSnapAngle()) self.gridSnapAngle['command'] = base.direct.grid.setSnapAngle - self.gridSnapAngle.pack(fill = X, expand = 0) + self.gridSnapAngle.pack(fill = tk.X, expand = 0) def createDevicePage(self, devicePage): - Label(devicePage, text = 'DEVICES', + tk.Label(devicePage, text = 'DEVICES', font=('MSSansSerif', 14, 'bold')).pack(expand = 0) if base.direct.joybox is not None: - joyboxFrame = Frame(devicePage, borderwidth = 2, relief = 'sunken') - Label(joyboxFrame, text = 'Joybox', - font=('MSSansSerif', 14, 'bold')).pack(expand = 0) - self.enableJoybox = BooleanVar() + joyboxFrame = tk.Frame(devicePage, borderwidth = 2, relief = 'sunken') + tk.Label(joyboxFrame, text = 'Joybox', + font=('MSSansSerif', 14, 'bold')).pack(expand = 0) + self.enableJoybox = tk.BooleanVar() self.enableJoybox.set(1) - self.enableJoyboxButton = Checkbutton( + self.enableJoyboxButton = tk.Checkbutton( joyboxFrame, text = 'Enabled/Disabled', - anchor = 'w', justify = LEFT, + anchor = 'w', justify = tk.LEFT, variable = self.enableJoybox, command = self.toggleJoybox) - self.enableJoyboxButton.pack(fill = X, expand = 0) - joyboxFrame.pack(fill = X, expand = 0) + self.enableJoyboxButton.pack(fill = tk.X, expand = 0) + joyboxFrame.pack(fill = tk.X, expand = 0) self.jbModeMenu = Pmw.ComboBox( - joyboxFrame, labelpos = W, label_text = 'Joybox Mode:', + joyboxFrame, labelpos = tk.W, label_text = 'Joybox Mode:', label_width = 16, entry_width = 20, selectioncommand = self.selectJBModeNamed, scrolledlist_items = ['Joe Mode', 'Drive Mode', 'Orbit Mode', @@ -550,10 +558,10 @@ class DirectSessionPanel(AppShell): 'Walkthru Mode', 'Demo Mode', 'HPRXYZ Mode']) self.jbModeMenu.selectitem('Joe Mode') - self.jbModeMenu.pack(fill = X, expand = 1) + self.jbModeMenu.pack(fill = tk.X, expand = 1) self.jbNodePathMenu = Pmw.ComboBox( - joyboxFrame, labelpos = W, label_text = 'Joybox Node Path:', + joyboxFrame, labelpos = tk.W, label_text = 'Joybox Node Path:', label_width = 16, entry_width = 20, selectioncommand = self.selectJBNodePathNamed, scrolledlist_items = self.jbNodePathNames) @@ -562,7 +570,7 @@ class DirectSessionPanel(AppShell): self.jbNodePathMenu.component('entryfield_entry')) self.jbNodePathMenuBG = ( self.jbNodePathMenuEntry.configure('background')[3]) - self.jbNodePathMenu.pack(fill = X, expand = 1) + self.jbNodePathMenu.pack(fill = tk.X, expand = 1) self.bind(self.jbNodePathMenu, 'Select node path to manipulate using the joybox') @@ -570,26 +578,26 @@ class DirectSessionPanel(AppShell): joyboxFrame, text = 'XYZ Scale Factor', value = 1.0, - hull_relief = RIDGE, hull_borderwidth = 2, + hull_relief = tk.RIDGE, hull_borderwidth = 2, min = 1.0, max = 100.0) self.jbXyzSF['command'] = ( lambda v: base.direct.joybox.setXyzMultiplier(v)) - self.jbXyzSF.pack(fill = X, expand = 0) + self.jbXyzSF.pack(fill = tk.X, expand = 0) self.bind(self.jbXyzSF, 'Set joybox XYZ speed multiplier') self.jbHprSF = Slider.Slider( joyboxFrame, text = 'HPR Scale Factor', value = 1.0, - hull_relief = RIDGE, hull_borderwidth = 2, + hull_relief = tk.RIDGE, hull_borderwidth = 2, min = 1.0, max = 100.0) self.jbHprSF['command'] = ( lambda v: base.direct.joybox.setHprMultiplier(v)) - self.jbHprSF.pack(fill = X, expand = 0) + self.jbHprSF.pack(fill = tk.X, expand = 0) self.bind(self.jbHprSF, 'Set joybox HPR speed multiplier') def createTasksPage(self, tasksPage): - Label(tasksPage, text = 'TASKS', + tk.Label(tasksPage, text = 'TASKS', font=('MSSansSerif', 14, 'bold')).pack(expand = 0) self.taskMgrPanel = TaskManagerWidget(tasksPage, taskMgr) self.taskMgrPanel.taskListBox['listbox_height'] = 10 @@ -599,7 +607,7 @@ class DirectSessionPanel(AppShell): memPage, nodePath = render, scrolledCanvas_hull_width = 250, scrolledCanvas_hull_height = 250) - self.MemExp.pack(fill = BOTH, expand = 1) + self.MemExp.pack(fill = tk.BOTH, expand = 1) def toggleDirect(self): if self.directEnabled.get(): diff --git a/direct/src/tkpanels/FSMInspector.py b/direct/src/tkpanels/FSMInspector.py index 95bd86333c..fff7e3a3a1 100644 --- a/direct/src/tkpanels/FSMInspector.py +++ b/direct/src/tkpanels/FSMInspector.py @@ -104,12 +104,12 @@ avoid the problem for me:: __all__ = ['FSMInspector', 'StateInspector'] -from direct.tkwidgets.AppShell import * -from direct.showbase.TkGlobal import * +from direct.tkwidgets.AppShell import AppShell from tkinter.simpledialog import askstring import Pmw import math import operator +import tkinter as tk DELTA = (5.0 / 360.) * 2.0 * math.pi @@ -158,7 +158,7 @@ class FSMInspector(AppShell): label = 'Grid spacing...', command = self.popupGridDialog) # Create the checkbutton variable - self._fGridSnap = IntVar() + self._fGridSnap = tk.IntVar() self._fGridSnap.set(1) menuBar.addmenuitem('ClassicFSM', 'checkbutton', 'Enable/disable grid', @@ -196,7 +196,7 @@ class FSMInspector(AppShell): self._canvas = self._scrolledCanvas.component('canvas') self._canvas['scrollregion'] = ('-2i', '-2i', '2i', '2i') self._scrolledCanvas.resizescrollregion() - self._scrolledCanvas.pack(padx = 5, pady = 5, expand=1, fill = BOTH) + self._scrolledCanvas.pack(padx = 5, pady = 5, expand=1, fill = tk.BOTH) # Update lines self._canvas.bind('', self.drawConnections) @@ -429,7 +429,7 @@ class StateInspector(Pmw.MegaArchetype): fill = 'CornflowerBlue', tags = (self.tag,'markers')) self.text = self._canvas.create_text(0, 0, text = state.getName(), - justify = CENTER, + justify = tk.CENTER, tags = (self.tag,'labels')) # Is this state contain a sub machine? if state.hasChildren(): @@ -441,7 +441,7 @@ class StateInspector(Pmw.MegaArchetype): # The Popup State Menu - self._popupMenu = Menu(self._canvas, tearoff = 0) + self._popupMenu = tk.Menu(self._canvas, tearoff = 0) self._popupMenu.add_command(label = 'Request transition to ' + state.getName(), command = self.transitionTo) diff --git a/direct/src/tkpanels/Inspector.py b/direct/src/tkpanels/Inspector.py index 0a0dfcde64..d646afcb74 100644 --- a/direct/src/tkpanels/Inspector.py +++ b/direct/src/tkpanels/Inspector.py @@ -14,8 +14,8 @@ See :ref:`inspection-utilities` for more information. __all__ = ['inspect', 'inspectorFor', 'Inspector', 'ModuleInspector', 'ClassInspector', 'InstanceInspector', 'FunctionInspector', 'InstanceMethodInspector', 'CodeInspector', 'ComplexInspector', 'DictionaryInspector', 'SequenceInspector', 'SliceInspector', 'InspectorWindow'] -from direct.showbase.TkGlobal import * import Pmw +import tkinter as tk ### public API @@ -246,7 +246,7 @@ class InspectorWindow: return self.topInspector().object def open(self): - self.top= Toplevel() + self.top= tk.Toplevel() self.top.geometry('650x315') self.createViews() self.update() @@ -255,10 +255,10 @@ class InspectorWindow: def createViews(self): self.createMenus() # Paned widget for dividing two halves - self.framePane = Pmw.PanedWidget(self.top, orient = HORIZONTAL) + self.framePane = Pmw.PanedWidget(self.top, orient = tk.HORIZONTAL) self.createListWidget() self.createTextWidgets() - self.framePane.pack(expand = 1, fill = BOTH) + self.framePane.pack(expand = 1, fill = tk.BOTH) def setTitle(self): self.top.title('Inspecting: ' + self.topInspector().title()) @@ -267,7 +267,7 @@ class InspectorWindow: listFrame = self.framePane.add('list') listWidget = self.listWidget = Pmw.ScrolledListBox( listFrame, vscrollmode = 'static') - listWidget.pack(side=LEFT, fill=BOTH, expand=1) + listWidget.pack(side=tk.LEFT, fill=tk.BOTH, expand=1) # If you click in the list box, take focus so you can navigate # with the cursor keys listbox = listWidget.component('listbox') @@ -284,36 +284,36 @@ class InspectorWindow: def createTextWidgets(self): textWidgetsFrame = self.framePane.add('textWidgets') - self.textPane = Pmw.PanedWidget(textWidgetsFrame, orient = VERTICAL) + self.textPane = Pmw.PanedWidget(textWidgetsFrame, orient = tk.VERTICAL) textFrame = self.textPane.add('text', size = 200) self.textWidget = Pmw.ScrolledText( textFrame, vscrollmode = 'static', text_state = 'disabled') - self.textWidget.pack(fill=BOTH, expand=1) + self.textWidget.pack(fill=tk.BOTH, expand=1) commandFrame = self.textPane.add('command') self.commandWidget = Pmw.ScrolledText( commandFrame, vscrollmode = 'static') self.commandWidget.insert(1.0, '>>> ') - self.commandWidget.pack(fill = BOTH, expand = 1) + self.commandWidget.pack(fill = tk.BOTH, expand = 1) self.commandWidget.component('text').bind( '', self.evalCommand) - self.textPane.pack(expand = 1, fill = BOTH) + self.textPane.pack(expand = 1, fill = tk.BOTH) def createMenus(self): - self.menuBar = Menu(self.top) + self.menuBar = tk.Menu(self.top) self.top.config(menu=self.menuBar) - inspectMenu = Menu(self.menuBar) + inspectMenu = tk.Menu(self.menuBar) self.menuBar.add_cascade(label='Inspect', menu=inspectMenu) inspectMenu.add_command(label='Pop', command=self.pop) inspectMenu.add_command(label='Dive', command=self.dive) inspectMenu.add_command(label='Inspect', command=self.inspect) - helpMenu = Menu(self.menuBar) + helpMenu = tk.Menu(self.menuBar) self.menuBar.add_cascade(label='Help', menu=helpMenu) helpMenu.add_command(label='Instructions', command=self.showHelp) def fillList(self): - self.listWidget.delete(0, END) + self.listWidget.delete(0, tk.END) for each in self.topInspector().partNames(): - self.listWidget.insert(END, each) + self.listWidget.insert(tk.END, each) self.listWidget.select_clear(0) # Event Handling @@ -323,8 +323,8 @@ class InspectorWindow: partNumber = 0 string = self.topInspector().stringForPartNumber(partNumber) self.textWidget.component('text').configure(state = 'normal') - self.textWidget.delete('1.0', END) - self.textWidget.insert(END, string) + self.textWidget.delete('1.0', tk.END) + self.textWidget.insert(tk.END, string) self.textWidget.component('text').configure(state = 'disabled') def popOrDive(self, event): @@ -337,9 +337,9 @@ class InspectorWindow: def evalCommand(self, event): """Eval text in commandWidget""" - insertPt = self.commandWidget.index(INSERT) + insertPt = self.commandWidget.index(tk.INSERT) commandLineStart = self.commandWidget.search( - '>>> ', INSERT, backwards = 1) + '>>> ', tk.INSERT, backwards = 1) if commandLineStart: commandStart = self.commandWidget.index( commandLineStart + ' + 4 chars') @@ -349,8 +349,8 @@ class InspectorWindow: partDict = { 'this': self.selectedPart(), 'object': self.topInspector().object } result = eval(command, partDict) - self.commandWidget.insert(INSERT, repr(result) + '\n>>> ') - self.commandWidget.see(INSERT) + self.commandWidget.insert(tk.INSERT, repr(result) + '\n>>> ') + self.commandWidget.see(tk.INSERT) # Menu Events def inspect(self): @@ -388,12 +388,12 @@ class InspectorWindow: self.listWidget.component('listbox').focus_set() def showHelp(self): - help = Toplevel(base.tkRoot) + help = tk.Toplevel(base.tkRoot) help.title("Inspector Help") - frame = Frame(help) + frame = tk.Frame(help) frame.pack() - text = Label( - frame, justify = LEFT, + text = tk.Label( + frame, justify = tk.LEFT, text = "ListBox shows selected object's attributes\nDouble click or use right arrow on an instance variable to dive down.\nDouble click self or use left arrow to pop back up.\nUse up and down arrow keys to move from item to item in the current level.\n\nValue box (upper right) shows current value of selected item\n\nCommand box (lower right) is used to evaluate python commands\nLocal variables 'object' and 'this' are defined as the current object being inspected\nand the current attribute selected." ) text.pack() @@ -441,7 +441,7 @@ class InspectorWindow: event.widget.winfo_pointery()) def createPopupMenu(self, part, menuList): - popupMenu = Menu(self.top, tearoff = 0) + popupMenu = tk.Menu(self.top, tearoff = 0) for item, func in menuList: popupMenu.add_command( label = item, diff --git a/direct/src/tkpanels/MopathRecorder.py b/direct/src/tkpanels/MopathRecorder.py index 3d258e2911..f903509a11 100644 --- a/direct/src/tkpanels/MopathRecorder.py +++ b/direct/src/tkpanels/MopathRecorder.py @@ -3,23 +3,39 @@ __all__ = ['MopathRecorder'] # Import Tkinter, Pmw, and the dial code from this directory tree. -from panda3d.core import * +from panda3d.core import ( + Camera, + ClockObject, + CurveFitter, + Filename, + NodePath, + ParametricCurveCollection, + PerspectiveLens, + Point3, + Quat, + VBase3, + VBase4, + Vec3, + Vec4, + getModelPath, +) from direct.showbase import ShowBaseGlobal from direct.showbase.DirectObject import DirectObject -from direct.showbase.TkGlobal import * -from direct.tkwidgets.AppShell import * -from direct.directtools.DirectGlobals import * -from direct.directtools.DirectUtil import * -from direct.directtools.DirectGeometry import * -from direct.directtools.DirectSelection import * +from direct.tkwidgets.AppShell import AppShell +from direct.directtools.DirectUtil import CLAMP, useDirectRenderStyle +from direct.directtools.DirectGeometry import LineNodePath, qSlerp +from direct.directtools.DirectSelection import SelectionRay +from direct.task import Task from direct.tkwidgets import Dial from direct.tkwidgets import Floater from direct.tkwidgets import Slider from direct.tkwidgets import EntryScale from direct.tkwidgets import VectorWidgets -from tkinter.filedialog import * +from tkinter.filedialog import askopenfilename, asksaveasfilename import Pmw +import math import os +import tkinter as tk PRF_UTILITIES = [ @@ -215,34 +231,34 @@ class MopathRecorder(AppShell, DirectObject): 'Select input points to fit curve to', '', self.selectPointSetNamed, expand = 1) - self.undoButton = Button(self.menuFrame, text = 'Undo', - command = base.direct.undo) + self.undoButton = tk.Button(self.menuFrame, text = 'Undo', + command = base.direct.undo) if base.direct.undoList: self.undoButton['state'] = 'normal' else: self.undoButton['state'] = 'disabled' - self.undoButton.pack(side = LEFT, expand = 0) + self.undoButton.pack(side = tk.LEFT, expand = 0) self.bind(self.undoButton, 'Undo last operation') - self.redoButton = Button(self.menuFrame, text = 'Redo', - command = base.direct.redo) + self.redoButton = tk.Button(self.menuFrame, text = 'Redo', + command = base.direct.redo) if base.direct.redoList: self.redoButton['state'] = 'normal' else: self.redoButton['state'] = 'disabled' - self.redoButton.pack(side = LEFT, expand = 0) + self.redoButton.pack(side = tk.LEFT, expand = 0) self.bind(self.redoButton, 'Redo last operation') # Record button - mainFrame = Frame(interior, relief = SUNKEN, borderwidth = 2) - frame = Frame(mainFrame) + mainFrame = tk.Frame(interior, relief = tk.SUNKEN, borderwidth = 2) + frame = tk.Frame(mainFrame) # Active node path # Button to select active node path widget = self.createButton(frame, 'Recording', 'Node Path:', 'Select Active Mopath Node Path', lambda s = self: base.direct.select(s.nodePath), - side = LEFT, expand = 0) - widget['relief'] = FLAT + side = tk.LEFT, expand = 0) + widget['relief'] = tk.FLAT self.nodePathMenu = Pmw.ComboBox( frame, entry_width = 20, selectioncommand = self.selectNodePathNamed, @@ -252,11 +268,11 @@ class MopathRecorder(AppShell, DirectObject): self.nodePathMenu.component('entryfield_entry')) self.nodePathMenuBG = ( self.nodePathMenuEntry.configure('background')[3]) - self.nodePathMenu.pack(side = LEFT, fill = X, expand = 1) + self.nodePathMenu.pack(side = tk.LEFT, fill = tk.X, expand = 1) self.bind(self.nodePathMenu, 'Select active node path used for recording and playback') # Recording type - self.recordingType = StringVar() + self.recordingType = tk.StringVar() self.recordingType.set('New Curve') widget = self.createRadiobutton( frame, 'left', @@ -273,90 +289,90 @@ class MopathRecorder(AppShell, DirectObject): 'Recording', 'Extend', ('Next record session extends existing path'), self.recordingType, 'Extend', expand = 0) - frame.pack(fill = X, expand = 1) + frame.pack(fill = tk.X, expand = 1) - frame = Frame(mainFrame) + frame = tk.Frame(mainFrame) widget = self.createCheckbutton( frame, 'Recording', 'Record', 'On: path is being recorded', self.toggleRecord, 0, - side = LEFT, fill = BOTH, expand = 1) - widget.configure(foreground = 'Red', relief = RAISED, borderwidth = 2, - anchor = CENTER, width = 16) + side = tk.LEFT, fill = tk.BOTH, expand = 1) + widget.configure(foreground = 'Red', relief = tk.RAISED, borderwidth = 2, + anchor = tk.CENTER, width = 16) widget = self.createButton(frame, 'Recording', 'Add Keyframe', 'Add Keyframe To Current Path', self.addKeyframe, - side = LEFT, expand = 1) - frame.pack(fill = X, expand = 1) + side = tk.LEFT, expand = 1) + frame.pack(fill = tk.X, expand = 1) - mainFrame.pack(expand = 1, fill = X, pady = 3) + mainFrame.pack(expand = 1, fill = tk.X, pady = 3) # Playback controls - playbackFrame = Frame(interior, relief = SUNKEN, - borderwidth = 2) - Label(playbackFrame, text = 'PLAYBACK CONTROLS', - font=('MSSansSerif', 12, 'bold')).pack(fill = X) + playbackFrame = tk.Frame(interior, relief = tk.SUNKEN, + borderwidth = 2) + tk.Label(playbackFrame, text = 'PLAYBACK CONTROLS', + font=('MSSansSerif', 12, 'bold')).pack(fill = tk.X) # Main playback control slider widget = self.createEntryScale( playbackFrame, 'Playback', 'Time', 'Set current playback time', - resolution = 0.01, command = self.playbackGoTo, side = TOP) - widget.component('hull')['relief'] = RIDGE + resolution = 0.01, command = self.playbackGoTo, side = tk.TOP) + widget.component('hull')['relief'] = tk.RIDGE # Kill playback task if drag slider widget['preCallback'] = self.stopPlayback # Jam duration entry into entry scale self.createLabeledEntry(widget.labelFrame, 'Resample', 'Path Duration', 'Set total curve duration', command = self.setPathDuration, - side = LEFT, expand = 0) + side = tk.LEFT, expand = 0) # Start stop buttons - frame = Frame(playbackFrame) + frame = tk.Frame(playbackFrame) widget = self.createButton(frame, 'Playback', '<<', 'Jump to start of playback', self.jumpToStartOfPlayback, - side = LEFT, expand = 1) + side = tk.LEFT, expand = 1) widget['font'] = (('MSSansSerif', 12, 'bold')) widget = self.createCheckbutton(frame, 'Playback', 'Play', 'Start/Stop playback', self.startStopPlayback, 0, - side = LEFT, fill = BOTH, expand = 1) + side = tk.LEFT, fill = tk.BOTH, expand = 1) widget.configure(anchor = 'center', justify = 'center', - relief = RAISED, font = ('MSSansSerif', 12, 'bold')) + relief = tk.RAISED, font = ('MSSansSerif', 12, 'bold')) widget = self.createButton(frame, 'Playback', '>>', 'Jump to end of playback', self.jumpToEndOfPlayback, - side = LEFT, expand = 1) + side = tk.LEFT, expand = 1) widget['font'] = (('MSSansSerif', 12, 'bold')) self.createCheckbutton(frame, 'Playback', 'Loop', 'On: loop playback', self.setLoopPlayback, self.loopPlayback, - side = LEFT, fill = BOTH, expand = 0) - frame.pack(fill = X, expand = 1) + side = tk.LEFT, fill = tk.BOTH, expand = 0) + frame.pack(fill = tk.X, expand = 1) # Speed control - frame = Frame(playbackFrame) - widget = Button(frame, text = 'PB Speed Vernier', relief = FLAT, - command = lambda s = self: s.setSpeedScale(1.0)) - widget.pack(side = LEFT, expand = 0) - self.speedScale = Scale(frame, from_ = -1, to = 1, - resolution = 0.01, showvalue = 0, - width = 10, orient = 'horizontal', - command = self.setPlaybackSF) - self.speedScale.pack(side = LEFT, fill = X, expand = 1) - self.speedVar = StringVar() + frame = tk.Frame(playbackFrame) + widget = tk.Button(frame, text = 'PB Speed Vernier', relief = tk.FLAT, + command = lambda s = self: s.setSpeedScale(1.0)) + widget.pack(side = tk.LEFT, expand = 0) + self.speedScale = tk.Scale(frame, from_ = -1, to = 1, + resolution = 0.01, showvalue = 0, + width = 10, orient = 'horizontal', + command = self.setPlaybackSF) + self.speedScale.pack(side = tk.LEFT, fill = tk.X, expand = 1) + self.speedVar = tk.StringVar() self.speedVar.set("0.00") - self.speedEntry = Entry(frame, textvariable = self.speedVar, + self.speedEntry = tk.Entry(frame, textvariable = self.speedVar, width = 8) self.speedEntry.bind( '', lambda e = None, s = self: s.setSpeedScale( float(s.speedVar.get()))) - self.speedEntry.pack(side = LEFT, expand = 0) - frame.pack(fill = X, expand = 1) + self.speedEntry.pack(side = tk.LEFT, expand = 0) + frame.pack(fill = tk.X, expand = 1) - playbackFrame.pack(fill = X, pady = 2) + playbackFrame.pack(fill = tk.X, pady = 2) # Create notebook pages self.mainNotebook = Pmw.NoteBook(interior) - self.mainNotebook.pack(fill = BOTH, expand = 1) + self.mainNotebook.pack(fill = tk.BOTH, expand = 1) self.resamplePage = self.mainNotebook.add('Resample') self.refinePage = self.mainNotebook.add('Refine') self.extendPage = self.mainNotebook.add('Extend') @@ -365,54 +381,54 @@ class MopathRecorder(AppShell, DirectObject): self.optionsPage = self.mainNotebook.add('Options') ## RESAMPLE PAGE - label = Label(self.resamplePage, text = 'RESAMPLE CURVE', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + label = tk.Label(self.resamplePage, text = 'RESAMPLE CURVE', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) # Resample - resampleFrame = Frame( - self.resamplePage, relief = SUNKEN, borderwidth = 2) - label = Label(resampleFrame, text = 'RESAMPLE CURVE', - font=('MSSansSerif', 12, 'bold')).pack() + resampleFrame = tk.Frame( + self.resamplePage, relief = tk.SUNKEN, borderwidth = 2) + label = tk.Label(resampleFrame, text = 'RESAMPLE CURVE', + font=('MSSansSerif', 12, 'bold')).pack() widget = self.createSlider( resampleFrame, 'Resample', 'Num. Samples', 'Number of samples in resampled curve', resolution = 1, min = 2, max = 1000, command = self.setNumSamples) - widget.component('hull')['relief'] = RIDGE + widget.component('hull')['relief'] = tk.RIDGE widget['postCallback'] = self.sampleCurve - frame = Frame(resampleFrame) + frame = tk.Frame(resampleFrame) self.createButton( frame, 'Resample', 'Make Even', 'Apply timewarp so resulting path has constant velocity', - self.makeEven, side = LEFT, fill = X, expand = 1) + self.makeEven, side = tk.LEFT, fill = tk.X, expand = 1) self.createButton( frame, 'Resample', 'Face Forward', 'Compute HPR so resulting hpr curve faces along xyz tangent', - self.faceForward, side = LEFT, fill = X, expand = 1) - frame.pack(fill = X, expand = 0) - resampleFrame.pack(fill = X, expand = 0, pady = 2) + self.faceForward, side = tk.LEFT, fill = tk.X, expand = 1) + frame.pack(fill = tk.X, expand = 0) + resampleFrame.pack(fill = tk.X, expand = 0, pady = 2) # Desample - desampleFrame = Frame( - self.resamplePage, relief = SUNKEN, borderwidth = 2) - Label(desampleFrame, text = 'DESAMPLE CURVE', + desampleFrame = tk.Frame( + self.resamplePage, relief = tk.SUNKEN, borderwidth = 2) + tk.Label(desampleFrame, text = 'DESAMPLE CURVE', font=('MSSansSerif', 12, 'bold')).pack() widget = self.createSlider( desampleFrame, 'Resample', 'Points Between Samples', 'Specify number of points to skip between samples', min = 1, max = 100, resolution = 1, command = self.setDesampleFrequency) - widget.component('hull')['relief'] = RIDGE + widget.component('hull')['relief'] = tk.RIDGE widget['postCallback'] = self.desampleCurve - desampleFrame.pack(fill = X, expand = 0, pady = 2) + desampleFrame.pack(fill = tk.X, expand = 0, pady = 2) ## REFINE PAGE ## - refineFrame = Frame(self.refinePage, relief = SUNKEN, - borderwidth = 2) - label = Label(refineFrame, text = 'REFINE CURVE', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + refineFrame = tk.Frame(self.refinePage, relief = tk.SUNKEN, + borderwidth = 2) + label = tk.Label(refineFrame, text = 'REFINE CURVE', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) widget = self.createSlider(refineFrame, 'Refine Page', 'Refine From', @@ -441,14 +457,14 @@ class MopathRecorder(AppShell, DirectObject): command = self.setRefineStop) widget['preCallback'] = self.setRefineMode widget['postCallback'] = self.getPostPoints - refineFrame.pack(fill = X) + refineFrame.pack(fill = tk.X) ## EXTEND PAGE ## - extendFrame = Frame(self.extendPage, relief = SUNKEN, - borderwidth = 2) - label = Label(extendFrame, text = 'EXTEND CURVE', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + extendFrame = tk.Frame(self.extendPage, relief = tk.SUNKEN, + borderwidth = 2) + label = tk.Label(extendFrame, text = 'EXTEND CURVE', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) widget = self.createSlider(extendFrame, 'Extend Page', 'Extend From', @@ -464,14 +480,14 @@ class MopathRecorder(AppShell, DirectObject): resolution = 0.01, command = self.setControlStart) widget['preCallback'] = self.setExtendMode - extendFrame.pack(fill = X) + extendFrame.pack(fill = tk.X) ## CROP PAGE ## - cropFrame = Frame(self.cropPage, relief = SUNKEN, - borderwidth = 2) - label = Label(cropFrame, text = 'CROP CURVE', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + cropFrame = tk.Frame(self.cropPage, relief = tk.SUNKEN, + borderwidth = 2) + label = tk.Label(cropFrame, text = 'CROP CURVE', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) widget = self.createSlider( cropFrame, @@ -489,70 +505,70 @@ class MopathRecorder(AppShell, DirectObject): self.createButton(cropFrame, 'Crop Page', 'Crop Curve', 'Crop curve to specified from to times', - self.cropCurve, fill = NONE) - cropFrame.pack(fill = X) + self.cropCurve, fill = tk.NONE) + cropFrame.pack(fill = tk.X) ## DRAW PAGE ## - drawFrame = Frame(self.drawPage, relief = SUNKEN, - borderwidth = 2) + drawFrame = tk.Frame(self.drawPage, relief = tk.SUNKEN, + borderwidth = 2) self.sf = Pmw.ScrolledFrame(self.drawPage, horizflex = 'elastic') self.sf.pack(fill = 'both', expand = 1) sfFrame = self.sf.interior() - label = Label(sfFrame, text = 'CURVE RENDERING STYLE', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + label = tk.Label(sfFrame, text = 'CURVE RENDERING STYLE', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) - frame = Frame(sfFrame) - Label(frame, text = 'SHOW:').pack(side = LEFT, expand = 0) + frame = tk.Frame(sfFrame) + tk.Label(frame, text = 'SHOW:').pack(side = tk.LEFT, expand = 0) widget = self.createCheckbutton( frame, 'Style', 'Path', 'On: path is visible', self.setPathVis, 1, - side = LEFT, fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) widget = self.createCheckbutton( frame, 'Style', 'Knots', 'On: path knots are visible', self.setKnotVis, 1, - side = LEFT, fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) widget = self.createCheckbutton( frame, 'Style', 'CVs', 'On: path CVs are visible', self.setCvVis, 0, - side = LEFT, fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) widget = self.createCheckbutton( frame, 'Style', 'Hull', 'On: path hull is visible', self.setHullVis, 0, - side = LEFT, fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) widget = self.createCheckbutton( frame, 'Style', 'Trace', 'On: record is visible', self.setTraceVis, 0, - side = LEFT, fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) widget = self.createCheckbutton( frame, 'Style', 'Marker', 'On: playback marker is visible', self.setMarkerVis, 0, - side = LEFT, fill = X, expand = 1) - frame.pack(fill = X, expand = 1) + side = tk.LEFT, fill = tk.X, expand = 1) + frame.pack(fill = tk.X, expand = 1) # Sliders widget = self.createSlider( sfFrame, 'Style', 'Num Segs', 'Set number of segments used to approximate each parametric unit', min = 1.0, max = 400, resolution = 1.0, value = 40, - command = self.setNumSegs, side = TOP) - widget.component('hull')['relief'] = RIDGE + command = self.setNumSegs, side = tk.TOP) + widget.component('hull')['relief'] = tk.RIDGE widget = self.createSlider( sfFrame, 'Style', 'Num Ticks', 'Set number of tick marks drawn for each unit of time', min = 0.0, max = 10.0, resolution = 1.0, value = 0.0, - command = self.setNumTicks, side = TOP) - widget.component('hull')['relief'] = RIDGE + command = self.setNumTicks, side = tk.TOP) + widget.component('hull')['relief'] = tk.RIDGE widget = self.createSlider( sfFrame, 'Style', 'Tick Scale', 'Set visible size of time tick marks', min = 0.01, max = 100.0, resolution = 0.01, value = 5.0, - command = self.setTickScale, side = TOP) - widget.component('hull')['relief'] = RIDGE + command = self.setTickScale, side = tk.TOP) + widget.component('hull')['relief'] = tk.RIDGE self.createColorEntry( sfFrame, 'Style', 'Path Color', 'Color of curve', @@ -579,23 +595,23 @@ class MopathRecorder(AppShell, DirectObject): command = self.setHullColor, value = [255.0, 128.0, 128.0, 255.0]) - #drawFrame.pack(fill = X) + #drawFrame.pack(fill = tk.X) ## OPTIONS PAGE ## - optionsFrame = Frame(self.optionsPage, relief = SUNKEN, - borderwidth = 2) - label = Label(optionsFrame, text = 'RECORDING OPTIONS', - font=('MSSansSerif', 12, 'bold')) - label.pack(fill = X) + optionsFrame = tk.Frame(self.optionsPage, relief = tk.SUNKEN, + borderwidth = 2) + label = tk.Label(optionsFrame, text = 'RECORDING OPTIONS', + font=('MSSansSerif', 12, 'bold')) + label.pack(fill = tk.X) # Hooks - frame = Frame(optionsFrame) + frame = tk.Frame(optionsFrame) widget = self.createLabeledEntry( frame, 'Recording', 'Record Hook', 'Hook used to start/stop recording', value = self.startStopHook, command = self.setStartStopHook)[0] label = self.getWidget('Recording', 'Record Hook-Label') - label.configure(width = 16, anchor = W) + label.configure(width = 16, anchor = tk.W) self.setStartStopHook() widget = self.createLabeledEntry( frame, 'Recording', 'Keyframe Hook', @@ -603,27 +619,27 @@ class MopathRecorder(AppShell, DirectObject): value = self.keyframeHook, command = self.setKeyframeHook)[0] label = self.getWidget('Recording', 'Keyframe Hook-Label') - label.configure(width = 16, anchor = W) + label.configure(width = 16, anchor = tk.W) self.setKeyframeHook() - frame.pack(expand = 1, fill = X) + frame.pack(expand = 1, fill = tk.X) # PreRecordFunc - frame = Frame(optionsFrame) + frame = tk.Frame(optionsFrame) widget = self.createComboBox( frame, 'Recording', 'Pre-Record Func', 'Function called before sampling each point', PRF_UTILITIES, self.setPreRecordFunc, history = 1, expand = 1) - widget.configure(label_width = 16, label_anchor = W) + widget.configure(label_width = 16, label_anchor = tk.W) widget.configure(entryfield_entry_state = 'normal') # Initialize preRecordFunc self.preRecordFunc = eval(PRF_UTILITIES[0]) self.createCheckbutton(frame, 'Recording', 'PRF Active', 'On: Pre Record Func enabled', None, 0, - side = LEFT, fill = BOTH, expand = 0) - frame.pack(expand = 1, fill = X) + side = tk.LEFT, fill = tk.BOTH, expand = 0) + frame.pack(expand = 1, fill = tk.X) # Pack record frame - optionsFrame.pack(fill = X, pady = 2) + optionsFrame.pack(fill = tk.X, pady = 2) self.mainNotebook.setnaturalsize() @@ -1693,29 +1709,29 @@ class MopathRecorder(AppShell, DirectObject): def createLabeledEntry(self, parent, category, text, balloonHelp, value = '', command = None, - relief = 'sunken', side = LEFT, + relief = 'sunken', side = tk.LEFT, expand = 1, width = 12): - frame = Frame(parent) - variable = StringVar() + frame = tk.Frame(parent) + variable = tk.StringVar() variable.set(value) - label = Label(frame, text = text) - label.pack(side = LEFT, fill = X) + label = tk.Label(frame, text = text) + label.pack(side = tk.LEFT, fill = tk.X) self.bind(label, balloonHelp) self.widgetDict[category + '-' + text + '-Label'] = label - entry = Entry(frame, width = width, relief = relief, - textvariable = variable) - entry.pack(side = LEFT, fill = X, expand = expand) + entry = tk.Entry(frame, width = width, relief = relief, + textvariable = variable) + entry.pack(side = tk.LEFT, fill = tk.X, expand = expand) self.bind(entry, balloonHelp) self.widgetDict[category + '-' + text] = entry self.variableDict[category + '-' + text] = variable if command: entry.bind('', command) - frame.pack(side = side, fill = X, expand = expand) + frame.pack(side = side, fill = tk.X, expand = expand) return (frame, label, entry) def createButton(self, parent, category, text, balloonHelp, command, - side = 'top', expand = 0, fill = X): - widget = Button(parent, text = text) + side = 'top', expand = 0, fill = tk.X): + widget = tk.Button(parent, text = text) # Do this after the widget so command isn't called on creation widget['command'] = command widget.pack(side = side, fill = fill, expand = expand) @@ -1725,11 +1741,11 @@ class MopathRecorder(AppShell, DirectObject): def createCheckbutton(self, parent, category, text, balloonHelp, command, initialState, - side = 'top', fill = X, expand = 0): - bool = BooleanVar() + side = 'top', fill = tk.X, expand = 0): + bool = tk.BooleanVar() bool.set(initialState) - widget = Checkbutton(parent, text = text, anchor = W, - variable = bool) + widget = tk.Checkbutton(parent, text = text, anchor = tk.W, + variable = bool) # Do this after the widget so command isn't called on creation widget['command'] = command widget.pack(side = side, fill = fill, expand = expand) @@ -1740,9 +1756,9 @@ class MopathRecorder(AppShell, DirectObject): def createRadiobutton(self, parent, side, category, text, balloonHelp, variable, value, - command = None, fill = X, expand = 0): - widget = Radiobutton(parent, text = text, anchor = W, - variable = variable, value = value) + command = None, fill = tk.X, expand = 0): + widget = tk.Radiobutton(parent, text = text, anchor = tk.W, + variable = variable, value = value) # Do this after the widget so command isn't called on creation widget['command'] = command widget.pack(side = side, fill = fill, expand = expand) @@ -1760,7 +1776,7 @@ class MopathRecorder(AppShell, DirectObject): widget = Floater.Floater(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1771,7 +1787,7 @@ class MopathRecorder(AppShell, DirectObject): widget = Dial.AngleDial(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1779,7 +1795,7 @@ class MopathRecorder(AppShell, DirectObject): def createSlider(self, parent, category, text, balloonHelp, command = None, min = 0.0, max = 1.0, resolution = None, - side = TOP, fill = X, expand = 1, **kw): + side = tk.TOP, fill = tk.X, expand = 1, **kw): kw['text'] = text kw['min'] = min kw['max'] = max @@ -1797,7 +1813,7 @@ class MopathRecorder(AppShell, DirectObject): def createEntryScale(self, parent, category, text, balloonHelp, command = None, min = 0.0, max = 1.0, resolution = None, - side = TOP, fill = X, expand = 1, **kw): + side = tk.TOP, fill = tk.X, expand = 1, **kw): kw['text'] = text kw['min'] = min kw['max'] = max @@ -1817,7 +1833,7 @@ class MopathRecorder(AppShell, DirectObject): widget = VectorWidgets.Vector2Entry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1829,7 +1845,7 @@ class MopathRecorder(AppShell, DirectObject): widget = VectorWidgets.Vector3Entry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1841,23 +1857,23 @@ class MopathRecorder(AppShell, DirectObject): widget = VectorWidgets.ColorEntry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget def createOptionMenu(self, parent, category, text, balloonHelp, items, command): - optionVar = StringVar() + optionVar = tk.StringVar() if len(items) > 0: optionVar.set(items[0]) - widget = Pmw.OptionMenu(parent, labelpos = W, label_text = text, + widget = Pmw.OptionMenu(parent, labelpos = tk.W, label_text = text, label_width = 12, menu_tearoff = 1, menubutton_textvariable = optionVar, items = items) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget.component('menubutton'), balloonHelp) self.widgetDict[category + '-' + text] = widget self.variableDict[category + '-' + text] = optionVar @@ -1865,9 +1881,9 @@ class MopathRecorder(AppShell, DirectObject): def createComboBox(self, parent, category, text, balloonHelp, items, command, history = 0, - side = LEFT, expand = 0, fill = X): + side = tk.LEFT, expand = 0, fill = tk.X): widget = Pmw.ComboBox(parent, - labelpos = W, + labelpos = tk.W, label_text = text, label_anchor = 'e', label_width = 12, diff --git a/direct/src/tkpanels/ParticlePanel.py b/direct/src/tkpanels/ParticlePanel.py index 9e084145d6..59670e3e74 100644 --- a/direct/src/tkpanels/ParticlePanel.py +++ b/direct/src/tkpanels/ParticlePanel.py @@ -3,11 +3,41 @@ __all__ = ['ParticlePanel'] # Import Tkinter, Pmw, and the floater code from this directory tree. -from panda3d.core import * -from panda3d.physics import * +from panda3d.core import ColorBlendAttrib, Filename, Point2, Point3, Vec3, Vec4, getModelPath +from panda3d.physics import ( + BaseParticleEmitter, + BaseParticleRenderer, + BoxEmitter, + ColorInterpolationFunctionConstant, + ColorInterpolationFunctionLinear, + ColorInterpolationFunctionSinusoid, + ColorInterpolationFunctionStepwave, + DiscEmitter, + GeomParticleRenderer, + LinearCylinderVortexForce, + LinearDistanceForce, + LinearFrictionForce, + LinearJitterForce, + LinearNoiseForce, + LinearSinkForce, + LinearSourceForce, + LinearUserDefinedForce, + LinearVectorForce, + LineEmitter, + LineParticleRenderer, + PointEmitter, + PointParticleRenderer, + RectangleEmitter, + RingEmitter, + SparkleParticleRenderer, + SphereSurfaceEmitter, + SphereVolumeEmitter, + SpriteAnim, + SpriteParticleRenderer, + TangentRingEmitter, +) from panda3d.direct import getParticlePath -from direct.tkwidgets.AppShell import * -from direct.showbase.TkGlobal import * +from direct.tkwidgets.AppShell import AppShell from direct.tkwidgets import Dial from direct.tkwidgets import Floater from direct.tkwidgets import Slider @@ -16,10 +46,11 @@ from direct.tkpanels import Placer from direct.particles import ForceGroup from direct.particles import Particles from direct.particles import ParticleEffect -from tkinter.filedialog import * +from tkinter.filedialog import askopenfilename, asksaveasfilename from tkinter.simpledialog import askstring import Pmw import os +import tkinter as tk class ParticlePanel(AppShell): @@ -109,7 +140,7 @@ class ParticlePanel(AppShell): # PARTICLE MANAGER MENU self.menuBar.addmenu('ParticleMgr', 'ParticleMgr Operations') - self.particleMgrActive = IntVar() + self.particleMgrActive = tk.IntVar() self.particleMgrActive.set(base.isParticleMgrEnabled()) self.menuBar.addmenuitem( 'ParticleMgr', 'checkbutton', @@ -120,16 +151,16 @@ class ParticlePanel(AppShell): ## MENUBUTTON LABELS ## # Menubutton/label to identify the current objects being configured - labelFrame = Frame(interior) + labelFrame = tk.Frame(interior) # Current effect - self.effectsLabel = Menubutton(labelFrame, width = 10, - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 12, 'bold'), - activebackground = '#909090') - self.effectsLabelMenu = Menu(self.effectsLabel, tearoff = 0) + self.effectsLabel = tk.Menubutton(labelFrame, width = 10, + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 12, 'bold'), + activebackground = '#909090') + self.effectsLabelMenu = tk.Menu(self.effectsLabel, tearoff = 0) self.effectsLabel['menu'] = self.effectsLabelMenu - self.effectsLabel.pack(side = LEFT, fill = 'x', expand = 1) + self.effectsLabel.pack(side = tk.LEFT, fill = 'x', expand = 1) self.bind(self.effectsLabel, 'Select effect to configure or create new effect') self.effectsLabelMenu.add_command(label = 'Create New Effect', @@ -148,44 +179,44 @@ class ParticlePanel(AppShell): self.effectsLabelMenu.add_command( label = 'Toggle Effect Vis', command = togglePEVis) - self.effectsEnableMenu = Menu(self.effectsLabelMenu, tearoff = 0) + self.effectsEnableMenu = tk.Menu(self.effectsLabelMenu, tearoff = 0) self.effectsLabelMenu.add_cascade(label = 'Enable/Disable', menu = self.effectsEnableMenu) self.effectsLabelMenu.add_separator() # Current particles - self.particlesLabel = Menubutton(labelFrame, width = 10, - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 12, 'bold'), - activebackground = '#909090') - self.particlesLabelMenu = Menu(self.particlesLabel, tearoff = 0) + self.particlesLabel = tk.Menubutton(labelFrame, width = 10, + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 12, 'bold'), + activebackground = '#909090') + self.particlesLabelMenu = tk.Menu(self.particlesLabel, tearoff = 0) self.particlesLabel['menu'] = self.particlesLabelMenu - self.particlesLabel.pack(side = LEFT, fill = 'x', expand = 1) + self.particlesLabel.pack(side = tk.LEFT, fill = 'x', expand = 1) self.bind(self.particlesLabel, ('Select particles object to configure ' + 'or add new particles object to current effect')) self.particlesLabelMenu.add_command(label = 'Create New Particles', command = self.createNewParticles) - self.particlesEnableMenu = Menu(self.particlesLabelMenu, tearoff = 0) + self.particlesEnableMenu = tk.Menu(self.particlesLabelMenu, tearoff = 0) self.particlesLabelMenu.add_cascade(label = 'Enable/Disable', menu = self.particlesEnableMenu) self.particlesLabelMenu.add_separator() # Current force - self.forceGroupLabel = Menubutton(labelFrame, width = 10, - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 12, 'bold'), - activebackground = '#909090') - self.forceGroupLabelMenu = Menu(self.forceGroupLabel, tearoff = 0) + self.forceGroupLabel = tk.Menubutton(labelFrame, width = 10, + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 12, 'bold'), + activebackground = '#909090') + self.forceGroupLabelMenu = tk.Menu(self.forceGroupLabel, tearoff = 0) self.forceGroupLabel['menu'] = self.forceGroupLabelMenu - self.forceGroupLabel.pack(side = LEFT, fill = 'x', expand = 1) + self.forceGroupLabel.pack(side = tk.LEFT, fill = 'x', expand = 1) self.bind(self.forceGroupLabel, ('Select force group to configure ' + 'or add a new force group to current effect')) self.forceGroupLabelMenu.add_command( label = 'Create New ForceGroup', command = self.createNewForceGroup) - self.forceGroupEnableMenu = Menu(self.forceGroupLabelMenu, tearoff = 0) + self.forceGroupEnableMenu = tk.Menu(self.forceGroupLabelMenu, tearoff = 0) self.forceGroupLabelMenu.add_cascade(label = 'Enable/Disable', menu = self.forceGroupEnableMenu) self.forceGroupLabelMenu.add_separator() @@ -194,7 +225,7 @@ class ParticlePanel(AppShell): # Create the toplevel notebook pages self.mainNotebook = Pmw.NoteBook(interior) - self.mainNotebook.pack(fill = BOTH, expand = 1) + self.mainNotebook.pack(fill = tk.BOTH, expand = 1) systemPage = self.mainNotebook.add('System') factoryPage = self.mainNotebook.add('Factory') emitterPage = self.mainNotebook.add('Emitter') @@ -298,7 +329,7 @@ class ParticlePanel(AppShell): zSpinPage, 'Z Spin Factory', 'Enable Angular Velocity', ("On: angular velocity is used; " + "Off: final angle is used"), - self.toggleAngularVelocity, 0, side = TOP) + self.toggleAngularVelocity, 0, side = tk.TOP) self.createFloater( zSpinPage, 'Z Spin Factory', 'Angular Velocity', @@ -332,9 +363,9 @@ class ParticlePanel(AppShell): command = self.setFactoryZSpinFinalAngleSpread) # Oriented page # orientedPage = self.factoryNotebook.add('OrientedParticleFactory') - Label(orientedPage, text = 'Not implemented').pack(expand = 1, - fill = BOTH) - self.factoryNotebook.pack(expand = 1, fill = BOTH) + tk.Label(orientedPage, text = 'Not implemented').pack(expand = 1, + fill = tk.BOTH) + self.factoryNotebook.pack(expand = 1, fill = tk.BOTH) ## EMITTER PAGE WIDGETS ## self.createOptionMenu( @@ -347,9 +378,9 @@ class ParticlePanel(AppShell): self.selectEmitterType) # Emitter modes - self.emissionType = IntVar() + self.emissionType = tk.IntVar() self.emissionType.set(BaseParticleEmitter.ETRADIATE) - emissionFrame = Frame(emitterPage) + emissionFrame = tk.Frame(emitterPage) self.createRadiobutton( emissionFrame, 'left', 'Emitter', 'Explicit Emission', @@ -414,7 +445,7 @@ class ParticlePanel(AppShell): 'Radius of disc', command = self.setEmitterDiscRadius, min = 0.01) - customPage = self.discCustomFrame = Frame(discPage) + customPage = self.discCustomFrame = tk.Frame(discPage) self.createAngleDial(customPage, 'Disc Emitter', 'Inner Angle', 'Particle launch angle at center of disc', command = self.setEmitterDiscInnerAngle) @@ -431,7 +462,7 @@ class ParticlePanel(AppShell): customPage, 'Disc Emitter', 'Cubic Lerping', 'On: magnitude/angle interpolation from center', self.toggleEmitterDiscCubicLerping, 0) - customPage.pack(fill = BOTH, expand = 1) + customPage.pack(fill = tk.BOTH, expand = 1) # Line page # linePage = self.emitterNotebook.add('LineEmitter') @@ -467,11 +498,11 @@ class ParticlePanel(AppShell): 'Variation in radius of ring', command = self.setEmitterRingRadiusSpread, min = 0.0) - self.ringCustomFrame = Frame(ringPage) + self.ringCustomFrame = tk.Frame(ringPage) self.createAngleDial(self.ringCustomFrame, 'Ring Emitter', 'Angle', 'Particle launch angle', command = self.setEmitterRingLaunchAngle) - self.ringCustomFrame.pack(fill = BOTH, expand = 1) + self.ringCustomFrame.pack(fill = tk.BOTH, expand = 1) # Sphere volume # sphereVolumePage = self.emitterNotebook.add('SphereVolumeEmitter') @@ -496,7 +527,7 @@ class ParticlePanel(AppShell): 'Radius Spread', 'Variation in radius of ring', command = self.setEmitterTangentRingRadiusSpread) - self.emitterNotebook.pack(fill = X) + self.emitterNotebook.pack(fill = tk.X) ## RENDERER PAGE WIDGETS ## self.createOptionMenu( @@ -520,7 +551,7 @@ class ParticlePanel(AppShell): command = self.setRendererUserAlpha) self.rendererNotebook = Pmw.NoteBook(rendererPage, tabpos = None) - self.rendererNotebook.pack(fill = BOTH, expand = 1) + self.rendererNotebook.pack(fill = tk.BOTH, expand = 1) # Line page # linePage = self.rendererNotebook.add('LineParticleRenderer') @@ -538,22 +569,22 @@ class ParticlePanel(AppShell): # GEOM PARTICLE RENDERER PAGE # ############################################################################ geomPage = self.rendererNotebook.add('GeomParticleRenderer') - f = Frame(geomPage) - f.pack(fill = X) + f = tk.Frame(geomPage) + f.pack(fill = tk.X) # Geom Node input field - Label(f, width = 12, text = 'Geom Node', pady = 3).pack(side = LEFT) - self.rendererGeomNode = StringVar() - self.rendererGeomNodeEntry = Entry(f, width = 12, - textvariable = self.rendererGeomNode) + tk.Label(f, width = 12, text = 'Geom Node', pady = 3).pack(side = tk.LEFT) + self.rendererGeomNode = tk.StringVar() + self.rendererGeomNodeEntry = tk.Entry(f, width = 12, + textvariable = self.rendererGeomNode) self.rendererGeomNodeEntry.bind('', self.setRendererGeomNode) - self.rendererGeomNodeEntry.pack(side = LEFT, expand = 1, fill = X) + self.rendererGeomNodeEntry.pack(side = tk.LEFT, expand = 1, fill = tk.X) # Setup frames - f = Frame(geomPage) - f.pack(fill = BOTH, expand = 1) + f = tk.Frame(geomPage) + f.pack(fill = tk.BOTH, expand = 1) rendererGeomNotebook = Pmw.NoteBook(f) - rendererGeomNotebook.pack(fill = BOTH, expand = 1) + rendererGeomNotebook.pack(fill = tk.BOTH, expand = 1) rendererGeomBlendPage = rendererGeomNotebook.add('Blend') rendererGeomScalePage = rendererGeomNotebook.add('Scale') @@ -561,8 +592,8 @@ class ParticlePanel(AppShell): ############################################################################ # Blend tab - p = Frame(rendererGeomBlendPage) - p.pack(fill = X) + p = tk.Frame(rendererGeomBlendPage) + p.pack(fill = tk.X) self.createOptionMenu(p, 'Geom Renderer', 'Color Blend', 'How to render semi-transparent colors', @@ -591,27 +622,27 @@ class ParticlePanel(AppShell): ############################################################################ # Scale tab - p = Frame(rendererGeomScalePage) - p.pack(fill = X) + p = tk.Frame(rendererGeomScalePage) + p.pack(fill = tk.X) self.createCheckbutton( p, 'Geom Renderer', 'X Scale', ("On: x scale is interpolated over particle's life; " + "Off: stays as start_X_Scale"), - self.toggleRendererGeomXScale, 0, side = LEFT) + self.toggleRendererGeomXScale, 0, side = tk.LEFT) self.createCheckbutton( p, 'Geom Renderer', 'Y Scale', ("On: y scale is interpolated over particle's life; " + "Off: stays as start_Y_Scale"), - self.toggleRendererGeomYScale, 0, side = LEFT) + self.toggleRendererGeomYScale, 0, side = tk.LEFT) self.createCheckbutton( p, 'Geom Renderer', 'Z Scale', ("On: z scale is interpolated over particle's life; " + "Off: stays as start_Z_Scale"), - self.toggleRendererGeomZScale, 0, side = LEFT) + self.toggleRendererGeomZScale, 0, side = tk.LEFT) - p = Frame(rendererGeomScalePage) - p.pack(fill = X) + p = tk.Frame(rendererGeomScalePage) + p.pack(fill = tk.X) self.createFloater(p, 'Geom Renderer', 'Initial X Scale', @@ -640,14 +671,14 @@ class ParticlePanel(AppShell): ############################################################################ # Interpolate tab - p = Frame(rendererGeomInterpolationPage) - p.pack(fill = X) - addSegmentButton = Menubutton(p, text = 'Add Segment', - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 14, 'bold'), - activebackground = '#909090') - segmentMenu = Menu(addSegmentButton) + p = tk.Frame(rendererGeomInterpolationPage) + p.pack(fill = tk.X) + addSegmentButton = tk.Menubutton(p, text = 'Add Segment', + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 14, 'bold'), + activebackground = '#909090') + segmentMenu = tk.Menu(addSegmentButton) addSegmentButton['menu'] = segmentMenu segmentMenu.add_command(label = 'Add Constant segment', command = self.addConstantInterpolationSegment) @@ -660,10 +691,10 @@ class ParticlePanel(AppShell): addSegmentButton.pack(expand = 0) sf = Pmw.ScrolledFrame(p, horizflex = 'elastic') - sf.pack(fill = BOTH, expand = 1) + sf.pack(fill = tk.BOTH, expand = 1) self.rendererGeomSegmentFrame = sf.interior() - self.rendererGeomSegmentFrame.pack(fill = BOTH, expand = 1) + self.rendererGeomSegmentFrame.pack(fill = tk.BOTH, expand = 1) self.rendererSegmentWidgetList = [] rendererGeomNotebook.setnaturalsize() @@ -720,11 +751,11 @@ class ParticlePanel(AppShell): self.setRendererSparkleLifeScale) # Sprite # spritePage = self.rendererNotebook.add('SpriteParticleRenderer') - f = Frame(spritePage) - f.pack(fill = BOTH, expand = 1) + f = tk.Frame(spritePage) + f.pack(fill = tk.BOTH, expand = 1) rendererSpriteNotebook = Pmw.NoteBook(f) - rendererSpriteNotebook.pack(fill = BOTH, expand = 1) + rendererSpriteNotebook.pack(fill = tk.BOTH, expand = 1) rendererSpriteTexturePage = rendererSpriteNotebook.add('Texture') rendererSpriteScalePage = rendererSpriteNotebook.add('Scale') @@ -732,63 +763,63 @@ class ParticlePanel(AppShell): rendererSpriteInterpolationPage = rendererSpriteNotebook.add('Interpolate') ################################################################################## - p = Frame(rendererSpriteTexturePage) - p.pack(fill = BOTH, expand = 1) + p = tk.Frame(rendererSpriteTexturePage) + p.pack(fill = tk.BOTH, expand = 1) - bp = Frame(p) - bp.pack(expand = 0, side = TOP) + bp = tk.Frame(p) + bp.pack(expand = 0, side = tk.TOP) - bbp = Frame(bp) + bbp = tk.Frame(bp) bbp.pack() self.createCheckbutton( bbp, 'Sprite Renderer', 'Enable Animation', ("On: Multitexture node will be animated; " + "Off: Only the first frame of a node is rendered"), - self.setRendererSpriteAnimationEnable, 0, side = LEFT) + self.setRendererSpriteAnimationEnable, 0, side = tk.LEFT) self.createFloater(bbp, 'Sprite Renderer', 'Frame Rate', 'Animation frame rate', - command = self.setRendererSpriteAnimationFrameRate).pack(side = LEFT) + command = self.setRendererSpriteAnimationFrameRate).pack(side = tk.LEFT) - bbp = Frame(bp) + bbp = tk.Frame(bp) bbp.pack(pady=3) - Button(bbp, text = 'Add Texture', - command = self.addRendererSpriteAnimationTexture).pack(pady = 3, padx = 15, side = LEFT) - Button(bbp, text = 'Add Animation', - command = self.addRendererSpriteAnimationFromNode).pack(pady = 3, padx = 15, side = LEFT) + tk.Button(bbp, text = 'Add Texture', + command = self.addRendererSpriteAnimationTexture).pack(pady = 3, padx = 15, side = tk.LEFT) + tk.Button(bbp, text = 'Add Animation', + command = self.addRendererSpriteAnimationFromNode).pack(pady = 3, padx = 15, side = tk.LEFT) - pp = Frame(p) - pp.pack(fill = BOTH, expand = 1, pady = 3) + pp = tk.Frame(p) + pp.pack(fill = tk.BOTH, expand = 1, pady = 3) sf = Pmw.ScrolledFrame(pp, horizflex = 'elastic') - sf.pack(fill = BOTH, expand = 1) + sf.pack(fill = tk.BOTH, expand = 1) self.rendererSpriteAnimationFrame = sf.interior() - self.rendererSpriteAnimationFrame.pack(fill = BOTH, expand = 1) + self.rendererSpriteAnimationFrame.pack(fill = tk.BOTH, expand = 1) self.rendererSpriteAnimationWidgetList = [] - self.rendererSpriteTexture = StringVar() - self.rendererSpriteFile = StringVar() - self.rendererSpriteNode = StringVar() + self.rendererSpriteTexture = tk.StringVar() + self.rendererSpriteFile = tk.StringVar() + self.rendererSpriteNode = tk.StringVar() ################################################################################## - p = Frame(rendererSpriteScalePage) - p.pack(fill = X) + p = tk.Frame(rendererSpriteScalePage) + p.pack(fill = tk.X) self.createCheckbutton( p, 'Sprite Renderer', 'X Scale', ("On: x scale is interpolated over particle's life; " + "Off: stays as start_X_Scale"), - self.toggleRendererSpriteXScale, 0, side = LEFT) + self.toggleRendererSpriteXScale, 0, side = tk.LEFT) self.createCheckbutton( p, 'Sprite Renderer', 'Y Scale', ("On: y scale is interpolated over particle's life; " + "Off: stays as start_Y_Scale"), - self.toggleRendererSpriteYScale, 0, side = LEFT) + self.toggleRendererSpriteYScale, 0, side = tk.LEFT) self.createCheckbutton( p, 'Sprite Renderer', 'Anim Angle', ("On: particles that are set to spin on the Z axis will " + "spin appropriately"), - self.toggleRendererSpriteAnimAngle, 0, side = LEFT) - p = Frame(rendererSpriteScalePage) - p.pack(fill = X) + self.toggleRendererSpriteAnimAngle, 0, side = tk.LEFT) + p = tk.Frame(rendererSpriteScalePage) + p.pack(fill = tk.X) self.createFloater(p, 'Sprite Renderer', 'Initial X Scale', 'Initial X scaling factor', @@ -810,8 +841,8 @@ class ParticlePanel(AppShell): ('If animAngle is false: counter clockwise ' + 'Z rotation of all sprites'), command = self.setRendererSpriteNonAnimatedTheta) - p = Frame(rendererSpriteBlendPage) - p.pack(fill = X) + p = tk.Frame(rendererSpriteBlendPage) + p.pack(fill = tk.X) self.createOptionMenu(p, 'Sprite Renderer', 'Blend Type', 'Interpolation blend type for X and Y scaling', @@ -846,14 +877,14 @@ class ParticlePanel(AppShell): 'OZero'), self.setRendererSpriteColorBlendFbufferOperand) self.getVariable('Sprite Renderer','Fbuffer Op.').set('OOneMinusIncomingAlpha') - p = Frame(rendererSpriteInterpolationPage) - p.pack(fill = BOTH, expand = 1) - addSegmentButton = Menubutton(p, text = 'Add Segment', - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 14, 'bold'), - activebackground = '#909090') - segmentMenu = Menu(addSegmentButton) + p = tk.Frame(rendererSpriteInterpolationPage) + p.pack(fill = tk.BOTH, expand = 1) + addSegmentButton = tk.Menubutton(p, text = 'Add Segment', + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 14, 'bold'), + activebackground = '#909090') + segmentMenu = tk.Menu(addSegmentButton) addSegmentButton['menu'] = segmentMenu segmentMenu.add_command(label = 'Add Constant segment', command = self.addConstantInterpolationSegment) @@ -865,24 +896,24 @@ class ParticlePanel(AppShell): command = self.addSinusoidInterpolationSegment) addSegmentButton.pack(expand = 0) - pp = Frame(p) - pp.pack(fill = BOTH, expand = 1, pady = 3) + pp = tk.Frame(p) + pp.pack(fill = tk.BOTH, expand = 1, pady = 3) sf = Pmw.ScrolledFrame(pp, horizflex = 'elastic') - sf.pack(fill = BOTH, expand = 1) + sf.pack(fill = tk.BOTH, expand = 1) self.rendererSpriteSegmentFrame = sf.interior() - self.rendererSpriteSegmentFrame.pack(fill = BOTH, expand = 1) + self.rendererSpriteSegmentFrame.pack(fill = tk.BOTH, expand = 1) self.rendererSegmentWidgetList = [] rendererSpriteNotebook.setnaturalsize() ########################################################## ## FORCE PAGE WIDGETS ## - self.addForceButton = Menubutton(forcePage, text = 'Add Force', - relief = RAISED, - borderwidth = 2, - font=('MSSansSerif', 14, 'bold'), - activebackground = '#909090') - forceMenu = Menu(self.addForceButton) + self.addForceButton = tk.Menubutton(forcePage, text = 'Add Force', + relief = tk.RAISED, + borderwidth = 2, + font=('MSSansSerif', 14, 'bold'), + activebackground = '#909090') + forceMenu = tk.Menu(self.addForceButton) self.addForceButton['menu'] = forceMenu # DERIVED FROM LINEAR FORCE # This also has: setVector @@ -920,7 +951,7 @@ class ParticlePanel(AppShell): self.forceFrame = self.sf.interior() # Notebook to hold force widgets as the are added self.forceGroupNotebook = Pmw.NoteBook(self.forceFrame, tabpos = None) - self.forceGroupNotebook.pack(fill = X) + self.forceGroupNotebook.pack(fill = tk.X) ######################################################################## self.factoryNotebook.setnaturalsize() @@ -935,13 +966,13 @@ class ParticlePanel(AppShell): ### WIDGET UTILITY FUNCTIONS ### def createCheckbutton(self, parent, category, text, balloonHelp, command, initialState, side = 'top'): - bool = BooleanVar() + bool = tk.BooleanVar() bool.set(initialState) - widget = Checkbutton(parent, text = text, anchor = W, - variable = bool) + widget = tk.Checkbutton(parent, text = text, anchor = tk.W, + variable = bool) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X, side = side) + widget.pack(fill = tk.X, side = side) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget self.variableDict[category + '-' + text] = bool @@ -950,11 +981,11 @@ class ParticlePanel(AppShell): def createRadiobutton(self, parent, side, category, text, balloonHelp, variable, value, command): - widget = Radiobutton(parent, text = text, anchor = W, - variable = variable, value = value) + widget = tk.Radiobutton(parent, text = text, anchor = tk.W, + variable = variable, value = value) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(side = side, fill = X) + widget.pack(side = side, fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -988,7 +1019,7 @@ class ParticlePanel(AppShell): widget = Floater.Floater(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1000,7 +1031,7 @@ class ParticlePanel(AppShell): widget = Dial.AngleDial(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1015,7 +1046,7 @@ class ParticlePanel(AppShell): widget = Slider.Slider(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1027,7 +1058,7 @@ class ParticlePanel(AppShell): widget = VectorWidgets.Vector2Entry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1039,7 +1070,7 @@ class ParticlePanel(AppShell): widget = VectorWidgets.Vector3Entry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget @@ -1051,23 +1082,23 @@ class ParticlePanel(AppShell): widget = VectorWidgets.ColorEntry(parent, **kw) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget, balloonHelp) self.widgetDict[category + '-' + text] = widget return widget def createOptionMenu(self, parent, category, text, balloonHelp, items, command): - optionVar = StringVar() + optionVar = tk.StringVar() if len(items) > 0: optionVar.set(items[0]) - widget = Pmw.OptionMenu(parent, labelpos = W, label_text = text, + widget = Pmw.OptionMenu(parent, labelpos = tk.W, label_text = text, label_width = 12, menu_tearoff = 1, menubutton_textvariable = optionVar, items = items) # Do this after the widget so command isn't called on creation widget['command'] = command - widget.pack(fill = X) + widget.pack(fill = tk.X) self.bind(widget.component('menubutton'), balloonHelp) self.widgetDict[category + '-' + text] = widget self.variableDict[category + '-' + text] = optionVar @@ -1076,7 +1107,7 @@ class ParticlePanel(AppShell): def createComboBox(self, parent, category, text, balloonHelp, items, command, history = 0): widget = Pmw.ComboBox(parent, - labelpos = W, + labelpos = tk.W, label_text = text, label_anchor = 'w', label_width = 12, @@ -1128,7 +1159,7 @@ class ParticlePanel(AppShell): command = (lambda s = self, e = effect: s.selectEffectNamed(e.getName())) ) - effectActive = IntVar() + effectActive = tk.IntVar() effectActive.set(effect.isEnabled()) self.effectsEnableMenu.add_checkbutton( label = effect.getName(), @@ -1153,7 +1184,7 @@ class ParticlePanel(AppShell): command = (lambda s = self, n = name: s.selectParticlesNamed(n)) ) - particleActive = IntVar() + particleActive = tk.IntVar() particleActive.set(particle.isEnabled()) self.particlesEnableMenu.add_checkbutton( label = name, @@ -1178,7 +1209,7 @@ class ParticlePanel(AppShell): command = (lambda s = self, n = name: s.selectForceGroupNamed(n)) ) - forceActive = IntVar() + forceActive = tk.IntVar() forceActive.set(force.isEnabled()) self.forceGroupEnableMenu.add_checkbutton( label = name, @@ -1543,9 +1574,9 @@ class ParticlePanel(AppShell): 'Emitter', 'Explicit Velocity')['state'] = 'disabled' # Show custom widgets if isinstance(self.particles.emitter, DiscEmitter): - self.discCustomFrame.pack(fill = BOTH, expand = 1) + self.discCustomFrame.pack(fill = tk.BOTH, expand = 1) elif isinstance(self.particles.emitter, RingEmitter): - self.ringCustomFrame.pack(fill = BOTH, expand = 1) + self.ringCustomFrame.pack(fill = tk.BOTH, expand = 1) def setEmitterAmplitude(self, value): self.particles.emitter.setAmplitude(value) @@ -1683,8 +1714,8 @@ class ParticlePanel(AppShell): self.getWidget('Geom Renderer', 'Final Z Scale').set( finalZScale) if self.getVariable('Geom Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']: - self.getWidget('Geom Renderer','Incoming Op.').pack(fill = X) - self.getWidget('Geom Renderer','Fbuffer Op.').pack(fill = X) + self.getWidget('Geom Renderer','Incoming Op.').pack(fill = tk.X) + self.getWidget('Geom Renderer','Fbuffer Op.').pack(fill = tk.X) else: self.getWidget('Geom Renderer','Incoming Op.').pack_forget() self.getWidget('Geom Renderer','Fbuffer Op.').pack_forget() @@ -1777,8 +1808,8 @@ class ParticlePanel(AppShell): self.getVariable('Sprite Renderer', 'Alpha Disable').set( renderer.getAlphaDisable()) if self.getVariable('Sprite Renderer','Color Blend').get() in ['MAdd','MSubtract','MInvSubtract']: - self.getWidget('Sprite Renderer','Incoming Op.').pack(fill = X) - self.getWidget('Sprite Renderer','Fbuffer Op.').pack(fill = X) + self.getWidget('Sprite Renderer','Incoming Op.').pack(fill = tk.X) + self.getWidget('Sprite Renderer','Fbuffer Op.').pack(fill = tk.X) else: self.getWidget('Sprite Renderer','Incoming Op.').pack_forget() self.getWidget('Sprite Renderer','Fbuffer Op.').pack_forget() @@ -1921,7 +1952,7 @@ class ParticlePanel(AppShell): self.rendererSpriteAnimationWidgetList.append( self.createSpriteAnimationTextureWidget(parent, anim, repr(frameNum))) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def addRendererSpriteAnimationFromNode(self): ren = self.particles.getRenderer() parent = self.rendererSpriteAnimationFrame @@ -1942,7 +1973,7 @@ class ParticlePanel(AppShell): self.rendererSpriteAnimationWidgetList.append( self.createSpriteAnimationNodeWidget(parent, anim, repr(frameNum))) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def toggleRendererSpriteXScale(self): self.particles.renderer.setXScaleFlag( @@ -1986,8 +2017,8 @@ class ParticlePanel(AppShell): getattr(ColorBlendAttrib, fbufferOperandStr)) if blendMethodStr in ['MAdd','MSubtract','MInvSubtract']: - self.getWidget(rendererName,'Incoming Op.').pack(fill = X) - self.getWidget(rendererName,'Fbuffer Op.').pack(fill = X) + self.getWidget(rendererName,'Incoming Op.').pack(fill = tk.X) + self.getWidget(rendererName,'Fbuffer Op.').pack(fill = tk.X) else: self.getWidget(rendererName,'Incoming Op.').pack_forget() self.getWidget(rendererName,'Fbuffer Op.').pack_forget() @@ -2075,7 +2106,7 @@ class ParticlePanel(AppShell): segName = repr(len(self.rendererSegmentWidgetList))+':Constant' self.rendererSegmentWidgetList.append( self.createConstantInterpolationSegmentWidget(parent, segName, seg)) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def addLinearInterpolationSegment(self, id = None): ren = self.particles.getRenderer() @@ -2095,7 +2126,7 @@ class ParticlePanel(AppShell): segName = repr(len(self.rendererSegmentWidgetList))+':Linear' self.rendererSegmentWidgetList.append( self.createLinearInterpolationSegmentWidget(parent, segName, seg)) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def addStepwaveInterpolationSegment(self, id = None): ren = self.particles.getRenderer() @@ -2115,7 +2146,7 @@ class ParticlePanel(AppShell): segName = repr(len(self.rendererSegmentWidgetList))+':Stepwave' self.rendererSegmentWidgetList.append( self.createStepwaveInterpolationSegmentWidget(parent, segName, seg)) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def addSinusoidInterpolationSegment(self, id = None): ren = self.particles.getRenderer() @@ -2135,7 +2166,7 @@ class ParticlePanel(AppShell): segName = repr(len(self.rendererSegmentWidgetList))+':Sinusoid' self.rendererSegmentWidgetList.append( self.createSinusoidInterpolationSegmentWidget(parent, segName, seg)) - parent.pack(fill=BOTH, expand=1) + parent.pack(fill=tk.BOTH, expand=1) def createWidgetForExistingInterpolationSegment(self, id): ren = self.particles.getRenderer() @@ -2154,8 +2185,8 @@ class ParticlePanel(AppShell): self.addConstantInterpolationSegment(id) def createInterpolationSegmentFrame(self, parent, segName, seg): - frame = Frame(parent, relief = RAISED, borderwidth = 2) - lFrame = Frame(frame, relief = FLAT) + frame = tk.Frame(parent, relief = tk.RAISED, borderwidth = 2) + lFrame = tk.Frame(frame, relief = tk.FLAT) def removeInterpolationSegmentFrame(s = self, seg = seg, fr = frame): s.particles.getRenderer().getColorInterpolationManager().clearSegment(seg.getId()) fr.pack_forget() @@ -2169,14 +2200,14 @@ class ParticlePanel(AppShell): seg.setTimeBegin(time) def setSegEnd(time): seg.setTimeEnd(time) - Button(lFrame, text = 'X', - command = removeInterpolationSegmentFrame).pack(side = RIGHT, expand = 0) - Label(lFrame, text = segName, - foreground = 'Blue', - font = ('MSSansSerif', 12, 'bold'), - ).pack(fill = X, expand = 1) - lFrame.pack(fill = X, expand = 1) - lFrame = Frame(frame, relief = FLAT) + tk.Button(lFrame, text = 'X', + command = removeInterpolationSegmentFrame).pack(side = tk.RIGHT, expand = 0) + tk.Label(lFrame, text = segName, + foreground = 'Blue', + font = ('MSSansSerif', 12, 'bold'), + ).pack(fill = tk.X, expand = 1) + lFrame.pack(fill = tk.X, expand = 1) + lFrame = tk.Frame(frame, relief = tk.FLAT) self.createCheckbutton( lFrame, 'Sprite Renderer', segName + ' Enabled', ('On: Enabled\n' + @@ -2187,9 +2218,9 @@ class ParticlePanel(AppShell): ('On: Modulate\n' + 'Off: Add'), command = setIsModulated, initialState = seg.isModulated()) - lFrame.pack(fill = X, expand = 1) + lFrame.pack(fill = tk.X, expand = 1) - f = Frame(frame) + f = tk.Frame(frame) self.createSlider(f, 'Sprite Renderer', segName + ' Begin', '', @@ -2199,8 +2230,8 @@ class ParticlePanel(AppShell): '', command = setSegEnd, value = seg.getTimeEnd()) - f.pack(fill = X, expand = 0) - frame.pack(pady = 3, fill = X, expand = 0) + f.pack(fill = tk.X, expand = 0) + frame.pack(pady = 3, fill = tk.X, expand = 0) return frame def createConstantInterpolationSegmentWidget(self, parent, segName, segment): @@ -2211,7 +2242,7 @@ class ParticlePanel(AppShell): color[2]/255.0, color[3]/255.0)) frame = self.createInterpolationSegmentFrame(parent, segName, segment) - f = Frame(frame) + f = tk.Frame(frame) c = fun.getColorA() c = [c[0]*255.0, c[1]*255.0, c[2]*255.0, c[3]*255.0] @@ -2219,7 +2250,7 @@ class ParticlePanel(AppShell): '', command = setSegColorA, value = c) - f.pack(fill = X) + f.pack(fill = tk.X) return frame def createLinearInterpolationSegmentWidget(self, parent, segName, segment): @@ -2234,7 +2265,7 @@ class ParticlePanel(AppShell): color[2]/255.0, color[3]/255.0)) frame = self.createInterpolationSegmentFrame(parent, segName, segment) - f = Frame(frame) + f = tk.Frame(frame) c = fun.getColorA() c = [c[0]*255.0, c[1]*255.0, c[2]*255.0, c[3]*255.0] @@ -2248,7 +2279,7 @@ class ParticlePanel(AppShell): '', command = setSegColorB, value = c) - f.pack(fill = X) + f.pack(fill = tk.X) return frame def createStepwaveInterpolationSegmentWidget(self, parent, segName, segment): @@ -2267,7 +2298,7 @@ class ParticlePanel(AppShell): fun.setWidthB(width) frame = self.createInterpolationSegmentFrame(parent, segName, segment) - f = Frame(frame) + f = tk.Frame(frame) c = fun.getColorA() c = [c[0]*255.0, c[1]*255.0, c[2]*255.0, c[3]*255.0] @@ -2291,7 +2322,7 @@ class ParticlePanel(AppShell): '', command = setWidthB, value = w) - f.pack(fill = X) + f.pack(fill = tk.X) return frame def createSinusoidInterpolationSegmentWidget(self, parent, segName, segment): @@ -2308,7 +2339,7 @@ class ParticlePanel(AppShell): fun.setPeriod(period) frame = self.createInterpolationSegmentFrame(parent, segName, segment) - f = Frame(frame) + f = tk.Frame(frame) c = fun.getColorA() c = [c[0]*255.0, c[1]*255.0, c[2]*255.0, c[3]*255.0] @@ -2327,17 +2358,17 @@ class ParticlePanel(AppShell): '', command = setPeriod, value = p) - f.pack(fill = X) + f.pack(fill = tk.X) return frame def createSpriteAnimationFrame(self, parent, anim, animName): ren = self.particles.getRenderer() pass - frame = Frame(parent, relief = RAISED, borderwidth = 2) - frame.pack(pady = 1, fill = X, expand = 0) + frame = tk.Frame(parent, relief = tk.RAISED, borderwidth = 2) + frame.pack(pady = 1, fill = tk.X, expand = 0) - lFrame = Frame(frame, relief = FLAT) - lFrame.pack(fill = X, expand = 1) + lFrame = tk.Frame(frame, relief = tk.FLAT) + lFrame.pack(fill = tk.X, expand = 1) def delete(s = self, fr = frame): i = s.rendererSpriteAnimationWidgetList.index(fr) @@ -2347,8 +2378,8 @@ class ParticlePanel(AppShell): s.writeSpriteRendererAnimations() s.readSpriteRendererAnimations() - Button(lFrame, text = 'X', foreground = 'Red', font = ('MSSansSerif', 8, 'bold'), - command = delete).pack(side = RIGHT, expand = 0) + tk.Button(lFrame, text = 'X', foreground = 'Red', font = ('MSSansSerif', 8, 'bold'), + command = delete).pack(side = tk.RIGHT, expand = 0) if anim == SpriteAnim.STTexture or anim == SpriteAnim.STFromNode: frame.valid = False @@ -2367,22 +2398,22 @@ class ParticlePanel(AppShell): frame.animSourceType = SpriteAnim.STFromNode type = 'From Node' - Label(lFrame, text = animName+': '+type, - foreground = 'Blue', - font = ('MSSansSerif', 12, 'bold'), - ).pack(fill = X, expand = 1) + tk.Label(lFrame, text = animName+': '+type, + foreground = 'Blue', + font = ('MSSansSerif', 12, 'bold'), + ).pack(fill = tk.X, expand = 1) return frame def createSpriteAnimationTextureWidget(self, parent, anim, animName): ren = self.particles.getRenderer() frame = self.createSpriteAnimationFrame(parent, anim, animName) - f = Frame(frame) - f.pack(fill=X) + f = tk.Frame(frame) + f.pack(fill=tk.X) - Label(f, text = 'Texture: ', font = ('MSSansSerif', 12), width=7).pack(side = LEFT) - strVar = StringVar() - entry = Entry(f, textvariable = strVar).pack(padx=3, pady=3, side=LEFT, fill=X, expand=1) + tk.Label(f, text = 'Texture: ', font = ('MSSansSerif', 12), width=7).pack(side = tk.LEFT) + strVar = tk.StringVar() + entry = tk.Entry(f, textvariable = strVar).pack(padx=3, pady=3, side=tk.LEFT, fill=tk.X, expand=1) if frame.valid: strVar.set(anim.getTexSource()) else: @@ -2396,8 +2427,8 @@ class ParticlePanel(AppShell): frame.valid = False self.writeSpriteRendererAnimations() - Button(f, text = 'Update', - command = checkForTexture).pack(side=LEFT) + tk.Button(f, text = 'Update', + command = checkForTexture).pack(side=tk.LEFT) self.variableDict['Sprite Renderer-'+animName+' Anim Texture'] = strVar self.widgetDict['Sprite Renderer-'+animName+' Anim Texture'] = entry @@ -2406,14 +2437,14 @@ class ParticlePanel(AppShell): def createSpriteAnimationNodeWidget(self, parent, anim, animName): ren = self.particles.getRenderer() frame = self.createSpriteAnimationFrame(parent, anim, animName) - f = Frame(frame) - f.pack(fill=X) + f = tk.Frame(frame) + f.pack(fill=tk.X) - lf = Frame(f) - lf.pack(fill=X, expand=1) - Label(lf, text = 'Model: ', font = ('MSSansSerif', 12), width=7).pack(side = LEFT) - mStrVar = StringVar() - entry = Entry(lf, textvariable = mStrVar).pack(padx=3, pady=3, side=LEFT, fill=X, expand=1) + lf = tk.Frame(f) + lf.pack(fill=tk.X, expand=1) + tk.Label(lf, text = 'Model: ', font = ('MSSansSerif', 12), width=7).pack(side = tk.LEFT) + mStrVar = tk.StringVar() + entry = tk.Entry(lf, textvariable = mStrVar).pack(padx=3, pady=3, side=tk.LEFT, fill=tk.X, expand=1) if frame.valid: mStrVar.set(anim.getModelSource()) else: @@ -2424,11 +2455,11 @@ class ParticlePanel(AppShell): self.variableDict['Sprite Renderer-'+animName+' Anim Model'] = mStrVar self.widgetDict['Sprite Renderer-'+animName+' Anim Model'] = entry - lf = Frame(f) - lf.pack(fill=X, expand=1) - Label(lf, text = 'Node: ', font = ('MSSansSerif', 12), width=7).pack(side = LEFT) - nStrVar = StringVar() - entry = Entry(lf, textvariable = nStrVar).pack(padx=3, pady=3, side=LEFT, fill=X, expand=1) + lf = tk.Frame(f) + lf.pack(fill=tk.X, expand=1) + tk.Label(lf, text = 'Node: ', font = ('MSSansSerif', 12), width=7).pack(side = tk.LEFT) + nStrVar = tk.StringVar() + entry = tk.Entry(lf, textvariable = nStrVar).pack(padx=3, pady=3, side=tk.LEFT, fill=tk.X, expand=1) if frame.valid: nStrVar.set(anim.getNodeSource()) else: @@ -2451,10 +2482,10 @@ class ParticlePanel(AppShell): self.writeSpriteRendererAnimations() - Button(mlf, text = 'Update', - command = checkForNode).pack(side=LEFT) - Button(nlf, text = 'Update', - command = checkForNode).pack(side=LEFT) + tk.Button(mlf, text = 'Update', + command = checkForNode).pack(side=tk.LEFT) + tk.Button(nlf, text = 'Update', + command = checkForNode).pack(side=tk.LEFT) return frame @@ -2498,7 +2529,7 @@ class ParticlePanel(AppShell): def updateForceWidgets(self): # Select appropriate notebook page if self.forceGroup is not None: - self.forceGroupNotebook.pack(fill = X) + self.forceGroupNotebook.pack(fill = tk.X) self.forcePageName = (self.particleEffect.getName() + '-' + self.forceGroup.getName()) self.forcePage = self.forcePagesDict.get( @@ -2618,18 +2649,18 @@ class ParticlePanel(AppShell): self.forceGroupNotebook.setnaturalsize() def createForceFrame(self, forcePage, forceName, force): - frame = Frame(forcePage, relief = RAISED, borderwidth = 2) - lFrame = Frame(frame, relief = FLAT) + frame = tk.Frame(forcePage, relief = tk.RAISED, borderwidth = 2) + lFrame = tk.Frame(frame, relief = tk.FLAT) def removeForce(s = self, f = force, fr = frame): s.forceGroup.removeForce(f) fr.pack_forget() - b = Button(lFrame, text = 'X', - command = removeForce) + b = tk.Button(lFrame, text = 'X', + command = removeForce) b.pack(side = 'right', expand = 0) - Label(lFrame, text = forceName, - foreground = 'Blue', - font=('MSSansSerif', 12, 'bold'), - ).pack(expand = 1, fill = 'x') + tk.Label(lFrame, text = forceName, + foreground = 'Blue', + font=('MSSansSerif', 12, 'bold'), + ).pack(expand = 1, fill = 'x') lFrame.pack(fill = 'x', expand =1) frame.pack(pady = 3, fill = 'x', expand =0) return frame @@ -2649,7 +2680,7 @@ class ParticlePanel(AppShell): 'Force amplitude multiplier', command = setAmplitude, value = force.getAmplitude()) - cbf = Frame(frame, relief = FLAT) + cbf = tk.Frame(frame, relief = tk.FLAT) self.createCheckbutton(cbf, pageName, forceName + ' Mass Dependent', ('On: force depends on mass; ' + 'Off: force does not depend on mass'), diff --git a/direct/src/tkpanels/Placer.py b/direct/src/tkpanels/Placer.py index b9bc8add04..2f1fc4eb63 100644 --- a/direct/src/tkpanels/Placer.py +++ b/direct/src/tkpanels/Placer.py @@ -3,13 +3,13 @@ __all__ = ['Placer', 'place'] # Import Tkinter, Pmw, and the dial code from this directory tree. -from panda3d.core import * -from direct.showbase.TkGlobal import * -from direct.tkwidgets.AppShell import * +from panda3d.core import NodePath, Vec3 +from direct.tkwidgets.AppShell import AppShell from direct.tkwidgets import Dial from direct.tkwidgets import Floater from direct.directtools.DirectGlobals import ZERO_VEC, UNIT_VEC import Pmw +import tkinter as tk """ TODO: @@ -84,7 +84,7 @@ class Placer(AppShell): def createInterface(self): # The interior of the toplevel panel interior = self.interior() - interior['relief'] = FLAT + interior['relief'] = tk.FLAT # Add placer commands to menubar self.menuBar.addmenu('Placer', 'Placer Panel Operations') self.menuBar.addmenuitem('Placer', 'command', @@ -113,7 +113,7 @@ class Placer(AppShell): # Get a handle to the menu frame menuFrame = self.menuFrame self.nodePathMenu = Pmw.ComboBox( - menuFrame, labelpos = W, label_text = 'Node Path:', + menuFrame, labelpos = tk.W, label_text = 'Node Path:', entry_width = 20, selectioncommand = self.selectNodePathNamed, scrolledlist_items = self.nodePathNames) @@ -144,8 +144,8 @@ class Placer(AppShell): self.refNodePathMenu.pack(side = 'left', fill = 'x', expand = 1) self.bind(self.refNodePathMenu, 'Select relative node path') - self.undoButton = Button(menuFrame, text = 'Undo', - command = base.direct.undo) + self.undoButton = tk.Button(menuFrame, text = 'Undo', + command = base.direct.undo) if base.direct.undoList: self.undoButton['state'] = 'normal' else: @@ -153,8 +153,8 @@ class Placer(AppShell): self.undoButton.pack(side = 'left', expand = 0) self.bind(self.undoButton, 'Undo last operation') - self.redoButton = Button(menuFrame, text = 'Redo', - command = base.direct.redo) + self.redoButton = tk.Button(menuFrame, text = 'Redo', + command = base.direct.redo) if base.direct.redoList: self.redoButton['state'] = 'normal' else: @@ -164,14 +164,14 @@ class Placer(AppShell): # Create and pack the Pos Controls posGroup = Pmw.Group(interior, - tag_pyclass = Menubutton, + tag_pyclass = tk.Menubutton, tag_text = 'Position', tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', - ring_relief = RIDGE) + ring_relief = tk.RIDGE) posMenubutton = posGroup.component('tag') self.bind(posMenubutton, 'Position menu operations') - posMenu = Menu(posMenubutton, tearoff = 0) + posMenu = tk.Menu(posMenubutton, tearoff = 0) posMenu.add_command(label = 'Set to zero', command = self.zeroPos) posMenu.add_command(label = 'Reset initial', command = self.resetPos) @@ -182,7 +182,7 @@ class Placer(AppShell): # Create the dials self.posX = self.createcomponent('posX', (), None, Floater.Floater, (posInterior,), - text = 'X', relief = FLAT, + text = 'X', relief = tk.FLAT, value = 0.0, label_foreground = 'Red') self.posX['commandData'] = ['x'] @@ -193,7 +193,7 @@ class Placer(AppShell): self.posY = self.createcomponent('posY', (), None, Floater.Floater, (posInterior,), - text = 'Y', relief = FLAT, + text = 'Y', relief = tk.FLAT, value = 0.0, label_foreground = '#00A000') self.posY['commandData'] = ['y'] @@ -204,7 +204,7 @@ class Placer(AppShell): self.posZ = self.createcomponent('posZ', (), None, Floater.Floater, (posInterior,), - text = 'Z', relief = FLAT, + text = 'Z', relief = tk.FLAT, value = 0.0, label_foreground = 'Blue') self.posZ['commandData'] = ['z'] @@ -215,14 +215,14 @@ class Placer(AppShell): # Create and pack the Hpr Controls hprGroup = Pmw.Group(interior, - tag_pyclass = Menubutton, + tag_pyclass = tk.Menubutton, tag_text = 'Orientation', tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', - ring_relief = RIDGE) + ring_relief = tk.RIDGE) hprMenubutton = hprGroup.component('tag') self.bind(hprMenubutton, 'Orientation menu operations') - hprMenu = Menu(hprMenubutton, tearoff = 0) + hprMenu = tk.Menu(hprMenubutton, tearoff = 0) hprMenu.add_command(label = 'Set to zero', command = self.zeroHpr) hprMenu.add_command(label = 'Reset initial', command = self.resetHpr) hprMenubutton['menu'] = hprMenu @@ -234,7 +234,7 @@ class Placer(AppShell): Dial.AngleDial, (hprInterior,), style = 'mini', text = 'H', value = 0.0, - relief = FLAT, + relief = tk.FLAT, label_foreground = 'blue') self.hprH['commandData'] = ['h'] self.hprH['preCallback'] = self.xformStart @@ -246,7 +246,7 @@ class Placer(AppShell): Dial.AngleDial, (hprInterior,), style = 'mini', text = 'P', value = 0.0, - relief = FLAT, + relief = tk.FLAT, label_foreground = 'red') self.hprP['commandData'] = ['p'] self.hprP['preCallback'] = self.xformStart @@ -258,7 +258,7 @@ class Placer(AppShell): Dial.AngleDial, (hprInterior,), style = 'mini', text = 'R', value = 0.0, - relief = FLAT, + relief = tk.FLAT, label_foreground = '#00A000') self.hprR['commandData'] = ['r'] self.hprR['preCallback'] = self.xformStart @@ -268,21 +268,21 @@ class Placer(AppShell): # Create and pack the Scale Controls # The available scaling modes - self.scalingMode = StringVar() + self.scalingMode = tk.StringVar() self.scalingMode.set('Scale Uniform') # The scaling widgets scaleGroup = Pmw.Group(interior, tag_text = 'Scale Uniform', - tag_pyclass = Menubutton, + tag_pyclass = tk.Menubutton, tag_font=('MSSansSerif', 14), tag_activebackground = '#909090', - ring_relief = RIDGE) + ring_relief = tk.RIDGE) self.scaleMenubutton = scaleGroup.component('tag') self.bind(self.scaleMenubutton, 'Scale menu operations') self.scaleMenubutton['textvariable'] = self.scalingMode # Scaling menu - scaleMenu = Menu(self.scaleMenubutton, tearoff = 0) + scaleMenu = tk.Menu(self.scaleMenubutton, tearoff = 0) scaleMenu.add_command(label = 'Set to unity', command = self.unitScale) scaleMenu.add_command(label = 'Reset initial', @@ -302,7 +302,7 @@ class Placer(AppShell): self.scaleX = self.createcomponent('scaleX', (), None, Floater.Floater, (scaleInterior,), text = 'X Scale', - relief = FLAT, + relief = tk.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = 'Red') @@ -315,7 +315,7 @@ class Placer(AppShell): self.scaleY = self.createcomponent('scaleY', (), None, Floater.Floater, (scaleInterior,), text = 'Y Scale', - relief = FLAT, + relief = tk.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = '#00A000') @@ -328,7 +328,7 @@ class Placer(AppShell): self.scaleZ = self.createcomponent('scaleZ', (), None, Floater.Floater, (scaleInterior,), text = 'Z Scale', - relief = FLAT, + relief = tk.FLAT, min = 0.0001, value = 1.0, resetValue = 1.0, label_foreground = 'Blue') diff --git a/direct/src/tkpanels/TaskManagerPanel.py b/direct/src/tkpanels/TaskManagerPanel.py index d83c825f59..f52dc5a205 100644 --- a/direct/src/tkpanels/TaskManagerPanel.py +++ b/direct/src/tkpanels/TaskManagerPanel.py @@ -2,10 +2,10 @@ __all__ = ['TaskManagerPanel', 'TaskManagerWidget'] -from direct.tkwidgets.AppShell import * +from direct.tkwidgets.AppShell import AppShell from direct.showbase.DirectObject import DirectObject import Pmw -from tkinter import * +import tkinter as tk from tkinter.messagebox import askokcancel @@ -67,15 +67,15 @@ class TaskManagerWidget(DirectObject): # Create a listbox self.taskListBox = Pmw.ScrolledListBox( parent, - labelpos = NW, label_text = 'Tasks:', + labelpos = tk.NW, label_text = 'Tasks:', label_font=('MSSansSerif', 10, 'bold'), listbox_takefocus = 1, items = [], selectioncommand = self.setCurrentTask) - self.taskListBox.pack(expand = 1, fill = BOTH) + self.taskListBox.pack(expand = 1, fill = tk.BOTH) - self._popupMenu = Menu(self.taskListBox.component('listbox'), - tearoff = 0) + self._popupMenu = tk.Menu(self.taskListBox.component('listbox'), + tearoff = 0) self._popupMenu.add_command( label = 'Remove Task', command = self.removeCurrentTask) @@ -84,34 +84,34 @@ class TaskManagerWidget(DirectObject): command = self.removeMatchingTasks) # Controls Frame - controlsFrame = Frame(parent) - self.removeButton = Button(controlsFrame, text = 'Remove Task', - command = self.removeCurrentTask) - #self.removeButton.pack(expand = 1, fill = X, side = LEFT) - self.removeButton.grid(row = 0, column = 0, sticky = EW) - self.removeMatchingButton = Button(controlsFrame, - text = 'Remove Matching Tasks', - command = self.removeMatchingTasks) - #self.removeMatchingButton.pack(expand = 1, fill = X, side = LEFT) - self.removeMatchingButton.grid(row = 0, column = 1, sticky = EW) + controlsFrame = tk.Frame(parent) + self.removeButton = tk.Button(controlsFrame, text = 'Remove Task', + command = self.removeCurrentTask) + #self.removeButton.pack(expand = 1, fill = tk.X, side = LEFT) + self.removeButton.grid(row = 0, column = 0, sticky = tk.EW) + self.removeMatchingButton = tk.Button(controlsFrame, + text = 'Remove Matching Tasks', + command = self.removeMatchingTasks) + #self.removeMatchingButton.pack(expand = 1, fill = tk.X, side = LEFT) + self.removeMatchingButton.grid(row = 0, column = 1, sticky = tk.EW) - self.taskMgrVerbose = IntVar() + self.taskMgrVerbose = tk.IntVar() self.taskMgrVerbose.set(0) - self.update = Button( + self.update = tk.Button( controlsFrame, text = 'Update', command = self.updateTaskListBox) - #self.update.pack(expand = 1, fill = X, side = LEFT) - self.update.grid(row = 1, column = 0, sticky = EW) - self.dynamicUpdate = Checkbutton( + #self.update.pack(expand = 1, fill = tk.X, side = LEFT) + self.update.grid(row = 1, column = 0, sticky = tk.EW) + self.dynamicUpdate = tk.Checkbutton( controlsFrame, text = 'Dynamic Update', variable = self.taskMgrVerbose, command = self.toggleTaskMgrVerbose) - #self.dynamicUpdate.pack(expand = 1, fill = X, side = LEFT) - self.dynamicUpdate.grid(row = 1, column = 1, sticky = EW) + #self.dynamicUpdate.pack(expand = 1, fill = tk.X, side = LEFT) + self.dynamicUpdate.grid(row = 1, column = 1, sticky = tk.EW) # Pack frames - controlsFrame.pack(fill = X) + controlsFrame.pack(fill = tk.X) controlsFrame.grid_columnconfigure(0, weight = 1) controlsFrame.grid_columnconfigure(1, weight = 1) diff --git a/direct/src/tkwidgets/AppShell.py b/direct/src/tkwidgets/AppShell.py index 4307c344a1..1db5463852 100644 --- a/direct/src/tkwidgets/AppShell.py +++ b/direct/src/tkwidgets/AppShell.py @@ -8,15 +8,14 @@ created by Doug Hellmann (doughellmann@mindspring.com). __all__ = ['AppShell'] from direct.showbase.DirectObject import DirectObject -from direct.showbase.TkGlobal import * from . import Dial from . import Floater from . import Slider from . import EntryScale from . import VectorWidgets from . import ProgressBar -from tkinter.filedialog import * import Pmw +import tkinter as tk # Create toplevel widget dictionary @@ -68,7 +67,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): self.defineoptions(kw, optiondefs) # If no toplevel passed in, create one if parent is None: - self.parent = Toplevel() + self.parent = tk.Toplevel() else: self.parent = parent # Initialize the base class @@ -94,7 +93,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): # initialize our options self.initialiseoptions(AppShell) - self.pack(fill = BOTH, expand = 1) + self.pack(fill = tk.BOTH, expand = 1) def __createInterface(self): self.__createBalloon() @@ -120,50 +119,50 @@ class AppShell(Pmw.MegaWidget, DirectObject): self.__balloon.configure(state = self.balloonState) def __createMenuBar(self): - self.menuFrame = Frame(self._hull) + self.menuFrame = tk.Frame(self._hull) self.menuBar = self.createcomponent('menubar', (), None, Pmw.MenuBar, (self.menuFrame,), - hull_relief=FLAT, + hull_relief=tk.FLAT, hull_borderwidth=0, balloon=self.balloon()) self.menuBar.addmenu('Help', 'About %s' % self.appname, side = 'right') self.menuBar.addmenu('File', 'File commands and Quit') - self.menuBar.pack(fill=X, side = LEFT) + self.menuBar.pack(fill=tk.X, side = tk.LEFT) # Force some space between pull down menus and other widgets - spacer = Label(self.menuFrame, text = ' ') - spacer.pack(side = LEFT, expand = 0) + spacer = tk.Label(self.menuFrame, text = ' ') + spacer.pack(side = tk.LEFT, expand = 0) - self.menuFrame.pack(fill = X) + self.menuFrame.pack(fill = tk.X) def __createDataArea(self): # Create data area where data entry widgets are placed. self.dataArea = self.createcomponent('dataarea', (), None, - Frame, (self._hull,), - relief=GROOVE, + tk.Frame, (self._hull,), + relief=tk.GROOVE, bd=1) - self.dataArea.pack(side=TOP, fill=BOTH, expand=YES, + self.dataArea.pack(side=tk.TOP, fill=tk.BOTH, expand=tk.YES, padx=self['padx'], pady=self['pady']) def __createCommandArea(self): # Create a command area for application-wide buttons. self.__commandFrame = self.createcomponent('commandframe', (), None, - Frame, + tk.Frame, (self._hull,), - relief=SUNKEN, + relief=tk.SUNKEN, bd=1) self.__buttonBox = self.createcomponent('buttonbox', (), None, Pmw.ButtonBox, (self.__commandFrame,), padx=0, pady=0) - self.__buttonBox.pack(side=TOP, expand=NO, fill=X) + self.__buttonBox.pack(side=tk.TOP, expand=tk.NO, fill=tk.X) if self['usecommandarea']: - self.__commandFrame.pack(side=TOP, - expand=NO, - fill=X, + self.__commandFrame.pack(side=tk.TOP, + expand=tk.NO, + fill=tk.X, padx=self['padx'], pady=self['pady']) @@ -171,27 +170,27 @@ class AppShell(Pmw.MegaWidget, DirectObject): def __createMessageBar(self): # Create the message bar area for help and status messages. frame = self.createcomponent('bottomtray', (), None, - Frame, (self._hull,), relief=SUNKEN) + tk.Frame, (self._hull,), relief=tk.SUNKEN) self.__messageBar = self.createcomponent('messagebar', (), None, Pmw.MessageBar, (frame,), #entry_width = 40, - entry_relief=SUNKEN, + entry_relief=tk.SUNKEN, entry_bd=1, labelpos=None) - self.__messageBar.pack(side=LEFT, expand=YES, fill=X) + self.__messageBar.pack(side=tk.LEFT, expand=tk.YES, fill=tk.X) self.__progressBar = ProgressBar.ProgressBar( frame, fillColor='slateblue', doLabel=1, width=150) - self.__progressBar.frame.pack(side=LEFT, expand=NO, fill=NONE) + self.__progressBar.frame.pack(side=tk.LEFT, expand=tk.NO, fill=tk.NONE) self.updateProgress(0) if self['usestatusarea']: - frame.pack(side=BOTTOM, expand=NO, fill=X) + frame.pack(side=tk.BOTTOM, expand=tk.NO, fill=tk.X) self.__balloon.configure(statuscommand = \ self.__messageBar.helpmessage) @@ -241,7 +240,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): self.menuBar.addmenuitem('Help', 'command', 'Get information on application', label='About...', command=self.showAbout) - self.toggleBalloonVar = IntVar() + self.toggleBalloonVar = tk.IntVar() if self.balloonState == 'none': self.toggleBalloonVar.set(0) else: @@ -326,19 +325,19 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateLabeledEntry(self, parent, category, text, help = '', command = None, value = '', - width = 12, relief = SUNKEN, - side = LEFT, fill = X, expand = 0): + width = 12, relief = tk.SUNKEN, + side = tk.LEFT, fill = tk.X, expand = 0): """ createLabeledEntry(parent, category, text, [options]) """ # Create labeled entry - frame = Frame(parent) - variable = StringVar() + frame = tk.Frame(parent) + variable = tk.StringVar() variable.set(value) - label = Label(frame, text = text) - label.pack(side = LEFT, fill = X, expand = 0) - entry = Entry(frame, width = width, relief = relief, - textvariable = variable) - entry.pack(side = LEFT, fill = X, expand = 1) - frame.pack(side = side, fill = X, expand = expand) + label = tk.Label(frame, text = text) + label.pack(side = tk.LEFT, fill = tk.X, expand = 0) + entry = tk.Entry(frame, width = width, relief = relief, + textvariable = variable) + entry.pack(side = tk.LEFT, fill = tk.X, expand = 1) + frame.pack(side = side, fill = tk.X, expand = expand) if command: entry.bind('', command) # Add balloon help @@ -352,37 +351,37 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateButton(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): """ createButton(parent, category, text, [options]) """ # Create the widget - widget = self.createWidget(parent, category, text, Button, + widget = self.createWidget(parent, category, text, tk.Button, help, command, side, fill, expand, kw) return widget def newCreateCheckbutton(self, parent, category, text, help = '', command = None, - initialState = 0, anchor = W, - side = LEFT, fill = X, expand = 0, **kw): + initialState = 0, anchor = tk.W, + side = tk.LEFT, fill = tk.X, expand = 0, **kw): """ createCheckbutton(parent, category, text, [options]) """ # Create the widget - widget = self.createWidget(parent, category, text, Checkbutton, + widget = self.createWidget(parent, category, text, tk.Checkbutton, help, command, side, fill, expand, kw) # Perform extra customization widget['anchor'] = anchor - variable = BooleanVar() + variable = tk.BooleanVar() variable.set(initialState) self.addVariable(category, text, variable) widget['variable'] = variable return widget def newCreateRadiobutton(self, parent, category, text, variable, value, - command = None, help = '', anchor = W, - side = LEFT, fill = X, expand = 0, **kw): + command = None, help = '', anchor = tk.W, + side = tk.LEFT, fill = tk.X, expand = 0, **kw): """ createRadiobutton(parent, category, text, variable, value, [options]) """ # Create the widget - widget = self.createWidget(parent, category, text, Radiobutton, + widget = self.createWidget(parent, category, text, tk.Radiobutton, help, command, side, fill, expand, kw) # Perform extra customization widget['anchor'] = anchor @@ -392,7 +391,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateFloater(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, Floater.Floater, @@ -401,7 +400,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateDial(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, Dial.Dial, @@ -410,7 +409,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateSider(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, Slider.Slider, @@ -419,7 +418,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateEntryScale(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, EntryScale.EntryScale, @@ -428,7 +427,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateVector2Entry(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, VectorWidgets.Vector2Entry, @@ -436,7 +435,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateVector3Entry(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, VectorWidgets.Vector3Entry, @@ -445,7 +444,7 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateColorEntry(self, parent, category, text, help = '', command = None, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create the widget widget = self.createWidget(parent, category, text, VectorWidgets.ColorEntry, @@ -454,11 +453,11 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateOptionMenu(self, parent, category, text, help = '', command = None, items = [], - labelpos = W, label_anchor = W, + labelpos = tk.W, label_anchor = tk.W, label_width = 16, menu_tearoff = 1, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Create variable - variable = StringVar() + variable = tk.StringVar() if len(items) > 0: variable.set(items[0]) # Update kw to reflect user inputs @@ -484,10 +483,10 @@ class AppShell(Pmw.MegaWidget, DirectObject): def newCreateComboBox(self, parent, category, text, help = '', command = None, - items = [], state = DISABLED, history = 0, - labelpos = W, label_anchor = W, + items = [], state = tk.DISABLED, history = 0, + labelpos = tk.W, label_anchor = tk.W, label_width = 16, entry_width = 16, - side = LEFT, fill = X, expand = 0, **kw): + side = tk.LEFT, fill = tk.X, expand = 0, **kw): # Update kw to reflect user inputs kw['label_text'] = text kw['labelpos'] = labelpos @@ -540,7 +539,7 @@ class TestAppShell(AppShell): def createMain(self): self.label = self.createcomponent('label', (), None, - Label, + tk.Label, (self.interior(),), text='Data Area') self.label.pack() diff --git a/direct/src/tkwidgets/Dial.py b/direct/src/tkwidgets/Dial.py index a67730636c..bc3474d73e 100644 --- a/direct/src/tkwidgets/Dial.py +++ b/direct/src/tkwidgets/Dial.py @@ -5,13 +5,13 @@ Dial Class: Velocity style controller for floating point values with __all__ = ['Dial', 'AngleDial', 'DialWidget'] -from direct.showbase.TkGlobal import * from .Valuator import Valuator, VALUATOR_MINI, VALUATOR_FULL from direct.task import Task from panda3d.core import ClockObject import math import operator import Pmw +import tkinter as tk TWO_PI = 2.0 * math.pi ONEPOINTFIVE_PI = 1.5 * math.pi @@ -56,13 +56,13 @@ class Dial(Valuator): self._valuator.grid(rowspan = 2, columnspan = 2, padx = 2, pady = 2) if self._label: - self._label.grid(row = 0, column = 2, sticky = EW) - self._entry.grid(row = 1, column = 2, sticky = EW) + self._label.grid(row = 0, column = 2, sticky = tk.EW) + self._entry.grid(row = 1, column = 2, sticky = tk.EW) self.interior().columnconfigure(2, weight = 1) else: if self._label: - self._label.grid(row=0, column=0, sticky = EW) - self._entry.grid(row=0, column=1, sticky = EW) + self._label.grid(row=0, column=0, sticky = tk.EW) + self._entry.grid(row=0, column=1, sticky = tk.EW) self._valuator.grid(row=0, column=2, padx = 2, pady = 2) self.interior().columnconfigure(0, weight = 1) @@ -85,12 +85,12 @@ class Dial(Valuator): def addValuatorMenuEntries(self): # The popup menu - self._fSnap = IntVar() + self._fSnap = tk.IntVar() self._fSnap.set(self['fSnap']) self._popupMenu.add_checkbutton(label = 'Snap', variable = self._fSnap, command = self._setSnap) - self._fRollover = IntVar() + self._fRollover = tk.IntVar() self._fRollover.set(self['fRollover']) if self['fAdjustable']: self._popupMenu.add_checkbutton(label = 'Rollover', @@ -153,7 +153,7 @@ class DialWidget(Pmw.MegaWidget): # Appearance ('style', VALUATOR_FULL, INITOPT), ('size', None, INITOPT), - ('relief', SUNKEN, self.setRelief), + ('relief', tk.SUNKEN, self.setRelief), ('borderwidth', 2, self.setBorderwidth), ('background', 'white', self.setBackground), # Number of segments the dial is divided into @@ -210,13 +210,13 @@ class DialWidget(Pmw.MegaWidget): # The canvas self._widget = self.createcomponent('canvas', (), None, - Canvas, (interior,), + tk.Canvas, (interior,), width = size, height = size, background = self['background'], highlightthickness = 0, scrollregion = (-radius, -radius, radius, radius)) - self._widget.pack(expand = 1, fill = BOTH) + self._widget.pack(expand = 1, fill = tk.BOTH) # The dial face (no outline/fill, primarily for binding mouse events) self._widget.create_oval(-radius, -radius, radius, radius, @@ -422,7 +422,7 @@ class DialWidget(Pmw.MegaWidget): if __name__ == '__main__': - tl = Toplevel() + tl = tk.Toplevel() d = Dial(tl) d2 = Dial(tl, dial_numSegments = 12, max = 360, dial_fRollover = 0, value = 180) @@ -430,7 +430,7 @@ if __name__ == '__main__': dial_fRollover = 0) d4 = Dial(tl, dial_numSegments = 16, max = 256, dial_fRollover = 0) - d.pack(expand = 1, fill = X) - d2.pack(expand = 1, fill = X) - d3.pack(expand = 1, fill = X) - d4.pack(expand = 1, fill = X) + d.pack(expand = 1, fill = tk.X) + d2.pack(expand = 1, fill = tk.X) + d3.pack(expand = 1, fill = tk.X) + d4.pack(expand = 1, fill = tk.X) diff --git a/direct/src/tkwidgets/EntryScale.py b/direct/src/tkwidgets/EntryScale.py index ced74f8eeb..987bcc3b29 100644 --- a/direct/src/tkwidgets/EntryScale.py +++ b/direct/src/tkwidgets/EntryScale.py @@ -4,10 +4,10 @@ EntryScale Class: Scale with a label, and a linked and validated entry __all__ = ['EntryScale', 'EntryScaleGroup'] -from direct.showbase.TkGlobal import * from panda3d.core import Vec4 import Pmw -from tkinter.simpledialog import * +import tkinter as tk +from tkinter.simpledialog import askfloat, askstring from tkinter.colorchooser import askcolor @@ -44,13 +44,13 @@ class EntryScale(Pmw.MegaWidget): # Setup up container interior = self.interior() - interior.configure(relief = GROOVE, borderwidth = 2) + interior.configure(relief = tk.GROOVE, borderwidth = 2) # Create a label and an entry self.labelFrame = self.createcomponent('frame', (), None, - Frame, interior) + tk.Frame, interior) # Create an entry field to display and validate the entryScale's value - self.entryValue = StringVar() + self.entryValue = tk.StringVar() self.entryValue.set(self['value']) self.entry = self.createcomponent('entryField', # Access widget's entry using "entry" @@ -70,7 +70,7 @@ class EntryScale(Pmw.MegaWidget): # Create the EntryScale's label self.label = self.createcomponent('label', (), None, - Label, self.labelFrame, + tk.Label, self.labelFrame, text = self['text'], width = 12, anchor = 'center', @@ -83,21 +83,21 @@ class EntryScale(Pmw.MegaWidget): # Create a label and an entry self.minMaxFrame = self.createcomponent('mmFrame', (), None, - Frame, interior) + tk.Frame, interior) # Create the EntryScale's min max labels self.minLabel = self.createcomponent('minLabel', (), None, - Label, self.minMaxFrame, + tk.Label, self.minMaxFrame, text = repr(self['min']), - relief = FLAT, + relief = tk.FLAT, width = 5, - anchor = W, + anchor = tk.W, font = "Arial 8") self.minLabel.pack(side='left', fill = 'x') self.minLabel.bind('', self.askForMin) # Create the scale component. self.scale = self.createcomponent('scale', (), None, - Scale, self.minMaxFrame, + tk.Scale, self.minMaxFrame, command = self._scaleCommand, orient = 'horizontal', length = 150, @@ -113,11 +113,11 @@ class EntryScale(Pmw.MegaWidget): self.scale.bind('', self.askForResolution) self.maxLabel = self.createcomponent('maxLabel', (), None, - Label, self.minMaxFrame, + tk.Label, self.minMaxFrame, text = repr(self['max']), - relief = FLAT, + relief = tk.FLAT, width = 5, - anchor = E, + anchor = tk.E, font = "Arial 8") self.maxLabel.bind('', self.askForMax) self.maxLabel.pack(side='left', fill = 'x') @@ -291,7 +291,7 @@ class EntryScaleGroup(Pmw.MegaToplevel): INITOPT = Pmw.INITOPT optiondefs = ( ('dim', DEFAULT_DIM, INITOPT), - ('side', TOP, INITOPT), + ('side', tk.TOP, INITOPT), ('title', 'Group', None), # A tuple of initial values, one for each entryScale ('value', DEFAULT_VALUE, INITOPT), @@ -319,7 +319,7 @@ class EntryScaleGroup(Pmw.MegaToplevel): menubar = self.createcomponent('menubar', (), None, Pmw.MenuBar, (interior,), balloon = self.balloon) - menubar.pack(fill=X) + menubar.pack(fill=tk.X) # EntryScaleGroup Menu menubar.addmenu('EntryScale Group', 'EntryScale Group Operations') @@ -336,7 +336,7 @@ class EntryScaleGroup(Pmw.MegaToplevel): label = 'Dismiss', command = dismissCommand) menubar.addmenu('Help', 'EntryScale Group Help Operations') - self.toggleBalloonVar = IntVar() + self.toggleBalloonVar = tk.IntVar() self.toggleBalloonVar.set(0) menubar.addmenuitem('Help', 'checkbutton', 'Toggle balloon help', @@ -360,7 +360,7 @@ class EntryScaleGroup(Pmw.MegaToplevel): f.onReturnRelease = self.__onReturnRelease f['preCallback'] = self.__onPress f['postCallback'] = self.__onRelease - f.pack(side = self['side'], expand = 1, fill = X) + f.pack(side = self['side'], expand = 1, fill = tk.X) self.entryScaleList.append(f) # Make sure entryScales are initialized @@ -528,7 +528,7 @@ def rgbPanel(nodePath, callback = None): ## SAMPLE CODE if __name__ == '__main__': # Initialise Tkinter and Pmw. - root = Toplevel() + root = tk.Toplevel() root.title('Pmw EntryScale demonstration') # Dummy command diff --git a/direct/src/tkwidgets/Floater.py b/direct/src/tkwidgets/Floater.py index 61a2d028e8..7291c8e372 100644 --- a/direct/src/tkwidgets/Floater.py +++ b/direct/src/tkwidgets/Floater.py @@ -5,12 +5,12 @@ Floater Class: Velocity style controller for floating point values with __all__ = ['Floater', 'FloaterWidget', 'FloaterGroup'] -from direct.showbase.TkGlobal import * from .Valuator import Valuator, VALUATOR_MINI, VALUATOR_FULL from direct.task import Task from panda3d.core import ClockObject import math import Pmw +import tkinter as tk FLOATER_WIDTH = 22 FLOATER_HEIGHT = 18 @@ -39,8 +39,8 @@ class Floater(Valuator): def packValuator(self): # Position components if self._label: - self._label.grid(row=0, column=0, sticky = EW) - self._entry.grid(row=0, column=1, sticky = EW) + self._label.grid(row=0, column=0, sticky = tk.EW) + self._entry.grid(row=0, column=1, sticky = tk.EW) self._valuator.grid(row=0, column=2, padx = 2, pady = 2) self.interior().columnconfigure(0, weight = 1) @@ -53,7 +53,7 @@ class FloaterWidget(Pmw.MegaWidget): # Appearance ('width', FLOATER_WIDTH, INITOPT), ('height', FLOATER_HEIGHT, INITOPT), - ('relief', RAISED, self.setRelief), + ('relief', tk.RAISED, self.setRelief), ('borderwidth', 2, self.setBorderwidth), ('background', 'grey75', self.setBackground), # Behavior @@ -86,7 +86,7 @@ class FloaterWidget(Pmw.MegaWidget): width = self['width'] height = self['height'] self._widget = self.createcomponent('canvas', (), None, - Canvas, (interior,), + tk.Canvas, (interior,), width = width, height = height, background = self['background'], @@ -95,7 +95,7 @@ class FloaterWidget(Pmw.MegaWidget): -height/2.0, width/2.0, height/2.0)) - self._widget.pack(expand = 1, fill = BOTH) + self._widget.pack(expand = 1, fill = tk.BOTH) # The floater icon self._widget.create_polygon(-width/2.0, 0, -2.0, -height/2.0, @@ -144,7 +144,7 @@ class FloaterWidget(Pmw.MegaWidget): def mouseDown(self, event): """ Begin mouse interaction """ # Exectute user redefinable callback function (if any) - self['relief'] = SUNKEN + self['relief'] = tk.SUNKEN if self['preCallback']: self['preCallback'](*self['callbackData']) self.velocitySF = 0.0 @@ -185,7 +185,7 @@ class FloaterWidget(Pmw.MegaWidget): # Execute user redefinable callback function (if any) if self['postCallback']: self['postCallback'](*self['callbackData']) - self['relief'] = RAISED + self['relief'] = tk.RAISED def setNumDigits(self): """ @@ -225,7 +225,7 @@ class FloaterGroup(Pmw.MegaToplevel): INITOPT = Pmw.INITOPT optiondefs = ( ('dim', DEFAULT_DIM, INITOPT), - ('side', TOP, INITOPT), + ('side', tk.TOP, INITOPT), ('title', 'Floater Group', None), # A tuple of initial values, one for each floater ('value', DEFAULT_VALUE, INITOPT), @@ -249,7 +249,7 @@ class FloaterGroup(Pmw.MegaToplevel): menubar = self.createcomponent('menubar', (), None, Pmw.MenuBar, (interior,), balloon = self.balloon) - menubar.pack(fill=X) + menubar.pack(fill=tk.X) # FloaterGroup Menu menubar.addmenu('Floater Group', 'Floater Group Operations') @@ -262,7 +262,7 @@ class FloaterGroup(Pmw.MegaToplevel): label = 'Dismiss', command = self.withdraw) menubar.addmenu('Help', 'Floater Group Help Operations') - self.toggleBalloonVar = IntVar() + self.toggleBalloonVar = tk.IntVar() self.toggleBalloonVar.set(0) menubar.addmenuitem('Help', 'checkbutton', 'Toggle balloon help', @@ -280,7 +280,7 @@ class FloaterGroup(Pmw.MegaToplevel): text = self['labels'][index]) # Do this separately so command doesn't get executed during construction f['command'] = lambda val, s=self, i=index: s._floaterSetAt(i, val) - f.pack(side = self['side'], expand = 1, fill = X) + f.pack(side = self['side'], expand = 1, fill = tk.X) self.floaterList.append(f) # Make sure floaters are initialized @@ -332,7 +332,7 @@ class FloaterGroup(Pmw.MegaToplevel): ## SAMPLE CODE if __name__ == '__main__': # Initialise Tkinter and Pmw. - root = Toplevel() + root = tk.Toplevel() root.title('Pmw Floater demonstration') # Dummy command diff --git a/direct/src/tkwidgets/MemoryExplorer.py b/direct/src/tkwidgets/MemoryExplorer.py index c2a29eed56..76998a21e4 100755 --- a/direct/src/tkwidgets/MemoryExplorer.py +++ b/direct/src/tkwidgets/MemoryExplorer.py @@ -1,7 +1,6 @@ from direct.showbase.DirectObject import DirectObject -from direct.showbase.TkGlobal import * -from .Tree import * import Pmw +import tkinter as tk #-------------------------------------------------------------------------- #-------------------------------------------------------------------------- @@ -46,23 +45,23 @@ class MemoryExplorer(Pmw.MegaWidget, DirectObject): hull_width = 200, hull_height = 220,) - self.frame.pack(padx = 3, pady = 3, fill = BOTH, expand = 1) + self.frame.pack(padx = 3, pady = 3, fill = tk.BOTH, expand = 1) def createScale(self): - self.scaleCtrl = Scale(self.interior(), - label = "Graph Scale", - from_= 0.0, - to = 20.0, - resolution = 0.1, - orient = HORIZONTAL, - command = self.onScaleUpdate) + self.scaleCtrl = tk.Scale(self.interior(), + label = "Graph Scale", + from_= 0.0, + to = 20.0, + resolution = 0.1, + orient = tk.HORIZONTAL, + command = self.onScaleUpdate) - self.scaleCtrl.pack(side = LEFT, fill = BOTH, expand = 1) + self.scaleCtrl.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1) self.scaleCtrl.set(0.0) def createRefreshBT(self): - self.refreshBT = Button(self.interior(), text = 'Refresh', command = self.refresh) - self.refreshBT.pack(side = LEFT, fill = BOTH, expand = 1) + self.refreshBT = tk.Button(self.interior(), text = 'Refresh', command = self.refresh) + self.refreshBT.pack(side = tk.LEFT, fill = tk.BOTH, expand = 1) #-------------------------------------------------------------------------- # Item Ctrls @@ -92,9 +91,9 @@ class MemoryExplorer(Pmw.MegaWidget, DirectObject): self.labels = [] def getNewButton(self, width, ratio): - newBT = Button(self.frame.interior(), - anchor = W, - width = width) + newBT = tk.Button(self.frame.interior(), + anchor = tk.W, + width = width) if ratio == 0.0: newBT['bg'] = "grey" @@ -144,7 +143,7 @@ class MemoryExplorer(Pmw.MegaWidget, DirectObject): bt.bind("", callbackL) bt.bind("", callbackR) - bt.pack(side = TOP, anchor = NW) + bt.pack(side = tk.TOP, anchor = tk.NW) self.buttons.append(bt) self.balloon.bind(bt, item.getPathName()) @@ -152,8 +151,8 @@ class MemoryExplorer(Pmw.MegaWidget, DirectObject): return bt def addLabel(self, label): - label = Label(self.frame.interior(), text = label) - label.pack(side = TOP, anchor = NW, expand = 0) + label = tk.Label(self.frame.interior(), text = label) + label.pack(side = tk.TOP, anchor = tk.NW, expand = 0) self.labels.append(label) def getBTWidth(self, vertexBytes, totalBytes): diff --git a/direct/src/tkwidgets/ProgressBar.py b/direct/src/tkwidgets/ProgressBar.py index 81b1d480b3..19cef00a26 100644 --- a/direct/src/tkwidgets/ProgressBar.py +++ b/direct/src/tkwidgets/ProgressBar.py @@ -4,7 +4,7 @@ A basic widget for showing the progress being made in a task. __all__ = ['ProgressBar'] -from direct.showbase.TkGlobal import * +import tkinter as tk class ProgressBar: @@ -30,9 +30,9 @@ class ProgressBar: self.labelText=labelText self.labelFormat=labelFormat self.value=value - self.frame=Frame(master, relief=appearance, bd=bd) - self.canvas=Canvas(self.frame, height=height, width=width, bd=0, - highlightthickness=0, background=background) + self.frame=tk.Frame(master, relief=appearance, bd=bd) + self.canvas=tk.Canvas(self.frame, height=height, width=width, bd=0, + highlightthickness=0, background=background) self.scale=self.canvas.create_rectangle(0, 0, width, height, fill=fillColor) self.label=self.canvas.create_text(self.canvas.winfo_reqwidth() / 2, diff --git a/direct/src/tkwidgets/SceneGraphExplorer.py b/direct/src/tkwidgets/SceneGraphExplorer.py index 256f226f46..6d15c98d9a 100644 --- a/direct/src/tkwidgets/SceneGraphExplorer.py +++ b/direct/src/tkwidgets/SceneGraphExplorer.py @@ -6,9 +6,9 @@ Requires Pmw.""" __all__ = ['SceneGraphExplorer', 'SceneGraphExplorerItem', 'explore'] from direct.showbase.DirectObject import DirectObject -from direct.showbase.TkGlobal import * -from .Tree import * +from .Tree import TreeItem, TreeNode import Pmw +import tkinter as tk # changing these strings requires changing DirectSession.py SGE_ strs too! DEFAULT_MENU_ITEMS = [ @@ -49,7 +49,7 @@ class SceneGraphExplorer(Pmw.MegaWidget, DirectObject): # Setup up container interior = self.interior() - interior.configure(relief = GROOVE, borderwidth = 2) + interior.configure(relief = tk.GROOVE, borderwidth = 2) # Create a label and an entry self._scrolledCanvas = self.createcomponent( @@ -61,7 +61,7 @@ class SceneGraphExplorer(Pmw.MegaWidget, DirectObject): self._canvas = self._scrolledCanvas.component('canvas') self._canvas['scrollregion'] = ('0i', '0i', '2i', '4i') self._scrolledCanvas.resizescrollregion() - self._scrolledCanvas.pack(padx = 3, pady = 3, expand=1, fill = BOTH) + self._scrolledCanvas.pack(padx = 3, pady = 3, expand=1, fill = tk.BOTH) self._canvas.bind('', self.mouse2Down) self._canvas.bind('', self.mouse2Motion) @@ -77,14 +77,14 @@ class SceneGraphExplorer(Pmw.MegaWidget, DirectObject): DEFAULT_MENU_ITEMS + self['menuItems']) self._node.expand() - self._parentFrame = Frame(interior) + self._parentFrame = tk.Frame(interior) self._label = self.createcomponent( 'parentLabel', (), None, - Label, (interior,), + tk.Label, (interior,), text = 'Active Reparent Target: ', - anchor = W, justify = LEFT) - self._label.pack(fill = X) + anchor = tk.W, justify = tk.LEFT) + self._label.pack(fill = tk.X) # Add update parent label def updateLabel(nodePath = None, s = self): @@ -197,7 +197,7 @@ def explore(nodePath = None): if nodePath is None: nodePath = base.render - tl = Toplevel() + tl = tk.Toplevel() tl.title('Explore: ' + nodePath.getName()) sge = SceneGraphExplorer(parent = tl, nodePath = nodePath) sge.pack(expand = 1, fill = 'both') diff --git a/direct/src/tkwidgets/Slider.py b/direct/src/tkwidgets/Slider.py index c397612f5b..1f9d9e5da4 100644 --- a/direct/src/tkwidgets/Slider.py +++ b/direct/src/tkwidgets/Slider.py @@ -5,9 +5,9 @@ Slider Class: Velocity style controller for floating point values with __all__ = ['Slider', 'SliderWidget', 'rgbPanel'] -from direct.showbase.TkGlobal import * from .Valuator import Valuator, rgbPanel, VALUATOR_MINI, VALUATOR_FULL import Pmw +import tkinter as tk class Slider(Valuator): """ @@ -56,15 +56,15 @@ class Slider(Valuator): def packValuator(self): if self['style'] == VALUATOR_FULL: if self._label: - self._label.grid(row = 0, column = 0, sticky = EW) - self._entry.grid(row = 0, column = 1, sticky = EW) + self._label.grid(row = 0, column = 0, sticky = tk.EW) + self._entry.grid(row = 0, column = 1, sticky = tk.EW) self._valuator.grid(row = 1, columnspan = 2, padx = 2, pady = 2, sticky = 'ew') self.interior().columnconfigure(0, weight = 1) else: if self._label: - self._label.grid(row=0, column=0, sticky = EW) - self._entry.grid(row=0, column=1, sticky = EW) + self._label.grid(row=0, column=0, sticky = tk.EW) + self._entry.grid(row=0, column=1, sticky = tk.EW) self._valuator.grid(row=0, column=2, padx = 2, pady = 2) self.interior().columnconfigure(0, weight = 1) @@ -86,7 +86,7 @@ class SliderWidget(Pmw.MegaWidget): optiondefs = ( # Appearance ('style', VALUATOR_MINI, INITOPT), - ('relief', RAISED, self.setRelief), + ('relief', tk.RAISED, self.setRelief), ('borderwidth', 2, self.setBorderwidth), ('background', 'grey75', self.setBackground), ('fliparrow', 0, INITOPT), @@ -140,17 +140,17 @@ class SliderWidget(Pmw.MegaWidget): def createSlider(parent): # Create the slider inside the dropdown window. # Min label - self._minLabel = Label(parent, text = self['min'], width = 8, - anchor = W) - self._minLabel.pack(side = LEFT) + self._minLabel = tk.Label(parent, text = self['min'], width = 8, + anchor = tk.W) + self._minLabel.pack(side = tk.LEFT) # Slider widget if self['style'] == VALUATOR_FULL: # Use a scale slider - self._widgetVar = DoubleVar() + self._widgetVar = tk.DoubleVar() self._widgetVar.set(self['value']) self._widget = self.createcomponent( 'slider', (), None, - Scale, (interior,), + tk.Scale, (interior,), variable = self._widgetVar, from_ = self['min'], to = self['max'], resolution = 0.0, @@ -158,13 +158,13 @@ class SliderWidget(Pmw.MegaWidget): orient = 'horizontal', showvalue = 0, length = sliderWidth, - relief = FLAT, bd = 2, + relief = tk.FLAT, bd = 2, highlightthickness = 0) else: # Use a canvas slider self._widget = self.createcomponent( 'slider', (), None, - Canvas, (parent,), + tk.Canvas, (parent,), width = sliderWidth, height = height, bd = 2, @@ -191,12 +191,12 @@ class SliderWidget(Pmw.MegaWidget): width = 2, tags = ('line',)) - self._widget.pack(side = LEFT, expand=1, fill=X) + self._widget.pack(side = tk.LEFT, expand=1, fill=tk.X) # Max label - self._maxLabel = Label(parent, text = self['max'], width = 8, - anchor = W) - self._maxLabel.pack(side = LEFT) + self._maxLabel = tk.Label(parent, text = self['max'], width = 8, + anchor = tk.W) + self._maxLabel.pack(side = tk.LEFT) # Create slider if self['style'] == VALUATOR_MINI: @@ -205,10 +205,10 @@ class SliderWidget(Pmw.MegaWidget): self._arrowBtn = self.createcomponent( 'arrowbutton', (), None, - Canvas, (interior,), borderwidth = 0, - relief = FLAT, width = 14, height = 14, + tk.Canvas, (interior,), borderwidth = 0, + relief = tk.FLAT, width = 14, height = 14, scrollregion = (-7, -7, 7, 7)) - self._arrowBtn.pack(expand = 1, fill = BOTH) + self._arrowBtn.pack(expand = 1, fill = tk.BOTH) self._arrowBtn.create_polygon(-5, -5, 5, -5, 0, 5, fill = 'grey50', tags = 'arrow') @@ -219,8 +219,8 @@ class SliderWidget(Pmw.MegaWidget): self._popup = self.createcomponent( 'popup', (), None, - Toplevel, (interior,), - relief = RAISED, borderwidth = 2) + tk.Toplevel, (interior,), + relief = tk.RAISED, borderwidth = 2) self._popup.withdraw() self._popup.overrideredirect(1) @@ -260,7 +260,7 @@ class SliderWidget(Pmw.MegaWidget): # Adjust relief if 'relief' not in kw: if self['style'] == VALUATOR_FULL: - self['relief'] = FLAT + self['relief'] = tk.FLAT self.updateIndicator(self['value']) @@ -313,7 +313,7 @@ class SliderWidget(Pmw.MegaWidget): self._fUpdate = 0 # Make sure that the arrow is displayed sunken. - self.interior()['relief'] = SUNKEN + self.interior()['relief'] = tk.SUNKEN self.update_idletasks() # Position popup so that marker is immediately below center of # Arrow button @@ -437,7 +437,7 @@ class SliderWidget(Pmw.MegaWidget): self._isPosted = 0 # Raise up arrow button - self.interior()['relief'] = RAISED + self.interior()['relief'] = tk.RAISED def _incrementValue(self, event): self.set(self.value + self.increment) diff --git a/direct/src/tkwidgets/Tree.py b/direct/src/tkwidgets/Tree.py index f5f6a98ef9..658563c90a 100644 --- a/direct/src/tkwidgets/Tree.py +++ b/direct/src/tkwidgets/Tree.py @@ -20,8 +20,8 @@ __all__ = ['TreeNode', 'TreeItem'] # - optimize tree redraw after expand of subnode import os, sys -from direct.showbase.TkGlobal import * -from panda3d.core import * +from panda3d.core import Filename, getModelPath +import tkinter as tk class TreeNode: @@ -40,7 +40,7 @@ class TreeNode: if self.menuList: if self.menuList[-1] == 'Separator': self.menuList = self.menuList[:-1] - self.menuVar = IntVar() + self.menuVar = tk.IntVar() self.menuVar.set(0) self._popupMenu = None self.fSortChildren = False # [gjeon] flag for sorting children or not @@ -73,7 +73,7 @@ class TreeNode: if not fn.resolveFilename(getModelPath().value, "gif"): raise FileNotFoundError("couldn't find \"%s\"" % (fn)) - image = PhotoImage(master=self.canvas, file=fn.toOsSpecific()) + image = tk.PhotoImage(master=self.canvas, file=fn.toOsSpecific()) self.iconimages[name] = image return image @@ -118,7 +118,7 @@ class TreeNode: def createPopupMenu(self): if self.menuList: - self._popupMenu = Menu(self.canvas, tearoff = 0) + self._popupMenu = tk.Menu(self.canvas, tearoff = 0) for i in range(len(self.menuList)): item = self.menuList[i] if item == 'Separator': @@ -248,9 +248,9 @@ class TreeNode: oldcursor = self.canvas['cursor'] self.canvas['cursor'] = "watch" self.canvas.update() - self.canvas.delete(ALL) # XXX could be more subtle + self.canvas.delete(tk.ALL) # XXX could be more subtle self.draw(7, 2, fUseCachedChildren) - x0, y0, x1, y1 = self.canvas.bbox(ALL) + x0, y0, x1, y1 = self.canvas.bbox(tk.ALL) self.canvas.configure(scrollregion=(0, 0, x1, y1)) self.canvas['cursor'] = oldcursor @@ -371,7 +371,7 @@ class TreeNode: label = self.label except AttributeError: # padding carefully selected (on Windows) to match Entry widget: - self.label = Label(self.canvas, text=text, bd=0, padx=2, pady=2) + self.label = tk.Label(self.canvas, text=text, bd=0, padx=2, pady=2) if self.selected: self.label.configure(fg="white", bg="darkblue") elif self.setAsTarget: @@ -397,9 +397,9 @@ class TreeNode: self.select(event) def edit(self, event=None): - self.entry = Entry(self.label, bd=0, highlightthickness=1, width=0) + self.entry = tk.Entry(self.label, bd=0, highlightthickness=1, width=0) self.entry.insert(0, self.label['text']) - self.entry.selection_range(0, END) + self.entry.selection_range(0, tk.END) self.entry.pack(ipadx=5) self.entry.focus_set() self.entry.bind("", self.edit_finish) diff --git a/direct/src/tkwidgets/Valuator.py b/direct/src/tkwidgets/Valuator.py index 7030704740..41d440e4f2 100644 --- a/direct/src/tkwidgets/Valuator.py +++ b/direct/src/tkwidgets/Valuator.py @@ -3,10 +3,9 @@ __all__ = ['Valuator', 'ValuatorGroup', 'ValuatorGroupPanel'] from panda3d.core import Vec4 -from direct.showbase.DirectObject import * -from direct.showbase.TkGlobal import * from direct.directtools.DirectUtil import getTkColorString from . import WidgetPropertiesDialog +import tkinter as tk from tkinter.colorchooser import askcolor import Pmw @@ -22,9 +21,9 @@ class Valuator(Pmw.MegaWidget): #define the megawidget options INITOPT = Pmw.INITOPT optiondefs = ( - ('state', NORMAL, self.setState), + ('state', tk.NORMAL, self.setState), # Widget appearance - ('relief', GROOVE, None), + ('relief', tk.GROOVE, None), ('borderwidth', 2, None), ('text', 'Valuator', self.setLabel), # Initial and reset values @@ -68,18 +67,18 @@ class Valuator(Pmw.MegaWidget): # The Label if self['text'] is not None: self._label = self.createcomponent('label', (), None, - Label, (interior,), + tk.Label, (interior,), text = self['text'], font = ('MS Sans Serif', 12), - anchor = CENTER) + anchor = tk.CENTER) else: self._label = None # The entry - self._entryVal = StringVar() + self._entryVal = tk.StringVar() self._entry = self.createcomponent('entry', (), None, - Entry, (interior,), - justify = RIGHT, + tk.Entry, (interior,), + justify = tk.RIGHT, width = 12, textvariable = self._entryVal) self._entry.bind('', self.validateEntryInput) @@ -94,7 +93,7 @@ class Valuator(Pmw.MegaWidget): if self['fAdjustable']: # The popup menu - self._popupMenu = Menu(interior, tearoff = 0) + self._popupMenu = tk.Menu(interior, tearoff = 0) self.addValuatorMenuEntries() self._popupMenu.add_command(label = 'Reset', command = self.reset) @@ -268,14 +267,14 @@ class Valuator(Pmw.MegaWidget): def setState(self): """ Enable/disable widget """ - if self['state'] == NORMAL: - self._entry['state'] = NORMAL + if self['state'] == tk.NORMAL: + self._entry['state'] = tk.NORMAL self._entry['background'] = self._entryBackground - self._valuator._widget['state'] = NORMAL - elif self['state'] == DISABLED: + self._valuator._widget['state'] = tk.NORMAL + elif self['state'] == tk.DISABLED: self._entry['background'] = 'grey75' - self._entry['state'] = DISABLED - self._valuator._widget['state'] = DISABLED + self._entry['state'] = tk.DISABLED + self._valuator._widget['state'] = tk.DISABLED def setLabel(self): """ Update label's text """ @@ -354,7 +353,7 @@ class ValuatorGroup(Pmw.MegaWidget): optiondefs = ( ('type', FLOATER, INITOPT), ('dim', DEFAULT_DIM, INITOPT), - ('side', TOP, INITOPT), + ('side', tk.TOP, INITOPT), # A list of initial values, one for each valuator ('value', DEFAULT_VALUE, INITOPT), ('min', None, INITOPT), @@ -409,7 +408,7 @@ class ValuatorGroup(Pmw.MegaWidget): postCallback = self._postCallback, callbackData = [self], ) - f.pack(side = self['side'], expand = 1, fill = X) + f.pack(side = self['side'], expand = 1, fill = tk.X) self._valuatorList.append(f) # Make sure valuators are initialized @@ -488,7 +487,7 @@ class ValuatorGroupPanel(Pmw.MegaToplevel): optiondefs = ( ('type', FLOATER, INITOPT), ('dim', DEFAULT_DIM, INITOPT), - ('side', TOP, INITOPT), + ('side', tk.TOP, INITOPT), ('title', 'Valuator Group', None), # A list of initial values, one for each floater ('value', DEFAULT_VALUE, INITOPT), @@ -521,7 +520,7 @@ class ValuatorGroupPanel(Pmw.MegaToplevel): menubar = self.createcomponent('menubar', (), None, Pmw.MenuBar, (interior,), balloon = self.balloon) - menubar.pack(fill=X) + menubar.pack(fill=tk.X) # ValuatorGroup Menu menubar.addmenu('Valuator Group', 'Valuator Group Operations') @@ -540,7 +539,7 @@ class ValuatorGroupPanel(Pmw.MegaToplevel): label = 'Dismiss', command = dismissCommand) menubar.addmenu('Help', 'Valuator Group Help Operations') - self.toggleBalloonVar = IntVar() + self.toggleBalloonVar = tk.IntVar() self.toggleBalloonVar.set(0) menubar.addmenuitem('Help', 'checkbutton', 'Toggle balloon help', @@ -562,7 +561,7 @@ class ValuatorGroupPanel(Pmw.MegaToplevel): resolution = self['resolution'], labels = self['labels'], command = self['command']) - self.valuatorGroup.pack(expand = 1, fill = X) + self.valuatorGroup.pack(expand = 1, fill = tk.X) # Make sure input variables processed self.initialiseoptions(ValuatorGroupPanel) @@ -642,10 +641,10 @@ def rgbPanel(nodePath, callback = None, style = 'mini'): vgp['postCallback'] = onRelease # Add a print button which will also serve as a color tile - pButton = Button(vgp.interior(), text = 'Print to Log', - bg = getTkColorString(initColor), - command = printToLog) - pButton.pack(expand = 1, fill = BOTH) + pButton = tk.Button(vgp.interior(), text = 'Print to Log', + bg = getTkColorString(initColor), + command = printToLog) + pButton.pack(expand = 1, fill = tk.BOTH) # Update menu menubar = vgp.component('menubar') @@ -728,10 +727,10 @@ def lightRGBPanel(light, style = 'mini'): 'Light Control Panel') # Add a print button which will also serve as a color tile - pButton = Button(vgp.interior(), text = 'Print to Log', - bg = getTkColorString(initColor), - command = printToLog) - pButton.pack(expand = 1, fill = BOTH) + pButton = tk.Button(vgp.interior(), text = 'Print to Log', + bg = getTkColorString(initColor), + command = printToLog) + pButton.pack(expand = 1, fill = tk.BOTH) # Update menu menubar = vgp.component('menubar') diff --git a/direct/src/tkwidgets/VectorWidgets.py b/direct/src/tkwidgets/VectorWidgets.py index fe963c7332..801932be54 100644 --- a/direct/src/tkwidgets/VectorWidgets.py +++ b/direct/src/tkwidgets/VectorWidgets.py @@ -2,9 +2,9 @@ __all__ = ['VectorEntry', 'Vector2Entry', 'Vector3Entry', 'Vector4Entry', 'ColorEntry'] -from direct.showbase.TkGlobal import * from . import Valuator import Pmw +import tkinter as tk from tkinter.colorchooser import askcolor @@ -27,7 +27,7 @@ class VectorEntry(Pmw.MegaWidget): ('labelIpadx', 2, None), ('command', None, None), ('entryWidth', 8, self._updateEntryWidth), - ('relief', GROOVE, self._updateRelief), + ('relief', tk.GROOVE, self._updateRelief), ('bd', 2, self._updateBorderWidth), ('text', 'Vector:', self._updateText), ('min', None, self._updateValidate), @@ -53,18 +53,18 @@ class VectorEntry(Pmw.MegaWidget): # This does double duty as a menu button self._label = self.createcomponent('label', (), None, - Menubutton, (interior,), + tk.Menubutton, (interior,), text = self['text'], activebackground = '#909090') - self.menu = self._label['menu'] = Menu(self._label) + self.menu = self._label['menu'] = tk.Menu(self._label) self.menu.add_command(label = 'Reset', command = self.reset) self.menu.add_command(label = 'Popup sliders', command = self.popupSliders) - self._label.pack(side = LEFT, fill = X, ipadx = self['labelIpadx']) + self._label.pack(side = tk.LEFT, fill = tk.X, ipadx = self['labelIpadx']) self.variableList = [] self.entryList = [] for index in range(self['dim']): - var = StringVar() + var = tk.StringVar() self.variableList.append(var) # To set the configuration of all entrys in a vector use: # ve.configure(Entry_XXX = YYY) @@ -76,10 +76,10 @@ class VectorEntry(Pmw.MegaWidget): 'entryField%d_entry' % index),), 'Entry', Pmw.EntryField, (interior,), - entry_justify = RIGHT, + entry_justify = tk.RIGHT, entry_textvariable = var, command = lambda s = self, i = index: s._entryUpdateAt(i)) - entry.pack(side = LEFT, expand = 1, fill = X) + entry.pack(side = tk.LEFT, expand = 1, fill = tk.X) self.entryList.append(entry) # To configure the floaterGroup use: @@ -334,7 +334,7 @@ class ColorEntry(VectorEntry): self.set((color[0], color[1], color[2], self.getAt(3))) if __name__ == '__main__': - root = Toplevel() + root = tk.Toplevel() root.title('Vector Widget demo') ve = VectorEntry(root); ve.pack() diff --git a/direct/src/tkwidgets/WidgetPropertiesDialog.py b/direct/src/tkwidgets/WidgetPropertiesDialog.py index 528967eca0..2c5efb6fb8 100644 --- a/direct/src/tkwidgets/WidgetPropertiesDialog.py +++ b/direct/src/tkwidgets/WidgetPropertiesDialog.py @@ -2,11 +2,11 @@ __all__ = ['WidgetPropertiesDialog'] -from direct.showbase.TkGlobal import * import Pmw +import tkinter as tk -class WidgetPropertiesDialog(Toplevel): +class WidgetPropertiesDialog(tk.Toplevel): """Class to open dialogs to adjust widget properties.""" def __init__(self, propertyDict, propertyList = None, parent = None, title = 'Widget Properties'): @@ -27,7 +27,7 @@ class WidgetPropertiesDialog(Toplevel): import tkinter parent = tkinter._default_root # Create toplevel window - Toplevel.__init__(self, parent) + tk.Toplevel.__init__(self, parent) self.transient(parent) # Set title if title: @@ -37,7 +37,7 @@ class WidgetPropertiesDialog(Toplevel): # Initialize modifications self.modifiedDict = {} # Create body - body = Frame(self) + body = tk.Frame(self) self.initial_focus = self.body(body) body.pack(padx=5, pady=5) # Create OK Cancel button @@ -57,7 +57,7 @@ class WidgetPropertiesDialog(Toplevel): # Clean up balloons! for balloon in self.balloonList: balloon.withdraw() - Toplevel.destroy(self) + tk.Toplevel.destroy(self) # # construction hooks @@ -83,12 +83,12 @@ class WidgetPropertiesDialog(Toplevel): # Help string specified? helpString = propertySet.get('help', None) # Create label - label = Label(master, text=property, justify=LEFT) - label.grid(row=count, column = 0, padx=5, sticky=W) + label = tk.Label(master, text=property, justify=tk.LEFT) + label.grid(row=count, column = 0, padx=5, sticky=tk.W) # Create entry entry = Pmw.EntryField(master, entry_justify = 'right') - entry.grid(row=count, column = 1, padx=5, sticky=W+E) + entry.grid(row=count, column = 1, padx=5, sticky=tk.W+tk.E) if initialvalue is None: entry.insert(0, 'None') else: @@ -137,7 +137,7 @@ class WidgetPropertiesDialog(Toplevel): # Set initial focus if len(entryList) > 0: entry = entryList[0] - entry.select_range(0, END) + entry.select_range(0, tk.END) # Set initial focus to first entry in the list return entryList[0] else: @@ -150,13 +150,13 @@ class WidgetPropertiesDialog(Toplevel): def buttonbox(self): """add standard button box buttons. """ - box = Frame(self) + box = tk.Frame(self) # Create buttons - w = Button(box, text="OK", width=10, command=self.ok) - w.pack(side=LEFT, padx=5, pady=5) + w = tk.Button(box, text="OK", width=10, command=self.ok) + w.pack(side=tk.LEFT, padx=5, pady=5) # Create buttons - w = Button(box, text="Cancel", width=10, command=self.cancel) - w.pack(side=LEFT, padx=5, pady=5) + w = tk.Button(box, text="Cancel", width=10, command=self.cancel) + w.pack(side=tk.LEFT, padx=5, pady=5) # Bind commands self.bind("", self.ok) self.bind("", self.cancel) diff --git a/direct/src/wxwidgets/ViewPort.py b/direct/src/wxwidgets/ViewPort.py index 6974b1f687..4c89637fb9 100755 --- a/direct/src/wxwidgets/ViewPort.py +++ b/direct/src/wxwidgets/ViewPort.py @@ -8,11 +8,19 @@ Modified by Summer 2010 Carnegie Mellon University ETC PandaLE team: fixed a bug __all__ = ["Viewport", "ViewportManager"] -from panda3d.core import OrthographicLens, Point3, Plane, CollisionPlane, CollisionNode, NodePath +from panda3d.core import ( + BitMask32, + CollisionNode, + CollisionPlane, + NodePath, + OrthographicLens, + Plane, + Point3, +) from direct.showbase.DirectObject import DirectObject from direct.directtools.DirectGrid import DirectGrid from direct.showbase.ShowBase import WindowControls -from direct.directtools.DirectGlobals import * +from direct.directtools.DirectGlobals import LE_CAM_MASKS, LE_showInOneCam from .WxPandaWindow import WxPandaWindow import wx diff --git a/direct/src/wxwidgets/WxPandaShell.py b/direct/src/wxwidgets/WxPandaShell.py index 1d40f7a45a..2f0982e6b9 100755 --- a/direct/src/wxwidgets/WxPandaShell.py +++ b/direct/src/wxwidgets/WxPandaShell.py @@ -1,13 +1,12 @@ import wx from wx.lib.agw import fourwaysplitter as FWS -from panda3d.core import * -from direct.showbase.ShowBase import * +from direct.showbase.ShowBase import ShowBase from direct.showbase import ShowBaseGlobal -from direct.directtools.DirectGlobals import * +from direct.directtools.DirectGlobals import SKIP_UNPICKABLE -from .WxAppShell import * -from .ViewPort import * +from .WxAppShell import WxAppShell +from .ViewPort import Viewport, ViewportManager ID_FOUR_VIEW = 401 ID_TOP_VIEW = 402 diff --git a/direct/src/wxwidgets/WxPandaStart.py b/direct/src/wxwidgets/WxPandaStart.py index 4c285fa2be..60ec8e0566 100755 --- a/direct/src/wxwidgets/WxPandaStart.py +++ b/direct/src/wxwidgets/WxPandaStart.py @@ -1,2 +1,2 @@ -from .WxPandaShell import * +from .WxPandaShell import WxPandaShell base.app = WxPandaShell() diff --git a/direct/src/wxwidgets/WxPandaWindow.py b/direct/src/wxwidgets/WxPandaWindow.py index de17f49502..4bf1176b26 100644 --- a/direct/src/wxwidgets/WxPandaWindow.py +++ b/direct/src/wxwidgets/WxPandaWindow.py @@ -13,7 +13,14 @@ try: except ImportError: wxgl = None -from panda3d.core import * +from panda3d.core import ( + CallbackGraphicsWindow, + ConfigVariableBool, + FrameBufferProperties, + KeyboardButton, + MouseButton, + WindowProperties, +) __all__ = ['WxPandaWindow']