昨天发现以前用VB做的生成代码的小工具不能用了,可能是系统换成2008之后程序不好用了吧,闲着没事想试试用python重新做,因为很功能很简单,所以就用自带的Tkinter库写了一个。
- 基本结构
Tkinter虽然不像.NET那样可以随意拖窗体,但是使用代码也可以很简单的构建出来:
#encoding=UTF-8
from Tkinter import *
root = Tk() #窗体
root.mainloop()
- 布局
我需要两个多行文本框,一个用于输入,一个用于输出;中间一个按钮,用于触发转换并输出事件。定义三个Frame,并左右排列side=LEFT,每个控件最后都要pack()后才能添加,其中expand='yes'是指窗体大小改变时允许自动填充,fill='y'代表只能y轴方向填充,而both就是两个方向都允许,padx与pady同理是内部留的不同方向的距离。
frame1 = Frame(root, height=500, width=500)
frame1.pack(side=LEFT, fill='y', expand='yes', padx=5, pady=5)
frame2 = Frame(root, height=500, width=600)
frame2.pack(side=LEFT, fill='both', expand='yes', padx=5, pady=5)
frame3 = Frame(root)
frame3.pack(side=LEFT)
- 添加控件
Tkinter中的多行文本是Text,有点类似于网页中的textarea,而按钮就是Button。为了区分输入与输出,我把输入的文本框设成了灰色。定义控件时可以添加回调函数,但是却不能写参数(如果需要写参数可以使用lambda表达式)。这里的Text控件读取有个坑,就是它会自己多添加出来一个空行,所以在get时指定结尾行要写成END+'-1c',否则做字符串处理时会出错,因为excel粘贴过来时末尾也会带一个换行符形成一个空行,于是循环时添加一个if判断,避免出错。
text1 = Text(frame1, bg='#D9D9D9')
text1.pack(side=LEFT, fill='y', expand='yes')
text2 = Text(frame2)
text2.pack(side=LEFT, fill='both', expand='yes')
btn = Button(frame3, text="-->", height=3, command=convert)
btn.pack(anchor='se', expand='yes', fill='y')
def convert():
text = text1.get('0.0', END+'-1c')
result = ""
for line in text.split('\n'):
if line == "":
continue
y = line.split('\t')
result += '''/// <summary> %s </summary>
public const string %s = "%s";\n''' % (y[0], y[1], y[2])
text2.delete('0.0', END)
text2.insert('0.0', result)
- 绑定全选事件
对于输出文本框,需要将结果拷贝出来,但是默认是不支持Control-A的,只能在代码中绑定,有一个简单的办法,可以用bind_class方法将所有的Text控件一起添加全选事件(此绑定有时会失灵,不知为何):
root.bind_class('Text', '<Control-a>', selectAll)
- 滚动条
好了,基本功能已经完成,最后我给两个Text控件各添加了一个垂直的滚动条,看起来更习惯一些。
scroll1 = Scrollbar(frame1)
scroll1.pack(side=RIGHT, fill='y')
#添加滚动条后要与Text控件互相绑定
text1.config(yscrollcommand=scroll1.set)
scroll1.config(command=text1.yview)
- 总结
用python开发窗体程序挺有意思的,虽然这不是python的主要用法,但是练练手也不错,而且Tkinter开发出的程序是跨平台的,这点比.NET要舒服很多。

PS:这次Markdown文档是用raysnote写的,作者还是一位仍在读书的学生,虽然仍然有一些瑕疵,但是已经非常不错了,真羡慕他。
没有评论:
发表评论