Readme of english version refers to Readme_EN.md
这是一个VB6的Addin(外接程序),用于使用VB6开发工具直接拖放控件,直接可视化完成Python的Tkinter的GUI布局和设计,可以在VB界面上设置控件的大部分属性,最终自动生成必要的代码(包括回调函数框架),代码生成后仅需要在对应的回调函数中增加相应的逻辑功能代码即可。
这个工具支持绝大部分Tkinter控件,可应付一般GUI的需求。 (列表参见下面的控件说明)。
(如果不希望py直接解释运行时弹出黑漆漆的命令行窗口,后缀名请改为pyw)
有两个方式,可以任选一个:
整合安装方式:
在
https://github.com/cdhigh/Vb6Tkinter/releases
下载整合了精简版VB6的安装包,已预先打好各种补丁,双击执行安装即可,不需要进行下面第二节的操作。
独立安装方式:
2.1. 在
https://github.com/cdhigh/Vb6Tkinter/releases
下载插件压缩包,解压到某个目录。
2.2. 先自行在其他网站下载并安装VB6,可以是完整版或
精简版
2.2.1. 如果是 Windows 7 及以上版本, 用 Vb6_SP6_Fix_for_Win7.zip 中的 Vb6.exe 覆盖原来的Vb6.exe
2.2.2. 如果是 Windows 10 及以上版本,请应用 VB6_AppCompat 补丁
2.3. 注册此插件,可以使用自带的注册工具"Setup for Vb6Tkinter.exe",或自己手动完成。
2.3.1. 运行
regsvr32 /s diretory\Vb6Tkinter.dll
2.3.2. 在C:\Windows\VBADDIN.INI的段[Add-Ins32]增加一行:
Vb6Tkinter.Connect=3
一旦你安装和注册完成后,以后的升级可以仅下载新版本的 Vb6Tkinter.dll/Vb6Tkinter.lng 覆盖旧的文件即可。
打开VB6,新建一个标准EXE工程,在窗体上设计自己的GUI布局,这个工作估计没有VB基础的同学都可以完成,同时可以设置相应的控件属性。
如果不希望窗体大小可变,建议在VB6中修改窗体的BorderStyle属性为"Fixed Single"或"Fixed Dialog"。
如果使用自带安装程序安装了插件,现在VB的工具条上应该有一个新图标(一片橙红色羽毛), 如果没有,到菜单"外接程序"|"外接程序管理器"里面启动 Vb6Tkinter, Vb6Tkinter 图标和菜单应该会出现。
启动Vb6Tkinter后,先按“刷新窗体列表”按钮,列出当前工程的所有窗体和控件列表。
逐个确认各控件的输出属性,在要输出的选项前打钩,如果必要,可以在属性列表中双击修改属性的值。(一般情况不需要再修改控件属性)。 Vb6Tkinter尽量的将VB控件属性翻译成Tkinter控件属性,比如字体、颜色、初始值、外观、状态等,甚至包括按钮类和菜单的快捷键设置等等。当然了,如果部分属性没有对应关系的,需要在Vb6Tkinter界面上设置。
按“生成代码”按钮则在代码预览窗口生成代码,可以双击代码预览窗口放大阅读,也可以直接修改代码。
确认完成后可以将代码拷贝到剪贴板或保存到文件。 布局可以使用百分比定位(相对定位)或绝对坐标定位(按像素定位),百分比定位为有一个好处,主界面大小变化后,控件也可以相对变化大小。如果不希望主界面大小变化后控件跟随变化,可以选择绝对坐标定位。 注:如果修改了以前设计的界面,可以选择仅输出main函数或界面生成类。不影响外部已经实现的逻辑代码。
如果程序有多个GUI界面,可以在VB工程中添加窗体,就可以选择产生哪个窗体的对应代码。
针对结构化代码,如果要在Python代码中引用和修改其他控件的值,可以使用全局字典gComps,这个字典保存了所有的GUI元素和一些对应的控件变量,可以直接使用形如gComps["Text1Var"].set("new Text")的代码来访问对应控件。 如果输出的是面向对象代码,则可以在界面派生类Application中使用self.widgetName方式直接访问对应的控件。
一般的GUI框架都会将UI部分和逻辑代码部分分别放在不同的文件中,在逻辑代码文件中导入UI文件,实现修改UI不影响逻辑代码。因为对于实现简单的程序来说,我偏爱单文件,所以我将UI类和逻辑代码类都放在同一个文件中,在修改界面后,你可以直接覆盖对应的Application_ui类即可实现界面的变更,不过如果增加了新的事件回调函数,需要在子类Application中增加才行。
VB6中的窗体(Form)对应到Tkinter的Frame,用于主窗体呈现。 为了更好的效果,建议在VB6里面设置窗体的BorderStyle属性为"Fixed Single"或"Fixed Dialog"。
Label
标签条在VB和Python中基本一样。可以在文本中插入\n来换行,如果启用ttk,还可以设置wraplength属性。
TextBox
Python文本框有两种:Entry和Text,如果VB的TextBox的MultiLine=False,则
生成Entry,否则生成Text。
Frame
对应Python的LabelFrame控件,做为其他控件的容器,或做为界面元素视觉分类。
CommandButton
对应Python的Button,没有太多区别。
为了代码简洁,窗体的退出按钮可以设置Cancel属性为True,然后程序自动生成
对应Tkinter的destroy回调,这样就不需要再实现一个回调函数。
在VB里面字母前增加一个"&"符号可以直接绑定一个快捷键 'Alt+对应字母',
Vb6Tkinter也支持此设置,自动生成对应的事件绑定代码。
其他控件比如CheckBox等有"标题"属性的控件一样如此处理。
CheckBox
多选按钮对应Python的Checkbutton。
OptionButton
单选按钮对应Python的Radiobutton。
tkinter中Radiobutton的分组方法和VB有些不一样(分组意味着组内的单选按钮自动
互斥,用户选择一个则其他的自动取消)。
在VB中,如果使用Frame将几个OptionButton圈起来,则这几个OptionButton自动成为一组。
Vb6Tkinter也支持这样的操作,同一父控件的Radiobutton自动成为一组。
如果需要手动处理,你要将需要分成一组的Radiobutton的variable属性设置为同一个变量,
然后各个Radiobutton的value值要不一样(默认为控件名),具体是什么值你可以随便设置,
反正不一样就行,最简单的就是1/2/3等,或者一个设置为man,另一个设置为woman,
在对应的Radiobutton被选择后,variable变量自动设置为对应的value值,读取即可
知道哪个Radiobutton被选中了,反之设置variable变量会导致对应的Radiobutton
ComboBox
组合框在Tkinter中没有对应的控件,比较类似的只有OptionMenu,类似ComboBox
的Style=2 (Dropdown List)时的表现,一个下拉列表,只能在列表中选择一个值,
不能直接输入。所以建议在VB的ComboBox中写下所有的下拉列表值。
如果启用了TTK主题扩展库支持,则直接对应到TTK的Combobox,外形和行为基本
ListBox
列表框对应Python的Listbox,行为也类似,可以在设计阶段设置初始列表。
如果需要滚动,则在适当位置创建滚动条,如果滚动条紧靠着列表框的右边或下边,
并且长度(水平滚动条)或高度(垂直滚动条)差不多,则滚动条和列表框自动绑定,
如果没有自动绑定,则可以在Addin界面选择其xscrollcommand或yscrollcommand
属性为对应滚动条的.set方法。
HScrollBar, VScrollBar
滚动条在Python中为Scrollbar,通过设置orient来控制水平还是垂直。
PictureBox
简单对应到Python中的Canvas,用做其他控件的容器或画图容器使用。
如果需要滚动,则在适当位置创建滚动条,如果滚动条紧靠着图像框的右边或下边,
并且长度(水平滚动条)或高度(垂直滚动条)差不多,则滚动条和图像框自动绑定,
如果没有自动绑定,可以在Addin界面选择其xscrollcommand和yscrollcommand
属性为对应滚动条的.set方法。
可以用于组织复杂界面,仅支持水平或垂直线。
以下的控件需要在VB的'控件工具箱'中按右键添加'部件',选择 "Microsoft Windows Common Controls 6.0"
Slider
类似对应Python中的Scale。
ProgressBar
对应到Python的Progressbar,需要启用TTK主题扩展(默认)
TreeView
对应到Python的Treeview,树形显示控件,可以选择是否显示标题行,
需要启用TTK主题扩展(默认)
如果需要滚动,则在适当位置创建滚动条,如果滚动条紧靠着TreeView的右边或下边,
并且长度(水平滚动条)或高度(垂直滚动条)差不多,则滚动条和TreeView自动绑定,
如果没有自动绑定,可以在Addin界面选择其xscrollcommand和yscrollcommand
属性为对应滚动条的.set方法。
TabStrip
选项卡控件,对应到Python的Notebook,需要启用TTK主题扩展(默认)。
如果要布局各个页面内的控件,按以下步骤:
__Tab
(双下划线),再加一个序号,从1开始,比如TabStrip的名字为TabStrip1,
则你可以在窗体上创建一个PictureBox,命名为
TabStrip1__Tab1
(注意大小写)。
CommonDialog
这个控件也算支持,如果VB窗体中有这个控件,则在Python代码中导入
filedialog、simpledialog、colorchooser这三个模块,这三个模块提供简单的
文件选择、输入框、颜色选择对话框功能。
需要在控件工具箱增加 "Microsoft Common Dialog Control 6.0"
(VB需要先添加“Microsoft Windows Common Controls 6.0”部件才有Statusbar)
(Checkbutton/Radiobutton默认不添加,如需要,可以在Vb6Tkinter将textvariable打勾,因为很少需要运行时修改这两个控件的文本。)
self.Text1.setText('new text')
print(self.Text1.text())
print(self.Check1.value())
self.Option1.setValue(1)
print(self.Option1.value())
ttk是tkinter的主题扩展库,也是标准库,看起来很漂亮,在不同操作系统下界面呈现为本地化风格,建议使用,
只是要注意以下几个ttk的BUG: