GUI2Python库 - 用aardio画Tkinter界面并生成Python代码

By jerryxjr1220 at 2022-07-21 • 0人收藏 • 932人看过

TKinter是Python的原生GUI库,用来创建一些简单的GUI界面还是很方便的。但是,缺点是没有提供一套图形化的设计界面,这样创建界面的时候就非常不直观。


思路是搞一个类似QtDesigner类似的工具,但是又不想搞得太复杂。


aardio的图形化设计非常便捷,这样在aardio里画好界面自动生成tkinter的python代码就是再好不过的事情了。


已开源至Github:

https://github.com/jerryxjr1220/aardioGUI2Python


视频教程:

https://www.bilibili.com/video/BV1wN4y1L7Wk/?vd_source=0400f0a70c0250d73895963c7c937f75


20220807更新:

1. 优化代码增强可读性,功能不变。


20220728更新:

  1. 针对标签、文本框等有字符布局的控件增加左对齐、居中、右对齐布局 

  2. 多行文本框、画板、Listbox增加水平和垂直滚动条

  3. 新增translateName函数,解析窗体设计器代码,返回的Z序与对应控件名称,可用来替换python中的控件名


20220727更新:

  1. 新增字体属性设置,可按照aardio中的字体自动设置到Tkinter中

  2. 修改transfer2assembly名称 为 transfer2place,更好地对应place方法


20220725更新:

  1. 所有可禁用控件,增加禁用属性

  2. 文本框增加密码属性

  3. 新增pack布局和grid布局


20220724更新:

目前可以实现的功能:

  1. 基本控件都已经完善

  2. 可以把界面直接转换为主界面

  3. 也可以支持把界面转换为组件式的类,实例化以后可以重复利用,也可以嵌入到其他Frame、Notebook、LabelFrame等容器中,当然也可以是主窗口Tk容器。

import GUI2Py;
//解析aardio界面生成Python Tkinter
import color
import string
import math

namespace GUI2Py
    
class GUI2Tk {
    ctor( winform ){
        this = winform;
        this.pycode = "";
    };
    
    write = function(code, space=0, end_='\r\n'){
    	if space>0 {
    		for i=1;space {
    			this.pycode += ' ';
    		}
    	}
    	this.pycode += code++end_;
    };
    
       
    //转换为主界面
    transfer2root = function(){
        var window_width = this.width;
        var window_height = this.height;
        var window_text = this.text;
        this.pycode = /***
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont

root = tk.Tk()

### 界面设计部分 ###


***/;
        owner.write('root.geometry("'++ window_width ++ 'x' ++ window_height ++'")');
        owner.write('root.title("'++ window_text ++'")');
        var ctrlNameList = {
            'button' = 0;
            'static' = 0;
            'edit' = 0;
            'radio' = 0;
            'check' = 0;
            'pic' = 0;
            'listbox' = 0;
            'combobox' = 0;
            'progress' = 0;
            'trackbar' = 0;
            'listview' = 0;
            'treeview' = 0;
            'canvas' = 0;
            'groupbox' = 0;
            'frame' = 0;
            'tab' = 0;
                
        };
        for ( hwnd,ctrl in this.eachControlEx() ){
            owner.write('# Z='++ctrl.z);
            winctrol = this.getCtrl(hwnd);
            var x = winctrol.left;
            var y = winctrol.top;
            var width = winctrol.width;
            var height = winctrol.height;
            var text = winctrol.text;
            var hide = ctrl.hide;
            var disabled = ctrl.disabled;
            var readonly = ctrl.readonly;
            var bgcolor = ctrl.bgcolor;
            var frcolor = ctrl.color;
            var font = ctrl.font;
            var align = ctrl.align;
            var justify;
            if !align {
                justify = ', justify="left"';
            } elseif align == "center" {
                justify = ', justify="center"';
            } else {
                justify = ', justify="right"';
            };
            //按钮
            if winctrol.cls == "button" {
                var id = ctrlNameList.button + 1;
                ctrlNameList.button = id;
                owner.write('button'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('button'++id++ ' = ttk.Button(button'++id++'_frame, text="'++ text ++ '")');
                owner.write('button'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('button'++id++ '.place_forget()'); };
                if disabled { owner.write('button'++id++ '.configure(state="disabled")'); };
                 
                owner.write('button'++id++'_frame.place(x='++ x ++', y='++ y ++')');
            };
            //标签
            if winctrol.cls == "static" {
                var id = ctrlNameList.static + 1;
                ctrlNameList.static = id;
                owner.write('label'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('label'++id++ ' = ttk.Label(label'++id++'_frame, text="'++ text ++'"'++ justify ++')');
                owner.write('label'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('label'++id++ '.place_forget()'); };
                if disabled { owner.write('label'++id++ '.configure(state="disabled")'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('label'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('label'++id++'.configure(font=label'++id++'_font)');
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('label'++id++ '.config(background="'++bgcolorStr++'")');
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('label'++id++ '.config(foreground="'++frcolorStr++'")');
                };
                owner.write('label'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //文本框
            if winctrol.cls == "edit" {
                var id = ctrlNameList.edit + 1;
                ctrlNameList.edit = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('editVar' ++ id ++ " = tk.StringVar(value='"++ winctrol.text ++"')");
                owner.write('edit'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                if winctrol.multiline == 1 {
                    owner.write('edit'++id++ ' = tk.Text(edit'++id++'_frame)');
                    owner.write('edit'++id++ '.insert("end", "'++ winctrol.text ++ '")');
                } else {
                    owner.write('edit'++id++ ' = ttk.Entry(edit'++id++'_frame, textvariable=editVar'++id++justify++')');
                }
                owner.write('edit'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if ctrl.password { owner.write('edit'++id++ '.configure(show="*")'); };
                if(readonly or disabled) { owner.write('edit'++id++ '.configure(state="disabled")'); };
                if hide { owner.write('edit'++id++ '.place_forget()'); };
                if vscroll {
                    owner.write('edit'++id++'_vscroll = tk.Scrollbar(edit'++id++', orient="vertical", command=edit'++id++'.yview)');
                    owner.write('edit'++id++'.configure(yscrollcommand=edit'++id++'_vscroll.set)');
                    owner.write('edit'++id++'_vscroll.pack(side="right", fill="y")');
                };
                if hscroll {
                    owner.write('edit'++id++'_hscroll = tk.Scrollbar(edit'++id++', orient="horizontal", command=edit'++id++'.xview)');
                    owner.write('edit'++id++'.configure(xscrollcommand=edit'++id++'_hscroll.set)');
                    owner.write('edit'++id++'_hscroll.pack(side="bottom", fill="x")');
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('edit'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('edit'++id++'.configure(font=edit'++id++'_font)');
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('edit'++id++ '.config(background="'++bgcolorStr++'")');
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('edit'++id++ '.config(foreground="'++frcolorStr++'")');
                };
                owner.write('edit'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //单选
            if winctrol.cls == "radiobutton" {
                var id = ctrlNameList.radio + 1;
                ctrlNameList.radio = id;
                owner.write('radio'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('radio'++id++ ' = ttk.Radiobutton(radio'++id++'_frame, text="'++ text ++'"' ++ justify ++ ')');
                owner.write('radio'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('radio'++id++ '.place_forget()'); };
                if disabled { owner.write('radio'++id++ '.configure(state="disabled")'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('radio'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('radio'++id++'.configure(font=radio'++id++'_font)');
                };
                owner.write('radio'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //复选
            if winctrol.cls == "checkbox" {
                var id = ctrlNameList.check + 1;
                ctrlNameList.check = id;
                owner.write('check'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('check'++id++ ' = ttk.Checkbutton(check'++id++'_frame, text="'++ text ++'"'++justify++')');
                owner.write('check'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('check'++id++ '.place_forget()'); };
                if disabled { owner.write('check'++id++ '.configure(state="disabled")'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('check'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('check'++id++'.configure(font=check'++id++'_font)');
                };
                owner.write('check'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //图片框
            if winctrol.cls == "picturebox" {
                var id = ctrlNameList.pic + 1;
                ctrlNameList.pic = id;
                owner.write('pic'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                var picpath = winctrol.background;
                if picpath {
                    owner.write('img' ++ id ++ " = tk.PhotoImage(file=r'"++ picpath.path ++"')");
                    owner.write('pic' ++ id ++ ' = ttk.Label(pic'++id++'_frame, image=img'++ id ++justify++')');
                } else {
                    owner.write('pic'++id++ ' = ttk.Label(pic'++id++'_frame'++justify++')');
                }
                owner.write('pic'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('pic'++id++ '.place_forget()'); };
                if disabled { owner.write('pic'++id++ '.configure(state="disabled")'); };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('pic'++id++ '.config(background="'++bgcolorStr++'")');
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('pic'++id++ '.config(foreground="'++frcolorStr++'")');
                };
                owner.write('pic'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //画板
            if winctrol.cls == "plus" {
                var id = ctrlNameList.canvas + 1;
                ctrlNameList.canvas = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                var bgcolor = winctrol.backgroundColor;
                owner.write('canvas'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('canvas'++id++ ' = tk.Canvas(canvas'++id++'_frame)');
                owner.write('canvas'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('canvas'++id++ '.place_forget()'); };
                if disabled { owner.write('canvas'++id++ '.configure(state="disabled")'); };
                if vscroll {
                    owner.write('canvas'++id++'_vscroll = tk.Scrollbar(canvas'++id++', orient="vertical", command=canvas'++id++'.yview)');
                    owner.write('canvas'++id++'.configure(yscrollcommand=canvas'++id++'_vscroll.set)');
                    owner.write('canvas'++id++'_vscroll.pack(side="right", fill="y")');
                };
                if hscroll {
                    owner.write('canvas'++id++'_hscroll = tk.Scrollbar(canvas'++id++', orient="horizontal", command=canvas'++id++'.xview)');
                    owner.write('canvas'++id++'.configure(xscrollcommand=canvas'++id++'_hscroll.set)');
                    owner.write('canvas'++id++'_hscroll.pack(side="bottom", fill="x")');
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    bStr = ..string.slice(bgcolorStr,2,3);
                    gStr = ..string.slice(bgcolorStr,4,5);
                    rStr = ..string.slice(bgcolorStr,6,7);
                    owner.write('canvas'++id++ '.config(background="#'++rStr++gStr++bStr++'")');
                };
                owner.write('canvas'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //ListBox
            if winctrol.cls == "listbox" {
                var id = ctrlNameList.listbox + 1;
                ctrlNameList.listbox = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('list'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                var items = winctrol.items;
                if #items>0 {
                    owner.write('items'++id++' = tk.Variable(value=[', 0, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write('])');
                    owner.write('list'++id++ ' = tk.Listbox(list'++id++'_frame, listvariable=items'++ id ++ justify ++')');
                       
                } else {
                    owner.write('list'++id++ ' = tk.Listbox(list'++id++'_frame'++justify++')');
                }
                owner.write('list'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('list'++id++ '.place_forget()'); };
                if disabled { owner.write('list'++id++ '.configure(state="disabled")'); };
                if vscroll {
                    owner.write('list'++id++'_vscroll = tk.Scrollbar(list'++id++', orient="vertical", command=list'++id++'.yview)');
                    owner.write('list'++id++'.configure(yscrollcommand=list'++id++'_vscroll.set)');
                    owner.write('list'++id++'_vscroll.pack(side="right", fill="y")');
                };
                if hscroll {
                    owner.write('list'++id++'_hscroll = tk.Scrollbar(list'++id++', orient="horizontal", command=list'++id++'.xview)');
                    owner.write('list'++id++'.configure(xscrollcommand=list'++id++'_hscroll.set)');
                    owner.write('list'++id++'_hscroll.pack(side="bottom", fill="x")');
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('list'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('list'++id++'.configure(font=list'++id++'_font)');
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('list'++id++ '.config(background="'++bgcolorStr++'")');
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('list'++id++ '.config(foreground="'++frcolorStr++'")');
                };
                owner.write('list'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //下拉框
            if winctrol.cls == "combobox" {
                var id = ctrlNameList.combobox + 1;
                ctrlNameList.combobox = id;
                owner.write('combobox'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                var items = winctrol.items;
                if #items>0 {
                    owner.write('combobox'++id++ '= ttk.Combobox(combobox'++id++'_frame, value=[', 0, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write(']'++justify++')');
                       
                } else {
                    owner.write('combobox'++id++ ' = ttk.Combobox(combobox'++id++'_frame'++justify++')');
                }
                owner.write('combobox'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('combobox'++id++ '.place_forget()'); };
                if disabled { owner.write('combobox'++id++ '.configure(state="disabled")'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('combobox'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('combobox'++id++'.configure(font=combobox'++id++'_font)');
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('combobox'++id++ '.config(background="'++bgcolorStr++'")');
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('combobox'++id++ '.config(foreground="'++frcolorStr++'")');
                };
                owner.write('combobox'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //表格
            if winctrol.cls == "listview" {
                var id = ctrlNameList.treeview + 1;
                ctrlNameList.treeview = id;
                owner.write('tree'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('tree'++id++ ' = ttk.Treeview(tree'++id++'_frame)');
                owner.write('tree'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('tree'++id++ '.place_forget()'); };
                if disabled { owner.write('tree'++id++ '.configure(state="disabled")'); };
                owner.write('tree'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //进度条
            if winctrol.cls == "progress" {
                var id = ctrlNameList.progress + 1;
                ctrlNameList.progress = id;
                owner.write('progress'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('progress'++id++ ' = ttk.Progressbar(progress'++id++'_frame, value='++ value ++', maximum='++ max ++')');
                owner.write('progress'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('progress'++id++ '.place_forget()'); };
                if disabled { owner.write('progress'++id++ '.configure(state="disabled")'); };
                owner.write('progress'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //Trackbar
            if winctrol.cls == "trackbar" {
                var id = ctrlNameList.trackbar + 1;
                ctrlNameList.trackbar = id;
                owner.write('scale'++id++'_frame = ttk.Frame(width='++ width ++', height='++ height ++')');
                var min = winctrol.min;
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('scale'++id++ ' = ttk.Scale(scale'++id++'_frame, from_='++ min ++', to='++ max ++', value='++ value ++ ')');
                owner.write('scale'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')');
                if hide { owner.write('scale'++id++ '.place_forget()'); };
                if disabled { owner.write('scale'++id++ '.configure(state="disabled")'); };
                owner.write('scale'++id++ '_frame.place(x='++ x ++', y='++ y ++')');
            };
            //GroupBox
            if winctrol.cls == "groupbox" {
                var id = ctrlNameList.groupbox + 1;
                ctrlNameList.groupbox = id;
                owner.write('labelframe'++id++ ' = ttk.Labelframe(text="'++ text ++'", width='++ width ++', height='++ height ++')');
                owner.write('labelframe'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')');
                if hide { owner.write('labelframe'++id++ '.place_forget()'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('labelframe'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('labelframe'++id++'.configure(font=labelframe'++id++'_font)');
                };
            };
            //Frame
            if winctrol.cls == "custom" {
                var id = ctrlNameList.frame + 1;
                ctrlNameList.frame = id;
                owner.write('frame'++id++ ' = ttk.Frame(width='++ width ++', height='++ height ++')');
                owner.write('frame'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')');
                if hide { owner.write('frame'++id++ '.place_forget()'); };
            };
            //Tab
            if winctrol.cls == "tab" {
                var id = ctrlNameList.tab + 1;
                ctrlNameList.tab = id;
                owner.write('nb'++id++ ' = ttk.Notebook(width='++ width ++', height='++ height ++')');
                owner.write('nb'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')');
                if hide { owner.write('nb'++id++ '.place_forget()'); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('nb'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')');
                    owner.write('nb'++id++'.configure(font=nb'++id++'_font)');
                };
            };
        };
            
        owner.write('\r\n\r\n### 功能逻辑部分 ###\r\n');
            
        owner.write('root.mainloop()');
            
        return this.pycode;
    };
       
    //转换为组件
    transfer2place = function(name="SubAssembly"){
        var window_width = this.width;
        var window_height = this.height;
        var window_text = this.text;
        this.pycode = /***
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont

class ***/
        owner.write(name++'():\r\n    ### 界面设计部分 ###\r\n    \r\n    def __init__(self, master):');
        owner.write('self.mainframe = ttk.Frame(master, width='++ window_width ++', height='++ window_height ++')', 8);
        var ctrlNameList = {
            'button' = 0;
            'static' = 0;
            'edit' = 0;
            'radio' = 0;
            'check' = 0;
            'pic' = 0;
            'listbox' = 0;
            'combobox' = 0;
            'progress' = 0;
            'trackbar' = 0;
            'listview' = 0;
            'treeview' = 0;
            'canvas' = 0;
            'groupbox' = 0;
            'frame' = 0;
            'tab' = 0;
                
        };
        for ( hwnd,ctrl in this.eachControlEx() ){
            owner.write('# Z='++ctrl.z, 8);
            winctrol = this.getCtrl(hwnd);
            var x = winctrol.left;
            var y = winctrol.top;
            var width = winctrol.width;
            var height = winctrol.height;
            var text = winctrol.text;
            var hide = ctrl.hide;
            var disabled = ctrl.disabled;
            var readonly = ctrl.readonly;
            var bgcolor = ctrl.bgcolor;
            var frcolor = ctrl.color;
            var font = ctrl.font;
            var align = ctrl.align;
            var justify;
            if !align {
                justify = ', justify="left"';
            } elseif align == "center" {
                justify = ', justify="center"';
            } else {
                justify = ', justify="right"';
            };
            //按钮
            if winctrol.cls == "button" {
                var id = ctrlNameList.button + 1;
                ctrlNameList.button = id;
                owner.write('self.button'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.button'++id++ ' = ttk.Button(self.button'++id++'_frame, text="'++ text ++'")', 8);
                owner.write('self.button'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.button'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.button'++id++ '.configure(state="disabled")', 8); }; 
                owner.write('self.button'++id++'_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //标签
            if winctrol.cls == "static" {
                var id = ctrlNameList.static + 1;
                ctrlNameList.static = id;
                owner.write('self.label'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.label'++id++ ' = ttk.Label(self.label'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.label'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.label'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.label'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.label'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.label'++id++'.configure(font=self.label'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.label'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.label'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.label'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //文本框
            if winctrol.cls == "edit" {
                var id = ctrlNameList.edit + 1;
                ctrlNameList.edit = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.editVar' ++ id ++ " = tk.StringVar(value='"++ winctrol.text ++"')", 8);
                owner.write('self.edit'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                if winctrol.multiline == 1 {
                    owner.write('self.edit'++id++ ' = tk.Text(self.edit'++id++'_frame)', 8);
                    owner.write('self.edit'++id++ '.insert("end", "'++ winctrol.text ++ '")', 8);
                } else {
                    owner.write('self.edit'++id++ ' = ttk.Entry(self.edit'++id++'_frame, textvariable=self.editVar'++id++ justify ++')', 8);
                }
                owner.write('self.edit'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if ctrl.password { owner.write('self.edit'++id++ '.configure(show="*")', 8); };
                if hide { owner.write('self.edit'++id++ '.place_forget()', 8)};
                if(readonly or disabled) { owner.write('self.edit'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.edit'++id++'_vscroll = tk.Scrollbar(self.edit'++id++', orient="vertical", command=self.edit'++id++'.yview)', 8);
                    owner.write('self.edit'++id++'.configure(yscrollcommand=self.edit'++id++'_vscroll.set)', 8);
                    owner.write('self.edit'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.edit'++id++'_hscroll = tk.Scrollbar(self.edit'++id++', orient="horizontal", command=self.edit'++id++'.xview)', 8);
                    owner.write('self.edit'++id++'.configure(xscrollcommand=self.edit'++id++'_hscroll.set)', 8);
                    owner.write('self.edit'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.edit'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.edit'++id++'.configure(font=self.edit'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.edit'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.edit'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.edit'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //单选
            if winctrol.cls == "radiobutton" {
                var id = ctrlNameList.radio + 1;
                ctrlNameList.radio = id;
                owner.write('self.radio'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.radio'++id++ ' = ttk.Radiobutton(self.radio'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.radio'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.radio'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.radio'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.radio'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.radio'++id++'.configure(font=self.radio'++id++'_font)', 8);
                };
                owner.write('self.radio'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //复选
            if winctrol.cls == "checkbox" {
                var id = ctrlNameList.check + 1;
                ctrlNameList.check = id;
                owner.write('self.check'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.check'++id++ ' = ttk.Checkbutton(self.check'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.check'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.check'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.check'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.check'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.check'++id++'.configure(font=self.check'++id++'_font)', 8);
                };
                owner.write('self.check'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //图片框
            if winctrol.cls == "picturebox" {
                var id = ctrlNameList.pic + 1;
                ctrlNameList.pic = id;
                owner.write('self.pic'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var picpath = winctrol.background;
                if picpath {
                    owner.write('self.img' ++ id ++ " = tk.PhotoImage(file=r'"++ picpath.path ++"')", 8);
                    owner.write('self.pic' ++ id ++ ' = ttk.Label(self.pic'++id++'_frame, image=self.img'++ id ++ justify ++')', 8);
                } else {
                    owner.write('self.pic'++id++ ' = ttk.Label(self.pic'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.pic'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.pic'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.pic'++id++ '.configure(state="disabled")', 8); };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.pic'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.pic'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.pic'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
              
            //画板
            if winctrol.cls == "plus" {
                var id = ctrlNameList.canvas + 1;
                ctrlNameList.canvas = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                var bgcolor = winctrol.backgroundColor;
                owner.write('self.canvas'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.canvas'++id++ ' = tk.Canvas(self.canvas'++id++'_frame)', 8);
                owner.write('self.canvas'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.canvas'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.canvas'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.canvas'++id++'_vscroll = tk.Scrollbar(self.canvas'++id++', orient="vertical", command=self.canvas'++id++'.yview)', 8);
                    owner.write('self.canvas'++id++'.configure(yscrollcommand=self.canvas'++id++'_vscroll.set)', 8);
                    owner.write('self.canvas'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.canvas'++id++'_hscroll = tk.Scrollbar(self.canvas'++id++', orient="horizontal", command=self.canvas'++id++'.xview)', 8);
                    owner.write('self.canvas'++id++'.configure(xscrollcommand=self.canvas'++id++'_hscroll.set)', 8);
                    owner.write('self.canvas'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    bStr = ..string.slice(bgcolorStr,2,3);
                    gStr = ..string.slice(bgcolorStr,4,5);
                    rStr = ..string.slice(bgcolorStr,6,7);
                    owner.write('self.canvas'++id++ '.config(background="#'++rStr++gStr++bStr++'")', 8);
                };
                owner.write('self.canvas'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
              
            //ListBox
            if winctrol.cls == "listbox" {
                var id = ctrlNameList.listbox + 1;
                ctrlNameList.listbox = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.list'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.items'++id++' = tk.Variable(value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write('])', 0);
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame, listvariable=self.items'++ id ++ justify ++')', 8);
                       
                } else {
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.list'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.list'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.list'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.list'++id++'_vscroll = tk.Scrollbar(self.list'++id++', orient="vertical", command=self.list'++id++'.yview)', 8);
                    owner.write('self.list'++id++'.configure(yscrollcommand=self.list'++id++'_vscroll.set)', 8);
                    owner.write('self.list'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.list'++id++'_hscroll = tk.Scrollbar(self.list'++id++', orient="horizontal", command=self.list'++id++'.xview)', 8);
                    owner.write('self.list'++id++'.configure(xscrollcommand=self.list'++id++'_hscroll.set)', 8);
                    owner.write('self.list'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.list'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.list'++id++'.configure(font=self.list'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.list'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.list'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.list'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //下拉框
            if winctrol.cls == "combobox" {
                var id = ctrlNameList.combobox + 1;
                ctrlNameList.combobox = id;
                owner.write('self.combobox'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.combobox'++id++ '= ttk.Combobox(self.combobox'++id++'_frame, value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write(']'++ justify ++')', 0);
                       
                } else {
                    owner.write('self.combobox'++id++ ' = ttk.Combobox(self.combobox'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.combobox'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.combobox'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.combobox'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.combobox'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.combobox'++id++'.configure(font=self.combobox'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.combobox'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.combobox'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.combobox'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
              
            //表格
            if winctrol.cls == "listview" {
                var id = ctrlNameList.treeview + 1;
                ctrlNameList.treeview = id;
                owner.write('self.tree'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.tree'++id++ ' = ttk.Treeview(self.tree'++id++'_frame)', 8);
                owner.write('self.tree'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.tree'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.tree'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.tree'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
              
            //进度条
            if winctrol.cls == "progress" {
                var id = ctrlNameList.progress + 1;
                ctrlNameList.progress = id;
                owner.write('self.progress'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.progress'++id++ ' = ttk.Progressbar(self.progress'++id++'_frame, value='++ value ++', maximum='++ max ++')', 8);
                owner.write('self.progress'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.progress'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.progress'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.progress'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //Trackbar
            if winctrol.cls == "trackbar" {
                var id = ctrlNameList.trackbar + 1;
                ctrlNameList.trackbar = id;
                owner.write('self.scale'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var min = winctrol.min;
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.scale'++id++ ' = ttk.Scale(self.scale'++id++'_frame, from_='++ min ++', to='++ max ++', value='++ value ++ ')', 8);
                owner.write('self.scale'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.scale'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.scale'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.scale'++id++ '_frame.place(x='++ x ++', y='++ y ++')', 8);
            };
               
            //GroupBox
            if winctrol.cls == "groupbox" {
                var id = ctrlNameList.groupbox + 1;
                ctrlNameList.groupbox = id;
                owner.write('self.labelframe'++id++ ' = ttk.Labelframe(self.mainframe, text="'++ text ++'", width='++ width ++', height='++ height ++')', 8);
                owner.write('self.labelframe'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.labelframe'++id++ '.place_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.labelframe'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.labelframe'++id++'.configure(font=self.labelframe'++id++'_font)', 8);
                };
            };
               
            //Frame
            if winctrol.cls == "custom" {
                var id = ctrlNameList.frame + 1;
                ctrlNameList.frame = id;
                owner.write('self.frame'++id++ ' = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.frame'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.frame'++id++ '.place_forget()', 8); };
            };
               
            //Tab
            if winctrol.cls == "tab" {
                var id = ctrlNameList.tab + 1;
                ctrlNameList.tab = id;
                owner.write('self.nb'++id++ ' = ttk.Notebook(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.nb'++id++ '.place(x='++ x ++', y='++ y ++', width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.nb'++id++ '.place_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.nb'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.nb'++id++'.configure(font=self.nb'++id++'_font)', 8);
                };
            };
        };
          
        owner.write('self.mainframe.pack()', 8);
          
        owner.write('\r\n    ### 功能逻辑部分 ###\r\n\r\n', 0);
          
        return this.pycode;
    };
     
    //转换为组件(pack方式)
    transfer2pack = function(name="SubAssembly"){
        var window_width = this.width;
        var window_height = this.height;
        var window_text = this.text;
        this.pycode = /***
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont

class ***/
        owner.write(name++'():\r\n    ### 界面设计部分 ###\r\n    \r\n    def __init__(self, master):');
        owner.write('self.mainframe = ttk.Frame(master, width='++ window_width ++', height='++ window_height ++')', 8);
        var ctrlNameList = {
            'button' = 0;
            'static' = 0;
            'edit' = 0;
            'radio' = 0;
            'check' = 0;
            'pic' = 0;
            'listbox' = 0;
            'combobox' = 0;
            'progress' = 0;
            'trackbar' = 0;
            'listview' = 0;
            'treeview' = 0;
            'canvas' = 0;
            'groupbox' = 0;
            'frame' = 0;
            'tab' = 0;
                
        };
        for ( hwnd,ctrl in this.eachControlEx() ){
            owner.write('# Z='++ctrl.z, 8);
            winctrol = this.getCtrl(hwnd);
            var x = winctrol.left;
            var y = winctrol.top;
            var width = winctrol.width;
            var height = winctrol.height;
            var text = winctrol.text;
            var hide = ctrl.hide;
            var disabled = ctrl.disabled;
            var readonly = ctrl.readonly;
            var bgcolor = ctrl.bgcolor;
            var frcolor = ctrl.color;
            var font = ctrl.font;
            var align = ctrl.align;
            var justify;
            if !align {
                justify = ', justify="left"';
            } elseif align == "center" {
                justify = ', justify="center"';
            } else {
                justify = ', justify="right"';
            };
            //按钮
            if winctrol.cls == "button" {
                var id = ctrlNameList.button + 1;
                ctrlNameList.button = id;
                owner.write('self.button'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.button'++id++ ' = ttk.Button(self.button'++id++'_frame, text="'++ text ++'")', 8);
                owner.write('self.button'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.button'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.button'++id++ '.configure(state="disabled")', 8); }; 
                owner.write('self.button'++id++'_frame.pack()', 8);
            };
               
            //标签
            if winctrol.cls == "static" {
                var id = ctrlNameList.static + 1;
                ctrlNameList.static = id;
                owner.write('self.label'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.label'++id++ ' = ttk.Label(self.label'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.label'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.label'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.label'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.label'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.label'++id++'.configure(font=self.label'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.label'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.label'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.label'++id++ '_frame.pack()', 8);
            };
               
            //文本框
            if winctrol.cls == "edit" {
                var id = ctrlNameList.edit + 1;
                ctrlNameList.edit = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.editVar' ++ id ++ " = tk.StringVar(value='"++ winctrol.text ++"')", 8);
                owner.write('self.edit'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                if winctrol.multiline == 1 {
                    owner.write('self.edit'++id++ ' = tk.Text(self.edit'++id++'_frame)', 8);
                    owner.write('self.edit'++id++ '.insert("end", "'++ winctrol.text ++ '")', 8);
                } else {
                    owner.write('self.edit'++id++ ' = ttk.Entry(self.edit'++id++'_frame, textvariable=self.editVar'++id++ justify ++')', 8);
                }
                owner.write('self.edit'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if ctrl.password { owner.write('self.edit'++id++ '.configure(show="*")', 8); };
                if hide { owner.write('self.edit'++id++ '.place_forget()', 8)};
                if(readonly or disabled) { owner.write('self.edit'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.edit'++id++'_vscroll = tk.Scrollbar(self.edit'++id++', orient="vertical", command=self.edit'++id++'.yview)', 8);
                    owner.write('self.edit'++id++'.configure(yscrollcommand=self.edit'++id++'_vscroll.set)', 8);
                    owner.write('self.edit'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.edit'++id++'_hscroll = tk.Scrollbar(self.edit'++id++', orient="horizontal", command=self.edit'++id++'.xview)', 8);
                    owner.write('self.edit'++id++'.configure(xscrollcommand=self.edit'++id++'_hscroll.set)', 8);
                    owner.write('self.edit'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.edit'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.edit'++id++'.configure(font=self.edit'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.edit'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.edit'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.edit'++id++ '_frame.pack()', 8);
            };
               
            //单选
            if winctrol.cls == "radiobutton" {
                var id = ctrlNameList.radio + 1;
                ctrlNameList.radio = id;
                owner.write('self.radio'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.radio'++id++ ' = ttk.Radiobutton(self.radio'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.radio'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.radio'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.radio'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.radio'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.radio'++id++'.configure(font=self.radio'++id++'_font)', 8);
                };
                owner.write('self.radio'++id++ '_frame.pack()', 8);
            };
               
            //复选
            if winctrol.cls == "checkbox" {
                var id = ctrlNameList.check + 1;
                ctrlNameList.check = id;
                owner.write('self.check'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.check'++id++ ' = ttk.Checkbutton(self.check'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.check'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.check'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.check'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.check'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.check'++id++'.configure(font=self.check'++id++'_font)', 8);
                };
                owner.write('self.check'++id++ '_frame.pack()', 8);
            };
               
            //图片框
            if winctrol.cls == "picturebox" {
                var id = ctrlNameList.pic + 1;
                ctrlNameList.pic = id;
                owner.write('self.pic'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var picpath = winctrol.background;
                if picpath {
                    owner.write('self.img' ++ id ++ " = tk.PhotoImage(file=r'"++ picpath.path ++"')", 8);
                    owner.write('self.pic' ++ id ++ ' = ttk.Label(self.pic'++id++'_frame, image=self.img'++ id ++ justify ++')', 8);
                } else {
                    owner.write('self.pic'++id++ ' = ttk.Label(self.pic'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.pic'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.pic'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.pic'++id++ '.configure(state="disabled")', 8); };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.pic'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.pic'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.pic'++id++ '_frame.pack()', 8);
            };
              
            //画板
            if winctrol.cls == "plus" {
                var id = ctrlNameList.canvas + 1;
                ctrlNameList.canvas = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                var bgcolor = winctrol.backgroundColor;
                owner.write('self.canvas'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.canvas'++id++ ' = tk.Canvas(self.canvas'++id++'_frame)', 8);
                owner.write('self.canvas'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.canvas'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.canvas'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.canvas'++id++'_vscroll = tk.Scrollbar(self.canvas'++id++', orient="vertical", command=self.canvas'++id++'.yview)', 8);
                    owner.write('self.canvas'++id++'.configure(yscrollcommand=self.canvas'++id++'_vscroll.set)', 8);
                    owner.write('self.canvas'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.canvas'++id++'_hscroll = tk.Scrollbar(self.canvas'++id++', orient="horizontal", command=self.canvas'++id++'.xview)', 8);
                    owner.write('self.canvas'++id++'.configure(xscrollcommand=self.canvas'++id++'_hscroll.set)', 8);
                    owner.write('self.canvas'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    bStr = ..string.slice(bgcolorStr,2,3);
                    gStr = ..string.slice(bgcolorStr,4,5);
                    rStr = ..string.slice(bgcolorStr,6,7);
                    owner.write('self.canvas'++id++ '.config(background="#'++rStr++gStr++bStr++'")', 8);
                };
                owner.write('self.canvas'++id++ '_frame.pack()', 8);
            };
              
            //ListBox
            if winctrol.cls == "listbox" {
                var id = ctrlNameList.listbox + 1;
                ctrlNameList.listbox = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.list'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.items'++id++' = tk.Variable(value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write('])', 0);
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame, listvariable=self.items'++ id ++ justify ++')', 8);
                       
                } else {
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.list'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.list'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.list'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.list'++id++'_vscroll = tk.Scrollbar(self.list'++id++', orient="vertical", command=self.list'++id++'.yview)', 8);
                    owner.write('self.list'++id++'.configure(yscrollcommand=self.list'++id++'_vscroll.set)', 8);
                    owner.write('self.list'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.list'++id++'_hscroll = tk.Scrollbar(self.list'++id++', orient="horizontal", command=self.list'++id++'.xview)', 8);
                    owner.write('self.list'++id++'.configure(xscrollcommand=self.list'++id++'_hscroll.set)', 8);
                    owner.write('self.list'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.list'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.list'++id++'.configure(font=self.list'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.list'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.list'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.list'++id++ '_frame.pack()', 8);
            };
               
            //下拉框
            if winctrol.cls == "combobox" {
                var id = ctrlNameList.combobox + 1;
                ctrlNameList.combobox = id;
                owner.write('self.combobox'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.combobox'++id++ '= ttk.Combobox(self.combobox'++id++'_frame, value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write(']'++ justify ++')', 0);
                       
                } else {
                    owner.write('self.combobox'++id++ ' = ttk.Combobox(self.combobox'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.combobox'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.combobox'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.combobox'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.combobox'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.combobox'++id++'.configure(font=self.combobox'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.combobox'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.combobox'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.combobox'++id++ '_frame.pack()', 8);
            };
              
            //表格
            if winctrol.cls == "listview" {
                var id = ctrlNameList.treeview + 1;
                ctrlNameList.treeview = id;
                owner.write('self.tree'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.tree'++id++ ' = ttk.Treeview(self.tree'++id++'_frame)', 8);
                owner.write('self.tree'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.tree'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.tree'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.tree'++id++ '_frame.pack()', 8);
            };
              
            //进度条
            if winctrol.cls == "progress" {
                var id = ctrlNameList.progress + 1;
                ctrlNameList.progress = id;
                owner.write('self.progress'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.progress'++id++ ' = ttk.Progressbar(self.progress'++id++'_frame, value='++ value ++', maximum='++ max ++')', 8);
                owner.write('self.progress'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.progress'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.progress'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.progress'++id++ '_frame.pack()', 8);
            };
               
            //Trackbar
            if winctrol.cls == "trackbar" {
                var id = ctrlNameList.trackbar + 1;
                ctrlNameList.trackbar = id;
                owner.write('self.scale'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var min = winctrol.min;
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.scale'++id++ ' = ttk.Scale(self.scale'++id++'_frame, from_='++ min ++', to='++ max ++', value='++ value ++ ')', 8);
                owner.write('self.scale'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.scale'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.scale'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.scale'++id++ '_frame.pack()', 8);
            };
               
            //GroupBox
            if winctrol.cls == "groupbox" {
                var id = ctrlNameList.groupbox + 1;
                ctrlNameList.groupbox = id;
                owner.write('self.labelframe'++id++ ' = ttk.Labelframe(self.mainframe, text="'++ text ++'", width='++ width ++', height='++ height ++')', 8);
                owner.write('self.labelframe'++id++ '.pack()', 8);
                if hide { owner.write('self.labelframe'++id++ '.pack_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.labelframe'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.labelframe'++id++'.configure(font=self.labelframe'++id++'_font)', 8);
                };
            };
               
            //Frame
            if winctrol.cls == "custom" {
                var id = ctrlNameList.frame + 1;
                ctrlNameList.frame = id;
                owner.write('self.frame'++id++ ' = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.frame'++id++ '.pack()', 8);
                if hide { owner.write('self.frame'++id++ '.pack_forget()', 8); };
            };
               
            //Tab
            if winctrol.cls == "tab" {
                var id = ctrlNameList.tab + 1;
                ctrlNameList.tab = id;
                owner.write('self.nb'++id++ ' = ttk.Notebook(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.nb'++id++ '.pack()', 8);
                if hide { owner.write('self.nb'++id++ '.pack_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.nb'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.nb'++id++'.configure(font=self.nb'++id++'_font)', 8);
                };
            };
        };
          
        owner.write('self.mainframe.pack()', 8);
          
        owner.write('\r\n    ### 功能逻辑部分 ###\r\n\r\n', 0);
          
        return this.pycode;
    };
     
    //转换为组件(grid方式)
    transfer2grid = function(name="SubAssembly"){
        var window_width = this.width;
        var window_height = this.height;
        var window_text = this.text;
        this.pycode = /***
import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkFont

class ***/
        owner.write(name++'():\r\n    ### 界面设计部分 ###\r\n    \r\n    def __init__(self, master):', 0)
        owner.write('self.mainframe = ttk.Frame(master, width='++ window_width ++', height='++ window_height ++')', 8);
        var ctrlNameList = {
            'button' = 0;
            'static' = 0;
            'edit' = 0;
            'radio' = 0;
            'check' = 0;
            'pic' = 0;
            'listbox' = 0;
            'combobox' = 0;
            'progress' = 0;
            'trackbar' = 0;
            'listview' = 0;
            'treeview' = 0;
            'canvas' = 0;
            'groupbox' = 0;
            'frame' = 0;
            'tab' = 0;
                
        };
        var col = 0;
        var row = 0;
        for ( hwnd,ctrl in this.eachControlEx() ){
            owner.write('# Z='++ctrl.z, 8);
            winctrol = this.getCtrl(hwnd);
            var width = winctrol.width;
            var height = winctrol.height;
            var text = winctrol.text;
            var hide = ctrl.hide;
            var disabled = ctrl.disabled;
            var readonly = ctrl.readonly;
            var bgcolor = ctrl.bgcolor;
            var frcolor = ctrl.color;
            var font = ctrl.font;
            var align = ctrl.align;
            var justify;
            if !align {
                justify = ', justify="left"';
            } elseif align == "center" {
                justify = ', justify="center"';
            } else {
                justify = ', justify="right"';
            };
            //按钮
            if winctrol.cls == "button" {
                row++;
                var id = ctrlNameList.button + 1;
                ctrlNameList.button = id;
                owner.write('self.button'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.button'++id++ ' = ttk.Button(self.button'++id++'_frame, text="'++ text ++'")', 8);
                owner.write('self.button'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.button'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.button'++id++ '.configure(state="disabled")', 8); }; 
                 
                owner.write('self.button'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //标签
            if winctrol.cls == "static" {
                row++;
                var id = ctrlNameList.static + 1;
                ctrlNameList.static = id;
                owner.write('self.label'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.label'++id++ ' = ttk.Label(self.label'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.label'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.label'++id++ '.place_forget()', 8)};
                if disabled { owner.write('self.label'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.label'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.label'++id++'.configure(font=self.label'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.label'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.label'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.label'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //文本框
            if winctrol.cls == "edit" {
                col++;
                var id = ctrlNameList.edit + 1;
                ctrlNameList.edit = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.editVar' ++ id ++ " = tk.StringVar(value='"++ winctrol.text ++"')", 8);
                owner.write('self.edit'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                if winctrol.multiline == 1 {
                    owner.write('self.edit'++id++ ' = tk.Text(self.edit'++id++'_frame)', 8);
                    owner.write('self.edit'++id++ '.insert("end", "'++ winctrol.text ++ '")', 8);
                } else {
                    owner.write('self.edit'++id++ ' = ttk.Entry(self.edit'++id++'_frame, textvariable=self.editVar'++id++ justify ++')', 8);
                }
                owner.write('self.edit'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if ctrl.password { owner.write('self.edit'++id++ '.configure(show="*")', 8); };
                if hide { owner.write('self.edit'++id++ '.place_forget()', 8)};
                if(readonly or disabled) { owner.write('self.edit'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.edit'++id++'_vscroll = tk.Scrollbar(self.edit'++id++', orient="vertical", command=self.edit'++id++'.yview)', 8);
                    owner.write('self.edit'++id++'.configure(yscrollcommand=self.edit'++id++'_vscroll.set)', 8);
                    owner.write('self.edit'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.edit'++id++'_hscroll = tk.Scrollbar(self.edit'++id++', orient="horizontal", command=self.edit'++id++'.xview)', 8);
                    owner.write('self.edit'++id++'.configure(xscrollcommand=self.edit'++id++'_hscroll.set)', 8);
                    owner.write('self.edit'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.edit'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.edit'++id++'.configure(font=self.edit'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.edit'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.edit'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.edit'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //单选
            if winctrol.cls == "radiobutton" {
                col++;
                var id = ctrlNameList.radio + 1;
                ctrlNameList.radio = id;
                owner.write('self.radio'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.radio'++id++ ' = ttk.Radiobutton(self.radio'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.radio'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.radio'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.radio'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.radio'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.radio'++id++'.configure(font=self.radio'++id++'_font)', 8);
                };
                owner.write('self.radio'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //复选
            if winctrol.cls == "checkbox" {
                col++;
                var id = ctrlNameList.check + 1;
                ctrlNameList.check = id;
                owner.write('self.check'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.check'++id++ ' = ttk.Checkbutton(self.check'++id++'_frame, text="'++ text ++'"'++ justify ++')', 8);
                owner.write('self.check'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.check'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.check'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.check'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.check'++id++'.configure(font=self.check'++id++'_font)', 8);
                };
                owner.write('self.check'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //图片框
            if winctrol.cls == "picturebox" {
                row++;
                var id = ctrlNameList.pic + 1;
                ctrlNameList.pic = id;
                owner.write('self.pic'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var picpath = winctrol.background;
                if picpath {
                    owner.write('self.img' ++ id ++ " = tk.PhotoImage(file=r'"++ picpath.path ++"')", 8);
                    owner.write('self.pic' ++ id ++ ' = ttk.Label(self.pic'++id++'_frame, image=self.img'++ id ++ justify ++')', 8);
                } else {
                    owner.write('self.pic'++id++ ' = ttk.Label(self.pic'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.pic'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.pic'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.pic'++id++ '.configure(state="disabled")', 8); };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.pic'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.pic'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.pic'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
              
            //画板
            if winctrol.cls == "plus" {
                row++;
                var id = ctrlNameList.canvas + 1;
                ctrlNameList.canvas = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                var bgcolor = winctrol.backgroundColor;
                owner.write('self.canvas'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.canvas'++id++ ' = tk.Canvas(self.canvas'++id++'_frame)', 8);
                owner.write('self.canvas'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.canvas'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.canvas'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.canvas'++id++'_vscroll = tk.Scrollbar(self.canvas'++id++', orient="vertical", command=self.canvas'++id++'.yview)', 8);
                    owner.write('self.canvas'++id++'.configure(yscrollcommand=self.canvas'++id++'_vscroll.set)', 8);
                    owner.write('self.canvas'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.canvas'++id++'_hscroll = tk.Scrollbar(self.canvas'++id++', orient="horizontal", command=self.canvas'++id++'.xview)', 8);
                    owner.write('self.canvas'++id++'.configure(xscrollcommand=self.canvas'++id++'_hscroll.set)', 8);
                    owner.write('self.canvas'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    bStr = ..string.slice(bgcolorStr,2,3);
                    gStr = ..string.slice(bgcolorStr,4,5);
                    rStr = ..string.slice(bgcolorStr,6,7);
                    owner.write('self.canvas'++id++ '.config(background="#'++rStr++gStr++bStr++'")', 8);
                };
                owner.write('self.canvas'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
              
            //ListBox
            if winctrol.cls == "listbox" {
                row++;
                var id = ctrlNameList.listbox + 1;
                ctrlNameList.listbox = id;
                var vscroll = ctrl.vscroll;
                var hscroll = ctrl.hscroll;
                owner.write('self.list'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.items'++id++' = tk.Variable(value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write('])', 0);
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame, listvariable=self.items'++ id ++ justify ++')', 8);
                       
                } else {
                    owner.write('self.list'++id++ ' = tk.Listbox(self.list'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.list'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.list'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.list'++id++ '.configure(state="disabled")', 8); };
                if vscroll {
                    owner.write('self.list'++id++'_vscroll = tk.Scrollbar(self.list'++id++', orient="vertical", command=self.list'++id++'.yview)', 8);
                    owner.write('self.list'++id++'.configure(yscrollcommand=self.list'++id++'_vscroll.set)', 8);
                    owner.write('self.list'++id++'_vscroll.pack(side="right", fill="y")', 8);
                };
                if hscroll {
                    owner.write('self.list'++id++'_hscroll = tk.Scrollbar(self.list'++id++', orient="horizontal", command=self.list'++id++'.xview)', 8);
                    owner.write('self.list'++id++'.configure(xscrollcommand=self.list'++id++'_hscroll.set)', 8);
                    owner.write('self.list'++id++'_hscroll.pack(side="bottom", fill="x")', 8);
                };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.list'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.list'++id++'.configure(font=self.list'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.list'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.list'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.list'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //下拉框
            if winctrol.cls == "combobox" {
                col++;
                var id = ctrlNameList.combobox + 1;
                ctrlNameList.combobox = id;
                owner.write('self.combobox'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var items = winctrol.items;
                if #items>0 {
                    owner.write('self.combobox'++id++ '= ttk.Combobox(self.combobox'++id++'_frame, value=[', 8, "");
                    for i,item in items {
                        owner.write('"' ++ item ++'", ', 0, "");
                    }
                    owner.write(']'++ justify ++')', 0);
                       
                } else {
                    owner.write('self.combobox'++id++ ' = ttk.Combobox(self.combobox'++id++'_frame'++ justify ++')', 8);
                }
                owner.write('self.combobox'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.combobox'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.combobox'++id++ '.configure(state="disabled")', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.combobox'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.combobox'++id++'.configure(font=self.combobox'++id++'_font)', 8);
                };
                if bgcolor {
                    bgcolorStr = ..color.stringify(bgcolor,false);
                    owner.write('self.combobox'++id++ '.config(background="'++bgcolorStr++'")', 8);
                };
                if frcolor {
                    frcolorStr = ..color.stringify(frcolor,false);
                    owner.write('self.combobox'++id++ '.config(foreground="'++frcolorStr++'")', 8);
                };
                owner.write('self.combobox'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
              
            //表格
            if winctrol.cls == "listview" {
                row++;
                var id = ctrlNameList.treeview + 1;
                ctrlNameList.treeview = id;
                owner.write('self.tree'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.tree'++id++ ' = ttk.Treeview(self.tree'++id++'_frame)', 8);
                owner.write('self.tree'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.tree'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.tree'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.tree'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
              
            //进度条
            if winctrol.cls == "progress" {
                row++;
                var id = ctrlNameList.progress + 1;
                ctrlNameList.progress = id;
                owner.write('self.progress'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.progress'++id++ ' = ttk.Progressbar(self.progress'++id++'_frame, value='++ value ++', maximum='++ max ++')', 8);
                owner.write('self.progress'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.progress'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.progress'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.progress'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //Trackbar
            if winctrol.cls == "trackbar" {
                col++;
                var id = ctrlNameList.trackbar + 1;
                ctrlNameList.trackbar = id;
                owner.write('self.scale'++id++'_frame = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                var min = winctrol.min;
                var max = winctrol.max;
                var value = winctrol.pos;
                owner.write('self.scale'++id++ ' = ttk.Scale(self.scale'++id++'_frame, from_='++ min ++', to='++ max ++', value='++ value ++ ')', 8);
                owner.write('self.scale'++id++ '.place(x=0, y=0, width='++ width ++', height='++ height ++')', 8);
                if hide { owner.write('self.scale'++id++ '.place_forget()', 8); };
                if disabled { owner.write('self.scale'++id++ '.configure(state="disabled")', 8); };
                owner.write('self.scale'++id++'_frame.grid(column='++col++', row='++row++')', 8);
            };
               
            //GroupBox
            if winctrol.cls == "groupbox" {
                row++;
                var id = ctrlNameList.groupbox + 1;
                ctrlNameList.groupbox = id;
                owner.write('self.labelframe'++id++ ' = ttk.Labelframe(self.mainframe, text="'++ text ++'", width='++ width ++', height='++ height ++')', 8);
                owner.write('self.labelframe'++id++'.grid(column='++col++', row='++row++')', 8);
                if hide { owner.write('self.labelframe'++id++ '.grid_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.labelframe'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.labelframe'++id++'.configure(font=self.labelframe'++id++'_font)', 8);
                };
            };
               
            //Frame
            if winctrol.cls == "custom" {
                row++;
                var id = ctrlNameList.frame + 1;
                ctrlNameList.frame = id;
                owner.write('self.frame'++id++ ' = ttk.Frame(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.frame'++id++'.grid(column='++col++', row='++row++')', 8);
                if hide { owner.write('self.frame'++id++ '.grid_forget()', 8); };
            };
               
            //Tab
            if winctrol.cls == "tab" {
                row++
                var id = ctrlNameList.tab + 1;
                ctrlNameList.tab = id;
                owner.write('self.nb'++id++ ' = ttk.Notebook(self.mainframe, width='++ width ++', height='++ height ++')', 8);
                owner.write('self.nb'++id++'.grid(column='++col++', row='++row++')', 8);
                if hide { owner.write('self.nb'++id++ '.grid_forget()', 8); };
                if font {
                    var italic = font.italic ? 'slant="italic"' : 'slant="roman"';
                    var weight = font.weight==700 ? 'weight="bold"' : 'weight="normal"';
                    var family = 'family="'+font.name+'"';
                    var underline = font.underline ? 'underline=True' : 'underline=False';
                    var size = 'size='++..math.round(font.h*(-3)/4);
                    owner.write('self.nb'++id++'_font = tkFont.Font(' ++ ..string.join({family; size; weight; italic; underline}, ", ") ++ ')', 8);
                    owner.write('self.nb'++id++'.configure(font=self.nb'++id++'_font)', 8);
                };
            };
        };
          
        owner.write('self.mainframe.pack()', 8);
          
        owner.write('\r\n    ### 功能逻辑部分 ###\r\n\r\n', 0);
          
        return this.pycode;
    };
    
    translateName = function(formStr){
    	var pattern = "(\w+)=\{.*?z=(\d\d?)\}";
    	var results = ..string.matches(formStr, pattern);
    	for i, result in results {
    		var name = result[1];
    		var z = result[2];
    		owner.write('# Z='++z++' -> '++name);
    	};
    	return this.pycode;
    }
    

}
   
/**intellisense()
GUI2Py = 解析aardio界面生成Python Tkinter
GUI2Py.GUI2Tk(.(winform界面窗体) = 返回解析对象
?GUI2Py.GUI2Tk = !GUI2Py_GUI2Tk.
GUI2Py.GUI2Tk() = !GUI2Py_GUI2Tk.
!GUI2Py_GUI2Tk.transfer2root( ) = 组件按place方式布局,返回的代码用于生成主界面
!GUI2Py_GUI2Tk.transfer2place(.( "组件名称" ) = 组件按place方式布局,返回的代码用于生成组件类
!GUI2Py_GUI2Tk.transfer2pack(.( "组件名称" ) = 组件按pack方式布局,返回的代码用于生成组件类\n生成代码后,需手动添加pack参数:\nside=['top','left','bottom','right'], fill=['x','y','both','none']
!GUI2Py_GUI2Tk.transfer2grid(.( "组件名称" ) = 组件按grid方式布局,返回的代码用于生成组件类\n生成代码后,需手动调整grid参数:\ncolumn为所在列,起始为0;row为所在行,起始为0
!GUI2Py_GUI2Tk.translateName(.( winform_DSG ) = 解析窗体设计器代码,返回的Z序与对应控件名称,可用来替换python中的控件名
end intellisense**/


16 个回复 | 最后更新于 2022-07-18
2022-07-21   #1

20220724更新

调用

import GUI2Py

g3 = GUI2Py.GUI2Tk( mainForm);
code = g3.transfer2root( )/*返回的代码用于生成主界面*/

生成的python代码,界面部分可直接运行,逻辑部分需自行添加相应功能

import tkinter as tk
import tkinter.ttk as ttk
 
root = tk.Tk()
 
### 界面设计部分 ###
 
root.geometry("672x626")
root.title("Visual")
editVar1 = tk.StringVar(value='Edit')
edit1_frame = ttk.Frame(width=247, height=106)
edit1 = tk.Text(edit1_frame)
edit1.insert("end", "Edit")
edit1.place(x=0, y=0)
edit1_frame.place(x=200, y=191)


### 功能逻辑部分 ###

root.mainloop()


2022-07-21   #2

牛批 , 这个想法不错, 如果弄好了估计会有很多Python人支持, 这是妥妥的生产力工具啊, 哈

开源到github让更多的人参与.

2022-07-21   #3

真会玩....

赞一个

2022-07-21   #4
import GUI2Py

g3 = GUI2Py.GUI2Tk( mainForm);
code = g3.transfer2assembly( "SubAss" ) /*返回的代码用于生成组件类*/

生成组件化界面

import tkinter as tk
import tkinter.ttk as ttk

class SubAss():
    def __init__(self, master):
        self.SubAss = ttk.Frame(master, width=672, height=626)
        self.editVar1 = tk.StringVar(value='Edit')
        self.edit1_frame = ttk.Frame(self.SubAss, width=247, height=106)
        self.edit1 = tk.Text(self.edit1_frame)
        self.edit1.insert("end", "Edit")
        self.edit1.place(x=0, y=0)
        self.edit1_frame.place(x=200, y=191)
        self.SubAss.pack()

只需在窗口实例化,即可重复调用

root = tk.Tk()
sa = SubAss(root)

root.mainloop()

生成的界面几乎和aardio里的是一样的(相同大小和位置)

捕获.PNG

2022-07-22   #5

这个不错,赞

2022-07-22   #6

调用GUI2Python生成Python代码后,可以在### 功能逻辑 ### 代码部分添加相应需要实现的功能,例如:

### 功能逻辑部分 ###
def callback():
    print('callback')
button1.configure(command=callback,)

这样就可以把功能绑定到按钮上,其他控件都类似。

快捷键绑定可以用bind命令,例如:

### 功能逻辑部分 ###
def callback(event):
    print('x:', event.x, 'y:', event.y)
button1.bind('<F1>', func=callback)


2022-07-22   #7

牛逼啊

2022-07-24   #8

更新组件化界面功能,这样可以像aardio一样把不同的界面拆成单独的组件,然后在Tabs高级选项卡(python中对应的就是Notebook)进行调用。


新增了“隐藏”属性支持和背景色、前景色设置支持(仅对标签、文本框等控件有效)


新增Canvas控件,对应aardio的plus

捕获.PNG

最下面的白框是Treeview控件,对应aardio的listview,Treeview控件的宽度需要insert column后进行调节

2022-07-25   #9

我从github上把作者的内容搬运了过来,真得十分感谢jerryxjr开源,试用中...

import win.ui;
/*DSG{{*/
mainForm = win.form(text="Window Title";right=596;bottom=383)
mainForm.add(
button2={cls="button";text="Button";left=242;top=261;right=369;bottom=293;z=3};
edit2={cls="edit";text="Text";left=217;top=117;right=399;bottom=234;edge=1;multiline=1;z=2};
static2={cls="static";text="Hello, Python!";left=218;top=74;right=373;bottom=103;transparent=1;z=1}
)
/*}}*/

import console;
console.open();

import GUI2Py;
g2t = GUI2Py.GUI2Tk(mainForm);
code = g2t.transfer2root();
mainForm.edit2.text = code;

console.log(code);

mainForm.show();
return win.loopMessage();


2022-07-25   #10

回复#9 @hi_aardio :

推荐尝试组件化的方式构建Tkinter,程序看起来更有层次。

例如,用aardio构建界面后,在功能逻辑部分加上要实现的功能,实例化后即可实现。

import tkinter as tk
import tkinter.ttk as ttk
from PIL import Image, ImageTk
import numpy as np
import matplotlib.pyplot as plt
from io import BytesIO
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg

class SubAssembly():
    ### 界面设计部分 ###

    def __init__(self, master):
        self.SubAssembly = ttk.Frame(master, width=672, height=626)
        self.frame = ttk.Frame(self.SubAssembly, width=500, height=400)
        self.label = ttk.Label(self.frame, background='#00AA00')
        self.label.pack(fill='both')
        self.frame.pack(fill='both')
        self.SubAssembly.pack()

    ### 功能逻辑部分 ### 
    
    # 用matplotlib画函数图,内存加载图像至Tkinter
    def showImg(self):
        x = np.linspace(2,10,50)
        y = np.tan(x) / np.log(x)
        plt.plot(x,y,'b')
        buff = BytesIO()
        plt.savefig(buff)
        buff.seek(0)
        im = Image.open(buff)
        img = ImageTk.PhotoImage(im)
        self.label.img = img
        self.label.config(image=img)


root = tk.Tk()
root.geometry("800x600+200+100")
sa = SubAssembly(root)
sa.showImg()
root.mainloop()


2022-07-26   #11

实例:aardio创建界面,用matplotlib画图,实时动态显示在Tkinter中

screenshots.gif

import tkinter as tk
import tkinter.ttk as ttk
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
from PIL import Image, ImageTk
  
class SA():
    ### 界面设计部分 ###
    
    def __init__(self, master):
        self.mainframe = ttk.Frame(master, width=601, height=390)
        self.label1_frame = ttk.Frame(self.mainframe, width=209, height=27)
        self.label1 = ttk.Label(self.label1_frame, text="y = sin(x) / log(x)")
        self.label1.place(x=0, y=0)
        self.label1_frame.pack()
        self.pic1_frame = ttk.Frame(self.mainframe, width=640, height=480)
        self.pic1 = ttk.Label(self.pic1_frame)
        self.pic1.place(x=0, y=0)
        self.pic1_frame.pack()
        self.scale1_frame = ttk.Frame(self.mainframe, width=529, height=30)
        self.scale1 = ttk.Scale(self.scale1_frame, from_=21, to=100, value=21, command=self.drawImage)
        self.scale1.place(x=0, y=0)
        self.scale1_frame.pack()
        self.label2_frame = ttk.Frame(self.mainframe, width=209, height=27)
        self.label2_str = tk.StringVar(value='start point: x = 2.1')
        self.label2 = ttk.Label(self.label2_frame, textvariable=self.label2_str)
        self.label2.place(x=0, y=0)
        self.label2_frame.pack()
        self.mainframe.pack()

    ### 功能逻辑部分 ###
    def drawImage(self, *args):
        start = self.scale1.get()
        x = np.linspace(start, start+50, 50)
        x = x / 10
        self.label2_str.set('start point: x = {0}'.format(start/10))
        y = np.sin(x) / np.log(x)
        plt.clf()
        plt.plot(x, y, 'b')
        buff = BytesIO()
        plt.savefig(buff)
        buff.seek(0)
        im = Image.open(buff)
        image = ImageTk.PhotoImage(im)
        self.pic1.image = image
        self.pic1.configure(image=image)



        
root = tk.Tk()

sa = SA(root)
sa.drawImage()
root.mainloop()


其实,Tkinter也有各种主题,装个ttkbootstrap包后,各种bootstrap的式样都可以选。

无标题.png

2022-07-26   #12

2022-07-27   #13

2022-07-27   #14

又增加了字体属性设置,可以讲aardio中的字体属性设置到Tkinter的对应字体属性中,支持粗体、斜体、字号、下划线、字体集 5个属性。

还有字体颜色,其实字体颜色就是前景色,背景色设置中已经支持了。无标题.png

2022-07-28   #15

新增控件的左对齐、居中、右对齐布局

多行文本框、画板、Listbox增加水平和垂直滚动条

由于遍历控件时each返回的控件顺序是随机的,所以控件名和序号不好对应。但由于控件的Z序是固定的,所以新增了translateName函数,用于解析窗体设计器代码,返回的Z序与对应控件名称,可用来在python中替换控件名(可选功能)

2022-08-01   #16

说的明白

语言简洁

期待出更多教程哦

登录后方可回帖

登 录
信息栏
公告:
个人博客
专注分享
谢谢合作!

本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
打赏本站
Loading...