From 732e5f1509e6b53e497a5138b7623f5c2f167af0 Mon Sep 17 00:00:00 2001 From: lizhi-rocky Date: Tue, 13 Jul 2010 16:53:14 +0800 Subject: [PATCH] add: 1 column 1, row 0, display step name 2 variable 3 init and quit action --- python/mine/ri_cmd.py | 18 +++++++---- python/mine/ri_tk.py | 67 ++++++++++++++++++++++++++++++++++++---- python/mine/ri_widget.py | 40 +++++++++++++++++------- xml/interface_ng.xml | 14 +++++++++ xml/interface_t.xml | 11 +++++-- 5 files changed, 125 insertions(+), 25 deletions(-) diff --git a/python/mine/ri_cmd.py b/python/mine/ri_cmd.py index 6302a65..532d466 100644 --- a/python/mine/ri_cmd.py +++ b/python/mine/ri_cmd.py @@ -12,10 +12,9 @@ def quit(): def previous(): ''' correspond to previous button ''' wid_name = ri_seq.previous() - print wid_name if wid_name is not None: - if 'current_window' in dir(display): - display.kill_widget(display.current_window) + if ri_widget.Widget.current_widget: + ri_widget.Widget.current_widget.hide() ri_widget.Widget.dict[wid_name].display() else: @@ -24,11 +23,18 @@ def previous(): def next(): ''' correspond to next button ''' wid_name = ri_seq.next() - print wid_name if wid_name is not None: - if 'current_window' in dir(display): - display.kill_widget(display.current_window) + if ri_widget.Widget.current_widget: + ri_widget.Widget.current_widget.hide() ri_widget.Widget.dict[wid_name].display() else: ri_widget.MessageBox.dict["next"].display() + +def serial_no_init(): + print 'serial_no_init' + display.var_dict['serial_no.number'].set(value='123') + +def serial_no_quit(): + v = display.var_dict['serial_no.number'].get() + print v diff --git a/python/mine/ri_tk.py b/python/mine/ri_tk.py index 5ee78ca..dc7a6ac 100644 --- a/python/mine/ri_tk.py +++ b/python/mine/ri_tk.py @@ -3,6 +3,12 @@ import Tkinter import tkMessageBox +import sys +import ri_cmd + +var_dict={} +widget_dict={} + def initialize(base_w): ''' base_w - base widget instance ''' global root_window @@ -23,15 +29,52 @@ def quit(): def display_widget(w): ''' w - widget instance ''' global current_window - current_window = display_widget_sub(w, base_widget) + setattr(w, 'tk_widget', display_widget_sub(w, base_widget)) + # set step name + if 'name' in dir(w): + var_dict['main.step_name'].set(w.name) + +class MyImage: + ''' MyImage - a dummy class to hold Image variable ''' + count = 0 + +def modify_attributes(attr_dict): + ''' modify values in attr_dict to suit Tk usage ''' + for a in attr_dict.keys(): + if a == 'image': + # I think there is a bug in Tkinter on Image processing + # I have to bypass it in the following way: + image_var = 'a' + str(MyImage.count) + setattr(MyImage, image_var, Tkinter.PhotoImage(file=attr_dict[a])) + MyImage.count += 1 + attr_dict[a] = getattr(MyImage, image_var) + elif a == 'command': + attr_dict[a] = getattr(sys.modules["ri_cmd"], attr_dict[a]) + elif a == "textvariable" or a == "listvariable": + attr_dict[a] = var_dict[attr_dict[a]] + def display_widget_sub(w, p_win): ''' w - widget instance p_win - Tk parent window ''' + + # name type and value + if "variables" in dir(w): + for v_n, v_t, v_v in w.variables: + if not v_n in var_dict.keys(): + var_dict[v_n] = getattr(Tkinter, v_t)(value=v_v) + + # process action init + if 'action' in dir(w) and 'init' in w.action.dict: + getattr(sys.modules['ri_cmd'], w.action.dict['init'])() + + tk_attr = dict(w.attr) + modify_attributes(tk_attr) + tk_func = getattr(Tkinter, w.tp) - w_win = tk_func(p_win, w.attr) - + w_win = tk_func(p_win, tk_attr) + # display sub widgets if 'widgets' in dir(w): for sub_w in w.widgets: @@ -49,9 +92,21 @@ def display_widget_sub(w, p_win): return w_win -def kill_widget(win): - ''' win - Tk window instance ''' - win.destroy() +def process_action_quit(w): + ''' process action quit ''' + if 'action' in dir(w) and 'quit' in w.action.dict: + getattr(sys.modules['ri_cmd'], w.action.dict['quit'])() + + if 'widgets' in dir(w): + for sub_w in w.widgets: + process_action_quit(sub_w) + +def kill_widget(w): + ''' w - Widget instance ''' + # process action quit + process_action_quit(w) + + w.tk_widget.destroy() #def display_entry(w): diff --git a/python/mine/ri_widget.py b/python/mine/ri_widget.py index 6e0cad7..9a76b36 100644 --- a/python/mine/ri_widget.py +++ b/python/mine/ri_widget.py @@ -1,7 +1,6 @@ #!/usr/bin/python import Tkinter -import sys import ri_tk as display class GridManagement: @@ -28,12 +27,21 @@ class GridLocation: for a in xml_node.attributes.values(): self.dict[a.name] = a.value +class Action: + ''' implement action in interface xml ''' + def __init__(self, xml_node): + self.dict={} + for a in xml_node.attributes.values(): + self.dict[a.name] = a.value + class Widget: ''' implement widget in interface xml ''' current_widget="" dict={} def __init__(self, xml_node): + if 'name' in xml_node.attributes.keys(): + self.name = xml_node.attributes["name"].value self.tp = xml_node.attributes["type"].value self.attr = self.widget_attribute(xml_node) gm_list = [m for m in xml_node.childNodes @@ -53,26 +61,36 @@ class Widget: for w in w_list: self.widgets.append(Widget(w)) + v_list = [ v for v in xml_node.childNodes + if v.nodeType == v.ELEMENT_NODE and v.nodeName == "variable" ] + if v_list: + self.variables=[] + for v in v_list: + self.variables.append((v.attributes["name"].value, \ + v.attributes["type"].value, \ + "value" in v.attributes.keys() and v.attributes["value"].value or "" )) + + act_list = [ a for a in xml_node.childNodes + if a.nodeType == a.ELEMENT_NODE and a.nodeName == "action" ] + if act_list: + self.action = Action(act_list[0]) + def widget_attribute(self, xml_node): attr_list = [ a for a in xml_node.childNodes if a.nodeType == a.ELEMENT_NODE and a.nodeName == "widget_attribute"] d = {} - if attr_list: + if attr_list: for a in attr_list[0].attributes.values(): - if a.name == 'image': - #d[a.name] = Tkinter.PhotoImage(file=a.value) - pass - elif a.name == 'command': - if not "ri_cmd" in sys.modules.keys(): - import ri_cmd - d[a.name] = getattr(sys.modules["ri_cmd"], a.value) - else: - d[a.name] = a.value + d[a.name] = a.value return d def display(self): + Widget.current_widget = self display.display_widget(self) + def hide(self): + display.kill_widget(self) + class Label(Widget): ''' Label ''' def __init__(self, xml_node): diff --git a/xml/interface_ng.xml b/xml/interface_ng.xml index 4199069..404f1bb 100644 --- a/xml/interface_ng.xml +++ b/xml/interface_ng.xml @@ -41,6 +41,9 @@ + + + @@ -139,6 +142,17 @@ on special cases --> + + + + + + + + + + + diff --git a/xml/interface_t.xml b/xml/interface_t.xml index 9a1aaca..0db25c4 100644 --- a/xml/interface_t.xml +++ b/xml/interface_t.xml @@ -4,7 +4,7 @@