2014年9月2日星期二

用python Tkinter制作窗口小程序

昨天发现以前用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就是两个方向都允许,padxpady同理是内部留的不同方向的距离。
代码块
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写的,作者还是一位仍在读书的学生,虽然仍然有一些瑕疵,但是已经非常不错了,真羡慕他。

没有评论:

发表评论