python之gui-tkinter可视化编辑界面 自动生成代码

首先提供资源链接 http://pan.baidu.com/s/1kVLOrIn#list/path=%2F

此工具是基于VB的一个插件,可以输出python的tk代码,依次安装即可

 

0.简介
    这是一个VB6的ADDIN(外接程序),用于使用VB6开发工具直接拖放控件,直接可视化完成Python的TKinter的GUI布局和设计,可以在VB界面上设置
    控件的一些属性,最终自动生成必要的代码(包括回调函数框架),代码生成后仅需要在对应的回调函数中增加相应的逻辑功能代码即可。
    这个工具支持绝大部分TKiner控件,可应付一般GUI的需求。(列表参见下面的控件说明)。

1.适用对象
    适用于学习了TKinter并不想太麻烦写GUI代码,也不想用其他工具和框架,比如wxPython,PyQt4的同学。
    适用于界面不太复杂的小程序开发,界面复杂的还是适用wxPython等框架吧。因为TKinter为Python标准库,使用TKinter完成的Python程序可以称为
    “绿色软件”,不需要目标机器上安装wxPython,PyQt4等框架,只要有Python的机器就能运行。
  如果软件逻辑不是很复杂,通常一个*.py搞定,不像其他框架,需要几个文件。 2.使用方法简介 2.1 首先注册此插件,可以使用自带的安装程序,或自己手动完成。 2.2 打开VB6,新建一个标准EXE工程,在窗体上设计自己的GUI布局,这个 工作估计没有VB基础的同学都可以完成,同时可以设置相应的控件属性。 2.3 如果使用自带安装程序安装了插件,现在VB的工具条上应该有一个新 图标(一片橙红色羽毛),如果没有,到菜单"外接程序"|"外接程序管理器" 里面启动Visual Tkinter,Visual Tkinter图标和菜单应该会出现。 2.4 启动Visual Tkinter后,先按“刷新窗体列表”按钮,列出当前工程的所有 窗体和控件列表。 2.5 逐个确认各控件的输出属性,在要输出的选项前打钩,如果必要, 可以在属性列表中双击修改属性的值。(一般情况不需要再修改控件属性)。 VisualTkinter尽量的将VB控件属性翻译成Tkinter控件属性,比如字体、颜色 初始值、外观、状态等,甚至包括按钮类和菜单的快捷键设置等待。 当然了,如果部分属性没有对应关系的,需要在VisualTkinter界面上设置。 2.6 按“生成代码”按钮则在代码预览窗口生成代码,可以双击代码预览窗口 放大阅读,也可以直接修改代码。 2.7 确认完成后可以将代码拷贝到剪贴板或保持到文件。 布局可以使用百分比定位(相对定位)或绝对坐标定位(按像素定位), 百分比定位为有一个好处,主界面大小变化后,控件也可以相对变化大小。 如果不希望主界面大小变化后控件跟随变化,可以选择绝对坐标定位。 注:如果修改了以前设计的界面,可以选择仅输出main函数或界面生成类。 不影响外部已经实现的逻辑代码。 2.8 如果程序有多个GUI界面,可以在VB工程中添加窗体,就可以选择产生 哪个窗体的对应代码。 2.9 针对结构化代码,如果要在Python代码中引用和修改其他控件的值, 可以使用全局字典gComps,这个字典保存了所有的GUI元素和一些对应的 控件变量,可以直接使用形如gComps["Text1Var"].set("new Text")的代码 来访问对应控件。 如果输出的是面向对象代码,则可以在界面派生类Application中直接访问 对应的控件。 2.10 一般的GUI框架都会将UI部分和逻辑代码部分分别放在不同的文件中,在 逻辑代码文件中导入UI文件,实现修改UI不影响逻辑代码。因为对于实现 简单的程序来说,我偏爱单文件,所以我将UI类和逻辑代码类都放在同一个 文件中,在修改界面后,你可以直接覆盖对应的Application_ui类即可实现 界面的变更,不过如果增加了新的事件回调函数,需要在子类Application 中增加才行。 3.目前支持的控件列表 3.1 Label 标签条在VB和Python中基本一样。如果不启用ttk,则在文本中插入\n来换行, 如果启用了ttk,则只支持单行文本(多行可以使用Message控件实现)。 3.2 TextBox Python文本框有两种:Entry和Text,如果VB的TextBox的MultiLine=False,则 生成Entry,否则生成Text。 3.3 Frame 对应Python的LabelFrame控件,做为其他控件的容器,或做为界面元素视觉分类。 3.4 CommandButton 对应Python的Button,没有太多区别。 为了代码简洁,窗体的退出按钮可以设置Cancel属性为True,然后程序自动生成 对应Tkinter的destroy回调,这样就不需要再实现一个回调函数。 在VB里面字母前增加一个"&"符号可以直接绑定一个快捷键Alt+对应字母, VisualTkinter也支持此设置,自动生成对应的事件绑定代码。 其他控件比如Checkbox等有"标题"属性的控件一样如此处理。 3.5 CheckBox 多选按钮对应Python的Checkbutton。 3.6 OptionButton 单选按钮对应Python的Radiobutton。 3.7 ComboBox 组合框在Tkinter中没有对应的控件,比较类似的只有OptionMenu,类似ComboBox 的Style=2 (Dropdown List)时的表现,一个下拉列表,只能在列表中选择一个值, 不能直接输入。所以建议在VB的ComboBox中写下所有的下拉列表值。 如果启用了TTK主题扩展库支持,则直接对应到TTK的Combobox,外形和行为基本 一致。 3.8 ListBox 列表框对应Python的Listbox,行为也类似,可以在设计阶段设置初始列表。 如果需要滚动,则在适当位置创建滚动条,然后在Addin界面选择其xscrollcommand 和yscrollcommand属性为对应滚动条的.set方法。 3.9 HScrollBar, VScrollBar 滚动条在Python中为Scrollbar,通过设置orient来控制水平还是垂直。 3.10 Slider 类似对应Python中的Scale。 3.11 PictureBox 简单对应到Python中的Canvas,用做其他控件的容器或画图容器使用。 如果需要滚动,则在适当位置创建滚动条,然后在Addin界面选择其xscrollcommand和 yscrollcommand属性为对应滚动条的.set方法。 3.12 Menu 可以使用VB的菜单编辑器来设计Python的菜单。 在VB中的菜单标题为"-"是分隔条。 也可以在正常的菜单标题中增加(&+字母)的方式添加快捷键。 3.13 Line 可以用于组织复杂界面,仅支持水平或垂直线。 =================================================== 以下的控件需要在VB的'控件工具箱'中按右键添加'部件',选择 'Microsoft Windows Common Controls 6.0' ==================================================== 3.14 ProgressBar 对应到Python的Progressbar,需要启用TTK主题扩展(默认) 3.15 TreeView 对应到Python的Treeview,树形显示控件,可以选择是否显示标题行, 需要启用TTK主题扩展(默认) 如果需要滚动,则在适当位置创建滚动条,然后在Addin界面选择其xscrollcommand 和yscrollcommand属性为对应滚动条的.set方法。 3.16 TabStrip 选项卡控件,对应到Python的Notebook,需要启用TTK主题扩展(默认)。 如果要布局各个页面内的控件,按以下步骤: 1.每个选项页对应一个Frame或PictureBox,命名为:TabStrip的名字 加'__Tab'(双下划线),再加一个序号,从1开始,比如TabStrip的名字为TabStrip1, 则你可以创建一个PictureBox,命名为'TabStrip1__Tab1'(注意大小写)。 2.然后在PictureBox/Frame内摆放你需要的其他控件,生成代码后此容器内自动添加 到对应的选项页,VisualTkinter会在后台为您做这一切。 标签页对应的PictureBox/Frame可以放置在窗体的可视范围外,也就是说设计好 对应的选项页后,缩小IDE中的窗体为你需要的大小。 注意: 1. 你需要使用相对坐标,PictureBox或Frame容器的大小请和TabStrip内部大小一致或 接近,否则选项页内的控件将会通过拉伸或收缩来适配可伸缩来适配可用空间,这样有些 控件看起来会比较怪。如果使用绝对坐标,则PictureBox/Frame可以不用和TabStrip 一样大,PictureBox/Frame内的控件将以TabStrip的左上角为原点放置,大小和长宽比例 会和设计时一致。 所以还是建议如果有TabStrip控件的话,使用绝对坐标。 2. Frame和PictureBox均可作为容器,如果使用Frame作为容器,则其标题可以作为选项页 标题,如果你没有设置选项页标题的话。(选项卡控件的标题设置优先) ----------------------------------------------------- 3.17 CommonDialog 这个控件也算支持,如果VB窗体中有这个控件,则在Python代码中导入 filedialog、simpledialog、colorchooser这三个模块,这三个模块提供简单的 文件选择、输入框、颜色选择对话框功能。 需要在控件工具箱增加"Microsoft Common Dialog Control 6.0" 4. 其他建议 1. 不支持使用控件数组,界面可以显示,但是后面的同名控件名会覆盖前面定义的。 2. 窗体的ScaleMode建议保持默认值(vbTwips),如果要设置为其他值,则Frame控件 内就不要再放Frame控件了,否则其内部的控件布局错误。 3. 如果仅需要简体汉字界面,则可以删掉Language.lng文件,仅需VisualTkinter.dll 一个文件。 5. ttk库额外说明 ttk主题扩展看起来很漂亮,在不同操作系统下界面呈现为本地化风格,建议使用, 只是要注意以下几个ttk的BUG: 1. TTK的Entry和Combobox控件背景色设置无效(可以设置,不报错,但是界面不变)。 2. TTK的Label中的文本不能换行,但是tkinter的Label控件可以通过插入'\n'来换行。 3. LabelFrame和Notebook控件的字体设置无效。 4. Python 2.7.3附带的ttk中的Treeview字体设置无效,但3.2.3的Treeview的字体 设置有效。

以上是介绍,可以看到,支持的组件还是挺多的,足够日常使用了

下面就简单的测试下

感觉回到了初中上微机课,老师教怎么画按钮,然后显示什么,挺怀念的界面

点生成即可

可以看出生成的界面和之前画的一样

代码如下

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os, sys
try:
    from tkinter import *
except ImportError:  #Python 2.x
    PythonVersion = 2
    from Tkinter import *
    from tkFont import Font
    from ttk import *
    #Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
    from tkMessageBox import *
    #Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
    #import tkFileDialog
    #import tkSimpleDialog
else:  #Python 3.x
    PythonVersion = 3
    from tkinter.font import Font
    from tkinter.ttk import *
    from tkinter.messagebox import *
    #import tkinter.filedialog as tkFileDialog
    #import tkinter.simpledialog as tkSimpleDialog    #askstring()


#所有控件和控件绑定变量引用字典,使用这个字典是为了方便在其他函数中引用所有控件。
gComps = {}




def main(argv):
    top = Tk()
    top.title('Form3')
    top.geometry('445x278')
    gComps['top'] = top

    style = Style()
    gComps['style'] = style

    style.configure('Label1.TLabel',anchor='w')
    Label1 = Label(top, text='采集链接:', style='Label1.TLabel')
    Label1.place(x=0, y=8, width=81, height=25)
    gComps['Label1'] = Label1

    Text1Var = StringVar(value='Text1')
    Text1 = Entry(top, text='Text1', textvariable=Text1Var)
    Text1.place(x=88, y=8, width=313, height=18)
    gComps['Text1'] = Text1
    gComps['Text1Var'] = Text1Var

    top.mainloop()
    try: top.destroy()
    except: pass



if __name__ == "__main__":
    main(sys.argv)

 今天的分享就到这里,如果大家觉得还可以呀,记得打赏呦

posted @ 2016-11-18 14:16  darkspr  阅读(37181)  评论(1编辑  收藏  举报