最近用到了python的Tkinter库来写一个界面小程序。把其中困扰我的、需要注意的知识总结如下:
1.版面设计:
版面设计是最开始困扰我的地方,感觉又像回到了最初学习HTML语言时候。我参考的网站是:
http://purpen.iteye.com/blog/74830 :介绍pack(从上向下堆砌)和grid(表格)方法
http://blog.csdn.net/zhou191954/article/details/8302962 :介绍place(有点像HTML的div层)方法
本来是有三种方式,我每个都尝试了下,最终解决方案是:将页面分为左上,右上(左),右上(右),左下,右下(上),右下(下),大概这6个部分Frame1-6。每个Frame在总页面中,用place()使用绝对坐标指定位置。每个Frame中的Entry、Button、Label神马的用grid()表格布局;如果就上下很简单的布局,就用pack()。
2.下拉列表Combobox:
用到下拉列表才发现TKinter里面没有,上网查到的结果:
http://jamiesun.iteye.com/blog/396895 先是查到了这个,打算用Pmw的ComboBox 的,但是下载了Pmw包后,用的时候各种错误,最后放弃了;
后来又查到:
http://bbs.chinaunix.net/thread-3675907-1-1.html
http://tieba.baidu.com/p/2376147190 发现原来Tkinter的ttk库里有ttk.Combobox(parent, textvariable=box_value,
state='readonly')可以实现,而且不用下载其他的,直接引用即可,而且是非常好用!将代码粘出来:
from tkinter import Tk, StringVar
from tkinter import ttk
class Application:
def __init__(self, parent):
self.parent = parent
self.combo()
def ABC(self,event):
print (self.box_value.get())
if self.box_value.get()=='A':
print("1")#可以换成函数
elif self.box_value.get()=='B':
print("2")
else:
print("3")
def combo(self):
self.box_value = StringVar()
self.box = ttk.Combobox(self.parent, textvariable=self.box_value,
state='readonly')
self.box['values'] = ('A', 'B', 'C')
self.box.bind('
self.box.current(0)
self.box.grid(column=0, row=0)
if __name__ == '__main__':
root = Tk()
app = Application(root)
root.mainloop()
可以用box['state'] = 'disabled'/和box['state'] = 'readonly'切换:不可/可编辑
再附上一篇对ttk的简单介绍:http://bbs.chinaunix.net/thread-4059025-1-1.html
以及官方文档:http://docs.python.org/3.1/library/tkinter.ttk.html#virtual-events 里面介绍的很详细
3.弹出提示框
我参考的Tkinter各个控件使用方法是百度文库的一篇:Tkinter教程。里面介绍的很全面,也很好,而且有弹出框和打开文件框的方法。但是我用的时候提示错误。(忘了什么错误了,大概是什么找不到的这种....)。后来找到了这个篇介绍:
http://code.google.com/p/c-pocket-python-reference4/source/browse/trunk/book/the-tkinter-gui-module-and-tools.t2t?spec=svn9&r=9
在这里介绍了Tkinter的核心控件、通用对话框控件等。其中对话框控件中有一句
“=== tkinter.messagebox (Python 2.X 中的 tkMessageBox) ===”
我才意识到是自己使用的教材版本低了。这里给出我实现的例子:
import tkinter.messagebox
tkinter.messagebox.showinfo(title='联系方式', message='邮箱:[email protected]\n')
4.打开文件框
这里的文件打开框也是用到了Tkinter通用对话框的控件。我在这里实现了按钮上传图片。代码如下:
import tkinter.filedialog
这里有几点注意:首先,Tkinter的PhotoImage只能读取.gif图片(可能还有bmp的?),如果想读取其他格式的图片,就需要自己查查了,类似Combobox需要其他库。其次,这里替换图片,在按钮响应的函数中image变量必须是global全局格式,否则按钮点击替换图片文件后,图片显示不出来。因为,python将它作为局部变量,函数外销毁了。具参考这里:http://wenwen.soso.com/z/q402036171.htm。还要注意,在函数中使用全局变量时候:仍要声明global image,再使用。
文件对话框的使用还参考了这里:http://www.velocityreviews.com/forums/t689042-tkinter-get-filename-of-askopenfilename.html
5.发邮件弹出程序
这里是最让人蛋疼的了。本身用Python发邮件是不难,但是我想实现的是弹出类似outlook那样的框框。这里我只实现了python发邮件。本来想参考网上实现python调用outlook程序来着,按着网上的做,先安装pywin32-218.win-amd64-py3.3.exe,后来使用时候就各种错误,而且我发现我的电脑上没有安装outlook,后来各自纠结,感觉安装这安装那还不如自己直接写一个界面程序....于是放弃了。
这里贴上我参考别人改写的发qq邮件例子吧:
import smtplib
smtp = smtplib.SMTP()
smtp.connect("smtp.qq.com", "25")
smtp.login('你的qq邮箱@qq.com', 'qq邮箱密码')
smtp.sendmail('fromAdd你的@qq.com', 'toAdd要发的@qq.com', 'From: fromAdd@qq.com\r\nTo: toAdd要@qq.com\r\nSubject: Aemail from Python\r\n\r\nJust for test~_~')
smtp.quit()
运行后,邮件就从[email protected]发到[email protected]了。
这里smtp.connect("smtp.qq.com", "25") #原本是smtp.yeah.net 因为要用qq邮箱的smtp所以改成smtp.qq.com了
最后总结:
Python很好用,也很强大。只是自己懂的太少了,不知道怎么用,不知道能用什么控件。这就是学习的过程吧。
还有一点,之前没注意:这里用到的Python版本为3.3.2,很多用法和Python2.X的不一样,网上的很多方法貌似都只是适用于Python2.X版本的。