Python Tkinter学习总结(Python版本为3.3.2,很多用法和Python2.X的不一样)

最近用到了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.ABC)
        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
from tkinter import *
global img ###Important!!!
def open_myfile():

    FileName=tkinter.filedialog.askopenfilename()
    print (FileName)        
    global img
    img = PhotoImage(file = FileName)
    imgLabel['image'] = img

    
root=tkinter.Tk()
b=tkinter.Button(root,text='open',command=open_myfile)
b.pack()
img = PhotoImage(file = 'F:/Python/21.gif')
imgLabel = Label(root,image = img,compound = 'center')
imgLabel.pack()
 
root.mainloop()

这里有几点注意:首先,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版本的。




你可能感兴趣的:(Python)