使用python的Tkinter构建应用程序
这一节记录的是我在使用python tkinter时的一些笔记。
背景:现在需要构建一个简易的聊天工具,说简易是因为确实只需要很简单的几个界面,包括一个登陆界面、一个好友列表和单击好友时弹出好友对话框可以交谈,我们这里只需要创建简单的界面(不包括业务),所以选择用tkinter这个模块来实现。
要点一、神马是tkinter?
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里.,Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中.(摘自百度百科)想要查看你的Tkinter版本,只需要在python命令行模式下输入print Tkinter.TkVersion即可,笔者的版本是8.5。
要点二、安装
一般情况下,安装python时,自带安装了Tkinter,并且与python的版本相对应,例如python2.7.3对应的应该是8.5版本,其余的我倒不是很熟悉。但有些预安装的python可能没有带上tkinter,例如我在虚拟机Fedora17上的python并没有自带tkinter,这时候解决办法是使用yum install tkinter命令即可。
要点三、登陆框
1 # -*- coding: utf-8 -*- 2 import Tkinter 3 from Tkinter import * 4 from multiprocessing import Process,Pipe 5 class Login: 6 def __init__(self,master,con): 7 self.con = con#pipe connection 8 self.parent = master#Tk实例,父容器 9 self.username = "" 10 self.password="" 11 master.protocol("WM_DELETE_WINDOW", self.cancel)#绑定关闭按钮到cancel函数 12 self.__layout__(master) 13 14 pass 15 16 #布局 17 def __layout__(self,master): 18 master.geometry("320x150+400+100")#窗口大小及坐标 19 master.title("腾Q登陆框") 20 21 row1 = Frame(master) 22 row1.pack(padx=10,pady=15) 23 Label(row1,width=8,text="用户名:",anchor=W).pack(side=LEFT) 24 self.en_user = Entry(row1) 25 self.en_user.pack(side=LEFT) 26 27 row2 = Frame(master) 28 row2.pack(padx=10,pady=0) 29 Label(row2,width=8,text="密码:",anchor=W).pack(side=LEFT) 30 self.en_pswd = Entry(row2,show="*") 31 self.en_pswd.pack(side=LEFT) 32 33 row3 = Frame(master) 34 row3.pack(padx=10,pady=15) 35 Button(row3,text="确定",width=10,command=self.ok).pack(side=LEFT,padx=5) 36 Button(row3,text="取消",width=10,command=self.cancel).pack(side=LEFT,padx=5) 37 pass 38 39 def ok(self): 40 self.username = self.en_user.get() 41 self.password = self.en_pswd.get() 42 if not self.validate(): 43 print "usrname or password error" 44 return 45 self.con.send({"res":True,"data":(self.username,self.password)}) 46 self.parent.quit() 47 self.parent.destroy() 48 pass 49 50 #验证账号密码 51 def validate(self): 52 return True 53 54 def cancel(self): 55 self.con.send({"res":False,"data":(self.username,self.password)}) 56 self.parent.quit() 57 self.parent.destroy() 58 pass
效果如图:
要点四、好友列表
1 # -*- coding: utf-8 -*- 2 import Tkinter 3 from Tkinter import * 4 from multiprocessing import Process,Pipe 5 from Chat import * 6 import string 7 class Main: 8 def __init__(self,master,con=""): 9 self.con = con # ends of a pipe 10 self.parent = master 11 self.__loadmyself__() 12 self.__layout__(master) 13 14 #在这里导入个人资料,至少包含name属性 15 def __loadmyself__(self): 16 self.me = {"name":u"沉鱼落雁"} 17 pass 18 19 def __layout__(self,master): 20 master.geometry("320x720+400+0") 21 master.title("腾Q") 22 23 f_message = Frame(master) 24 f_message.pack(fill=X) 25 26 Label(f_message,text=self.me['name']+"(online)").grid(row=0,sticky=W,pady=10,padx=5) 27 Label(f_message,text="好友列表:").grid(row=1,sticky=W) 28 29 30 f_friendlist = Frame(master) 31 f_friendlist.pack(fill=BOTH) 32 #带滚动条 33 scrollbar = Scrollbar(f_friendlist, orient=VERTICAL) 34 35 self.listbox = Listbox(f_friendlist,yscrollcommand=scrollbar.set,height=700) 36 scrollbar.config(command=self.listbox.yview) 37 scrollbar.pack(side=RIGHT, fill=Y) 38 self.listbox.bind("<Double-Button-1>",self.show) 39 self.refreshfriends() 40 self.listbox.pack(fill=BOTH,expand=1) 41 pass 42 43 #在这里导入好友列表 44 def loadfriends(self): 45 #reading friends list from server 46 #for example:(needs to be modified) 47 self.friendlist = [{"ID":0,"name":u"xxx","state":"on"},{"ID":1,"name":u"范德萨","state":"off"}] 48 49 fl = self.friendlist 50 for obj in fl: 51 self.listbox.insert(END,"%s(%s)"% (obj["name"],obj["state"])) 52 for i in range(2,50): 53 obj = {"ID":i,"name":u"王老吉%d"%i,"state":"on"} 54 self.friendlist.append(obj) 55 self.listbox.insert(END,"%s(%s)"% (obj["name"],obj["state"])) 56 pass 57 58 #更新好友列表,通常是周期性更新好友状态 59 def refreshfriends(self): 60 self.listbox.delete(0,END) 61 self.loadfriends() 62 pass 63 64 #开启对话框 65 def show(self,event): 66 lb = self.listbox; 67 ss = lb.curselection() 68 if len(ss) == 1: 69 #print lb.curselection(),lb.get(lb.curselection()) 70 index = string.atoi(ss[0]) 71 if index >= len(self.friendlist) : 72 print "error",index,len(self.friendlist) 73 else: 74 obj = self.friendlist[index] 75 if not obj.has_key("open"): 76 self.__openchat__(obj) 77 else: 78 if not obj["open"] == "yes": 79 self.__openchat__(obj) 80 else: 81 print obj['ID']," alreay open" 82 #print self.friendlist[ss[0]] 83 pass 84 85 def __openchat__(self,obj): 86 obj["open"] = "yes" 87 chat = Chat(self.parent,"",obj,self.me) 88 pass 89 90 if __name__ == "__main__": 91 root = Tk() 92 main = Main(root) 93 root.mainloop()
效果如图:
要点五、对话框基类
1 # coding=UTF-8 2 # File: myDialog.py 3 4 from Tkinter import * 5 import os 6 7 class Dialog(Toplevel): 8 9 def __init__(self, parent, title = None): 10 11 Toplevel.__init__(self, parent) 12 self.transient(parent) 13 14 if title: 15 self.title(title) 16 17 self.parent = parent 18 19 self.result = None 20 21 22 body = Frame(self) 23 self.initial_focus = self.body(body) 24 body.pack(padx=5, pady=5,fill=X) 25 26 self.buttonbox() 27 28 #self.grab_set() 29 30 if not self.initial_focus: 31 self.initial_focus = self 32 33 self.protocol("WM_DELETE_WINDOW", self.cancel) 34 35 self.geometry("+%d+%d" % (parent.winfo_rootx()+50, 36 parent.winfo_rooty()+50)) 37 38 self.initial_focus.focus_set() 39 40 self.wait_window(self) 41 42 # 43 # construction hooks 44 45 def body(self, master): 46 # create dialog body. return widget that should have 47 # initial focus. this method should be overridden 48 49 pass 50 51 def buttonbox(self): 52 # add standard button box. override if you don't want the 53 # standard buttons 54 55 box = Frame(self) 56 57 self.btn_ok = Button(box, text="确定", width=10, command=self.ok) 58 self.btn_ok .pack(side=LEFT, padx=5, pady=5) 59 self.btn_cancel = Button(box, text="取消", width=10, command=self.cancel) 60 self.btn_cancel .pack(side=LEFT, padx=5, pady=5) 61 62 #self.bind("<Return>", self.ok) 63 #self.bind("<Escape>", self.cancel) 64 65 box.pack(anchor=E) 66 67 # 68 # standard button semantics 69 70 def ok(self, event=None): 71 72 if not self.validate(): 73 self.initial_focus.focus_set() # put focus back 74 return 75 76 self.withdraw() 77 self.update_idletasks() 78 79 self.apply() 80 81 self.cancel() 82 83 def cancel(self, event=None): 84 # put focus back to the parent window 85 self.parent.focus_set() 86 self.destroy() 87 88 # 89 # command hooks 90 91 def validate(self): 92 93 return 1 # override 94 95 def apply(self): 96 97 pass # override
要点六、对话框
1 # coding=UTF-8 2 import Tkinter 3 from Tkinter import * 4 from myDialog import * 5 from datetime import * 6 7 class Chat(Dialog): 8 def __init__(self,master,title,obj,me): 9 self.obj = obj 10 self.me = me 11 t = u"与 "+obj['name']+u" 聊天中" 12 Dialog.__init__(self,master,t) 13 14 def apply(self): 15 dt= datetime.now() 16 timestr = u'%s于%s说: \n' % (self.me['name'],dt.strftime('%c')) 17 msg = self.input.get(1.0,END) 18 if msg.strip() == "": 19 return False 20 self.insertmessage(timestr+msg) 21 self.input.delete(1.0,END) 22 23 self.text.yview(MOVETO, 1.0) 24 pass 25 26 def body(self,master): 27 self.geometry("680x480") 28 self.resizable(False,False) 29 30 frame = Frame(master) 31 Label(frame,text="聊天记录:").pack(padx=5,pady=5) 32 frame.grid(row=0,sticky=W) 33 34 frame = Frame(master) 35 frame.grid(row=1) 36 self.text_scrollbar = Scrollbar(frame, orient=VERTICAL) 37 self.text = Text(frame,yscrollcommand= self.text_scrollbar.set,height=14,bg="white") 38 self.text_scrollbar.config(command=self.text.yview) 39 self.text_scrollbar.pack(side=RIGHT, fill=Y) 40 self.text.bind("<KeyPress>", lambda e : "break") 41 self.text.pack() 42 43 frame = Frame(master) 44 Label(frame,text="输入聊天信息:").pack(padx=5,pady=5) 45 frame.grid(row=2,sticky=W) 46 47 48 frame = Frame(master) 49 frame.grid(row=3) 50 scrollbar = Scrollbar(frame, orient=VERTICAL) 51 self.input = Text(frame,yscrollcommand=scrollbar.set,height=8,bg="white") 52 scrollbar.config(command=self.input.yview) 53 scrollbar.pack(side=RIGHT,fill=Y) 54 self.input.pack(fill=Y) 55 56 57 #插入聊天信息(显示在聊天框) 58 def insertmessage(self,msg): 59 self.text.insert(END,msg+"\n") 60 pass 61 62 #设置对话框标题 63 def setTitle(self,title): 64 self.title(title) 65 pass 66 67 def ok(self,event=None): 68 self.apply() 69 pass 70 71 def cancel(self,event=None): 72 self.obj["open"] = "no" 73 print "set open %s to no"%self.obj['name'] 74 Dialog.cancel(self,event) 75 76 if __name__ == "__main__": 77 print "开放的"
效果如图:
转载于:https://www.cnblogs.com/snuby/archive/2013/04/01/2993240.html
使用python的Tkinter构建应用程序相关推荐
- Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果)
Python使用tkinter构建一个多元回归预测模型GUI界面(接受用户输入数据并给出模型推理结果) 目录
- 如何使用Python和Tkinter构建Toy Markdown编辑器
Markdown editors are trending these days. Everybody is creating a markdown editor, and some of them ...
- python PyQt5 QMainWindow类(Qt主窗口框架,主窗口提供了用于构建应用程序用户界面的框架)
https://doc.qt.io/qtforpython/PySide2/QtWidgets/QMainWindow.html?highlight=qmainwindow#PySide2.QtWid ...
- 实战| Python爬虫、构建GUI、程序打包,这篇文章带你玩过瘾!
系列导读 01.PySimpleGUI|基础 02.PySimpleGUI|进阶 大家好,在之前的PySimpleGUI基础与进阶文章中,我们已经介绍了如何使用它构建GUI的基本方法,本文将进一步通过 ...
- python 控件失去焦点_Tk / Tkinter:检测应用程序失去焦点 - python
我正在申请Tkinter.在应用程序中,我想弹出一个上下文菜单,这是使用Tk.Menu.post()完成的. 当应用程序失去焦点时,我不知道如何使此菜单消失.我需要执行此操作,因为即使在切换到另一个窗 ...
- python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码)
python最强实训程序(增删改查)机房收费管理系统-基于tkinter的图形化界面(附详细代码) 最近学校实训,用两天时间做了一个python小程序*机房收费管理系统*,一款基于tkinter使用p ...
- Python基础之利用Matplotlib和Tkinter在应用程序中内嵌图表
在日常应用程序开发中,图表(折线图,柱状图等)以其直观显示,清晰明了的优势,使得应用范围越来越广泛,本文以一个简单的小例子,简述如何将Tkinter和Matplotlib相互关联起来,在应用程序中嵌入 ...
- Python训练营2021:构建8个真实世界的Python项目
时长:19h 27m |视频:. MP4,1280×720 30 fps |音频:AAC,44.1 kHz,2ch |大小:9.54 GB 语言:英语+中英文字幕 机译 从Python Web开发的初 ...
- python打开软件输入消息_用Python编写一个私人助理程序,为我们起草电子邮件!...
在你的工作中是否有一些你自己经常做重复的任务?这就是编程的乐趣所在.通过一些思考和编程,您可以使您的任务自动化,并为您节省大量时间.在本文中,我们将介绍一些Python工具和技巧,让你可以创建自己的P ...
- python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 一篇文章带你了解4个最佳项目创意的代码片段和示例 Python是一 ...
最新文章
- C#中多线程 委托的使用
- Js 变量声明提升和函数声明提升
- 第九十九期:可以编写代码的代码:代码生成的利与弊
- Office - 安装程序找不到office.zh-cn\*.文件
- 后台开发(1)---app后台开发入门
- php创建实例对象数组,php – 使用arguments数组创建新的对象实例
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp
- SuperMap iDesktop常见问题解答集锦 (一)
- 老板让我通知领导们开会,有几个领导故意开会迟到,老板反而说我不会办事,怎么办?...
- 敏捷开发系列学习总结(18)——Scrum Master的情景领导力模型
- 【opencv4.3.0教程】05之基础结构2之矩形结构Rect_详解
- 分享 java 基础 + 进阶精简资料(视频 + 源码 + 就业项目 + 面试报装)
- 视频打赏/付费视频引流吸粉/定时弹窗广告+自带视频+支付接口+自适应设计/带安装教程
- AppStore跳转链接
- 【C++入门】烦人的引用
- 四维图新总经理孙玉国谈导航
- 【Unity】 节奏类游戏的表盘卡点功能
- 工作中的一些错误解决记录
- 语音识别的技术路线学习笔记
- 样本、文库、重复、lane、run - 二代测序原理及名词解释
热门文章
- 【SPOJ - NSUBSTR】Substring(统计长度为x的子串最多出现的次数--后缀自动机)
- 呆瓜半小时入门python数据分析_金融和生物信息学多个实战案例
- activemq网页管理端使用_极周PC端(网页版)使用说明
- C/C++[codeup 1942]进制转换
- 容器技术Docker K8s 5 容器技术在阿里巴巴落地历程
- 算法:判断树是否相同100. Same Tree
- CDN 的诞生、术语、原理、特征以及应用场景
- Linear Programming and network flows P17 笔记
- 公网连接阿里云Redis
- myeclipse安装maven