From: Symion <kn...@ip...> - 2011-05-31 07:45:22
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"> </head> <body text="#000000" bgcolor="#ffffff"> Hi there,<br> <br> I have recently been testing the Tkinter module with the idea of building GUI's for controlling things like Visual.<br> <br> Tkinter makes it very easy to create Lists, Sliders, Buttons, Menus as well as viewing and editing Text files.<br> <br> I would like to be able to strip the OS decorator from Visual and insert the visual.scene into either a Tkinter Canvas or a Tkinter Frame object.<br> Alternately, it might be easier to assume Visual is already wrapped in a Tkinter TopLevel Object and try to insert Tkinter widgets into the current window surround.<br> <br> When I chased down this idea and looked at the "ui" module it shed no light as the instantiation vanished into C!<br> <br> Is there a way to have them Running and Interacting at the same time?<br> Has anyone written code for this?<br> If this could be achieved it would be very useful!<br> I note that master.update() might be relevant for Tkinter to continue operation but how to control Visual?<br> Any help would be greatly appreciated.<br> <br> Since I have had problems running Tkinter and Visual together, I have developed a simple to use method that enables one or the other to be "in the drivers seat".<br> It is based on the fact that Visual uses the escape key to end program execution, so I set Tkinter to act the same.<br> Now pressing the 'Esc' key will switch between Visual and Tkinter, no problems!<br> <br> This means that Tkinter can be used to modify or define Visual environment or Objects, then press 'Esc' and you are in Visual.<br> Once in Visual it is possible to modify or define Tkinter environment or Objects, then press 'Esc' and you are in Tkinter!<br> <br> Source Code: TkInVisual.py<br> <br> <small><small>from Tkinter import *<br> import vis<br> from math import (sqrt, pi)<br> from os import (access as Access, path as Path, F_OK)<br> <br> class TkInVisual:<br> """Tkinter : Visual Interaction.<br> 'esc' key will flip between Visual and Tkinter<br> Visual Control:<br> Tkinter Panel:<br> 'f1' = menu on|off<br> 'f2' = canvas on|off<br> 'f3' = button on|off<br> 'enter' = close Tkinter - leave Visual open <br> 'end' = quit and close Both<br> """<br> def __init__(self):<br> """Access multiple lists via Visual/Tkinter"""<br> self.version="1.0.0"<br> self.copyright = "Tkinter Method - GNU (c) Symion MMXI"<br> self.xpos, self.ypos, self.wide, self.high = 8, 8, 400, 300<br> self.visual = vis.scene<br> self.visual.visible = False<br> self.visual.title = "{0} : {1}".format(self.copyright, self.version)<br> self.visual.autoscale = False<br> self.visual.range = 256<br> self.visual.access = 6 # new vis.scene.variable<br> #<br> # For old graphics card users * Time to upgrade? *<br> #<br> self.visual.enable_shaders = False<br> # Pre-set opening list<br> self.inform = dict()<br> self.memory = ["Master_methods", "Frame_methods",<br> "LabelFrame_methods", "Canvas_methods",<br> "Text_methods", "Entry_methods",<br> "Listbox_methods", "Scrollbar_methods",<br> "Label_methods", "Button_methods",<br> "Menu_methods", "Graphic_methods"]<br> self.action = ["self.Do_a", "self.Do_b", "self.Do_c",<br> "self.Do_d", "self.Do_e", "self.Do_f",<br> "self.Do_g", "self.Do_h", "self.Do_i",<br> "self.Do_j", "self.Do_k", "self.Do_l"]<br> <br> def Create_widget(self, title, config):<br> """config = [Menu 0|1, Graphic 0|1, Button 0|1|]"""<br> self.parent = Tk()<br> self.parent.title(title)<br> self.parent["borderwidth"] = 4<br> # Customise Tkinter Panel<br> self.parent.tk_setPalette(background="#B0B0B0",<br> activeForeground="#FFFFFF",<br> selectForeground="#FFFF00",<br> activeBackground="#FF0000")<br> # self.parent.geometry("=%dx%d+%d+%d" %(self.wide,<br> # self.high,<br> # self.xpos,<br> # self.ypos))<br> self.parent.geometry("+%d+%d" % (self.xpos, self.ypos))<br> self.parent.resizable(width=False, height=False)<br> self.parent.bind("<Escape>", self.Ok_go)<br> self.parent.bind("<End>", self.Ok_quit)<br> base = LabelFrame(self.parent,<br> fg="#0000FF",<br> font=("times", 14, "normal"),<br> bd=5,<br> text="Tkinter Object Methods")<br> base.grid()<br> rows = 0<br> # config = [Menu 0|1, Graphic 0|1, Button 0|1]<br> if config[1] > 0:<br> paper = Canvas(base,<br> width=self.wide,<br> height=self.high//3,<br> bg="#FFFFFF",<br> relief=RIDGE,<br> borderwidth=2)<br> paper.grid(row=rows, column=0, columnspan=2)<br> rows += 1<br> if config[0] > 0:<br> self.menubar = Menu(self.parent)<br> # create 1st pulldown menu<br> filemenu = Menu(self.menubar, tearoff=0,<br> activebackground="#FF0000")<br> self.menubar.add_cascade(label = " Methods ", menu=filemenu)<br> # <br> for a,b in zip(self.memory[:5], self.action[:5]):<br> filemenu.add_command(label = a, command=eval(b))<br> filemenu.add_separator()<br> filemenu.add_command(label=" Exit : End", command=self.Ok_quit)<br> if False:<br> # create 2nd pulldown<br> visualmenu = Menu(self.menubar,<br> tearoff=0,<br> activebackground="#00FF00")<br> self.menubar.add_cascade(label=" Visual ", menu=visualmenu)<br> visualmenu.add_command(label=" Objects ", command=self.Test)<br> visualmenu.add_separator()<br> visualmenu.add_command(label=" Open ", command=self.Test)<br> visualmenu.add_command(label=" Close ", command=self.Test)<br> visualmenu.add_separator()<br> visualmenu.add_command(label=" Edit ", command=self.Test)<br> # create 3rd<br> extramenu = Menu(self.menubar,<br> tearoff=0,<br> activebackground="#0000FF")<br> self.menubar.add_cascade(label=" Extras ", menu=extramenu)<br> # <br> for a,b in zip(self.memory[5:], self.action[5:]):<br> extramenu.add_command(label = a, command=eval(b))<br> #<br> # display the menu<br> self.parent["menu"] = self.menubar<br> self.parent.config(padx=12, pady=12)<br> self.label = Label(base, font=("times", 14, "normal"))<br> self.label.grid(row=rows,<br> column=0,<br> columnspan=2,<br> sticky=E+W,<br> padx=5,<br> ipadx=5)<br> rows += 1<br> # Build a List Table of info.<br> self.list_table = Listbox(base,<br> bg="white",<br> width=50,<br> borderwidth=2,<br> font=("times", 12, "normal"),<br> relief=SUNKEN)<br> # "A list of Tkinter Object Methods"<br> self.visual.access = self.visual.access%len(self.memory)<br> self.Make_list(self.visual.access)<br> # <br> self.list_table.grid(row=rows, column=0, columnspan=2,<br> ipadx=5, ipady=5, sticky=E+W)<br> self.list_table.bind("<Return>", self.Ach_tung)<br> self.list_table.bind("<Double-Button-1>", self.By_pass)<br> self.scroll_bar = Scrollbar(base,<br> orient=VERTICAL,<br> takefocus=FALSE,<br> highlightthickness=4)<br> self.scroll_bar["command"] = self.list_table.yview<br> self.scroll_bar.grid(row=rows, column=1, columnspan=2, sticky=N+S+E)<br> self.list_table["yscrollcommand"]= self.scroll_bar.set<br> self.list_table["activestyle"] = "dotbox"<br> self.list_table.focus_set()<br> rows += 1<br> #<br> # Button pad<br> #<br> if config[2] > 0:<br> i = 0<br> for y in range(6):<br> for x in range(2):<br> a, b = self.memory[i], eval(self.action[i])<br> test = Button(base, text=a, command=b)<br> test.grid(row=rows + y, column=x, columnspan=1, sticky=E+W)<br> test.bind("<Return>", b)<br> i += 1<br> rows += y + 1<br> qquit = Button(base, text="Back to Visual", command=self.Ok_go)<br> qquit.grid(row=rows, column=0, columnspan=2, sticky=E+W)<br> qquit.bind("<Return>", self.Ok_go)<br> <br> def Make_list(self, ndata):<br> self.visual.access = ndata<br> self.label["text"] = self.memory[ndata]<br> self.data = "self.{0}()".format(self.memory[ndata])<br> self.Build_list(eval(self.data).config().keys())<br> <br> def Do_remove(self):<br> n = range(self.list_table.size())<br> for a in n:<br> self.list_table.delete(0)<br> <br> def Build_list(self, table):<br> self.Do_remove()<br> for a in table:<br> self.list_table.insert(END, a)<br> <br> def Do_a(self, event=None):<br> self.Make_list(0)<br> <br> def Do_b(self, event=None):<br> self.Make_list(1)<br> <br> def Do_c(self, event=None):<br> self.Make_list(2)<br> <br> def Do_d(self, event=None):<br> self.Make_list(3)<br> <br> def Do_e(self, event=None):<br> self.Make_list(4)<br> <br> def Do_f(self, event=None):<br> self.Make_list(5)<br> <br> def Do_g(self, event=None):<br> self.Make_list(6)<br> <br> def Do_h(self, event=None):<br> self.Make_list(7)<br> <br> def Do_i(self, event=None):<br> self.Make_list(8)<br> <br> def Do_j(self, event=None):<br> self.Make_list(9)<br> <br> def Do_k(self, event=None):<br> self.Make_list(10)<br> <br> def Do_l(self, event=None):<br> self.Make_list(11)<br> <br> def Test(self, event=None):<br> print self.menubar.cget('type')<br> <br> def Ach_tung(self, event=None):<br> self.answer = self.list_table.get(ACTIVE)<br> # Do other things than simply printing it into V-IDLE<br> # Append to a list or build a dictionary perhaps?<br> try:<br> self.inform[self.answer] = (self.visual.access, self.answer)<br> a = self.inform.get(self.answer)<br> # self.inform.append((self.visual.access, self.answer))<br> # a = self.inform[-1]<br> except:<br> a = None<br> finally:<br> if a:<br> self.De_code(a)<br> else:<br> b = self.memory[self.visual.access].replace("_methods", "")<br> print "{0}['{1}'] = ".format(b.lower(), self.answer)<br> <br> def By_pass(self, event=None):<br> self.answer = self.list_table.get(ACTIVE)<br> self.De_code((self.visual.access, self.answer))<br> <br> def De_code(self, a):<br> b = self.memory[a[0]]<br> M = eval("self.{0}()".format(b))<br> mc = M.cget(a[1])<br> if mc.__class__.__name__ == "Tcl_Obj":<br> mc = mc.string <br> b = b.replace("_methods", "")<br> print "{0}['{1}'] = {2}".format(b, a[1], repr(mc))<br> del M<br> <br> def Ok_go(self, event=None):<br> self.xpos = self.parent.winfo_x()<br> self.ypos = self.parent.winfo_y()<br> self.parent.destroy()<br> <br> def Ok_quit(self, event=None):<br> self.Ok_go()<br> self.acts = False<br> <br> #<br> # Make list<br> #<br> <br> def Master_methods(self):<br> return self.parent<br> <br> def Frame_methods(self):<br> return Frame(self.parent)<br> <br> def LabelFrame_methods(self):<br> return LabelFrame(self.parent)<br> <br> def Canvas_methods(self):<br> return Canvas(self.parent)<br> <br> def Text_methods(self):<br> return Text(self.parent)<br> <br> def Entry_methods(self):<br> return Entry(self.parent)<br> <br> def Listbox_methods(self):<br> return Listbox(self.parent)<br> <br> def Scrollbar_methods(self):<br> return Scrollbar(self.parent)<br> <br> def Label_methods(self):<br> return Label(self.parent)<br> <br> def Button_methods(self):<br> return Button(self.parent)<br> <br> def Menu_methods(self):<br> return Menu(self.parent)<br> <br> def Graphic_methods(self):<br> return self.parent<br> <br> <br> if __name__ == '__main__':<br> <br> def Inter_pret():<br> if len(master.inform) > 0:<br> master.parent = Tk()<br> print "\nAccumulated List:"<br> for c in master.inform.keys():<br> a = master.inform.get(c)<br> b = master.memory[a[0]]<br> M = eval("master.{0}()".format(b))<br> mc = M.cget(a[1])<br> if mc.__class__.__name__ == "Tcl_Obj":<br> mc = mc.string <br> b = b.replace("_methods", "")<br> print "{0}.config({1}) = {2}".format(b, a[1], repr(mc))<br> del M<br> else:<br> print "Returned Empty List."<br> <br> def Quit():<br> print "Zoom({0})".format(vis.mag(master.visual.mouse.camera - master.visual.center)/sqrt(3.0))<br> if kb == "\n":<br> p = dir()<br> print "Dir() : Length({0})\n".format(len(p))<br> for j, a in enumerate(p):<br> print "{0:03.0f} = {1}".format(j, a)<br> else:<br> master.visual.visible = False<br> <br> def Use_visual(x, y, z):<br> master.visual.visible = True<br> kb = ""<br> while 1:<br> while not master.visual.kb.keys:<br> if not master.visual.visible and not master.visual.exit:<br> master.visual.exit = True<br> kb = "break"<br> break<br> elif master.visual.mouse.events:<br> mk = master.visual.mouse.getevent()<br> if mk.release == "left":<br> if mk.pick:<br> master.visual.center = mk.pickpos<br> box.pos = mk.pickpos<br> else:<br> master.visual.center = master.visual.mouse.pickpos<br> while master.visual.kb.keys:<br> kb = master.visual.kb.getkey()<br> print "keyboard event={0}".format(kb)<br> #<br> # Function keys f1 to f3 control Tkinter configuration<br> #<br> if kb in ["\n", "end"]:<br> master.acts = False<br> break<br> elif kb in ["f1"]:<br> x = 1 - x<br> break<br> elif kb in ["f2"]:<br> y = 1 - y<br> break<br> elif kb in ["f3"]:<br> z = 1 - z<br> break<br> elif kb == "break":<br> break<br> return (kb, x, y, z)<br> <br> #<br> # Initialise Tkinter and Setup VPython with visual = vis.scene<br> #<br> master = TkInVisual()<br> #<br> # Display some vital information in VIDLE<br> #<br> print "{0} : Version({1})\n{2}\n".format(master.copyright,<br> master.version,<br> master.__doc__)<br> #<br> #<br> # Arbitrary Visual code ** Replace with Your Visual Code **<br> #<br> #<br> if True:<br> obj = vis.points(size=1, color=vis.color.red, shape="square")<br> w = 30.0<br> for y in range(50):<br> for x in range(50):<br> obj.append((x - w, y - w, 0))<br> obj.color[-1] = (w / (x + 1), w / (y + 1), w / (x + y + 1))<br> box = vis.box(pos=master.visual.center, opacity=0.5,<br> color=vis.color.red, radius=5)<br> else:<br> execfile(Path.join(Path.abspath("."),"Demo.py"))<br> # <br> # Tkinter Configuration List for Object.methods = values Device.<br> # Initialise Tkinter Default settings to your specification.<br> #<br> # x = Menu control ON|OFF<br> x = 1<br> # y = Canvas control ON|OFF<br> y = 0<br> # z = Buttonpad control ON|OFF<br> z = 0<br> #<br> # config = [Menu 0|1, Graphic 0|1, Button 0|1|2]<br> #<br> # Begin<br> #<br> master.acts = True<br> while master.acts:<br> master.visual.exit = False<br> master.visual.visible = False<br> # Build Tkinter Objects<br> master.Create_widget(master.copyright, config=[x, y, z])<br> # master.parent.after()<br> if sys.platform[:3]:<br> master.parent.iconify()<br> master.parent.update()<br> master.parent.deiconify()<br> master.parent.mainloop()<br> # Cleanup<br> del master.parent<br> if not master.acts:<br> kb = ""<br> break<br> # Visuals turn at the helm<br> kb, x, y, z = Use_visual(x, y, z)<br> # React differently if User pressed 'enter' to exit during Visual phase<br> Quit()<br> # Display Results Accumulated during Tkinter Phase<br> Inter_pret()</small></small><br> <br> Symion<br> <small>Tuesday, 31 May, 2011</small><br> </body> </html> |