本文主要是想对写界面以及 *** 作表格遇到的常见问题做个总结。前两篇文章想想对tkinter和pandas这两个库的概述还不够全面。
如何在主界面中点击按钮从而d出新界面是做界面设计最常遇到的问题。其实很简单,在主界面中定义一个按钮,然后将按钮绑定一个函数,再在这个函数中定义新界面。
注意,MessageBox这个函数是没有参数的,所以用command绑定的时候呢不要加括号。至于加了括号会出现什么?会有惊喜你可以试试。
还有一点要注意的是,主界面是root,d出来的界面叫t1。在主界面的控件里,括号里都先写了root,而toplevel这个d出界面里的所有控件,定义的括号里前面都要改为t1。如果不改,会出现一个很有意思的事情,就是你本来想d出的界面,会主动加载到主界面上。其实这也是个很有意思的功能,在适当的时候这么用也很美观。
tk中的三种布局方式中,我最喜欢的是grid,尽管pack也有它的优势。
无论那种布局都无法达到一下子心满意足的地步,就像写前端网页一样,不停的在调整调整。这里介绍几个参数帮助大家更高效的调整。
大家都知道column,row,一个表示列,一个表示行。不过还有两个参数叫做columnspan,rowspan,这四个参数可以两两配合使用。比如column=1, columnspan = 4的意思就是从第二列开始,这个控件占据四列,就是说第二、三、四、五列都是这个控件的,下个控件最多也只能从第六列开始放置了。
sticky这个参数是来控制控件对齐的。
随便写一个界面,它现在是这样的。
界面太小了,我们把它扩大一些。
我们不想让这两个按钮靠的太近,不美观。
可以看出来,现在是左对齐。我们想让它们又对齐。这时候就需要用到sticky了。
除了利用juputer notebook之外,还有一个方法就是把dataframe的表格形式转化为多为数组,然后以table的形式输出。
现在很对齐是不是?
我们加多数据类型,让他不好对齐。
然后怎么办呢?
大功告成!
可以使用sqlite,下面是使用方法。
导入Python SQLITE数据库模块
Python25之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~
import sqlite3
2 创建/打开数据库
在调用connect函数的时候,指定库名称,如果指定的数据库存在就直接打开这个数据库,如果不存在就新创建一个再打开。
cx = sqlite3connect("E:/testdb")
也可以创建数据库在内存中。
con = sqlite3connect(":memory:")
3数据库连接对象
打开数据库时返回的对象cx就是一个数据库连接对象,它可以有以下 *** 作:
commit()--事务提交
rollback()--事务回滚
close()--关闭一个数据库连接
cursor()--创建一个游标
关于commit(),如果isolation_level隔离级别默认,那么每次对数据库的 *** 作,都需要使用该命令,你也可以设置isolation_level=None,这样就变为自动提交模式。
4使用游标查询数据库
我们需要使用游标对象SQL语句查询数据库,获得查询对象。 通过以下方法来定义一个游标。
cu=cxcursor()
游标对象有以下的 *** 作:
execute()--执行sql语句
executemany--执行多条sql语句
close()--关闭游标
fetchone()--从结果中取一条记录,并将游标指向下一条记录
fetchmany()--从结果中取多条记录
fetchall()--从结果中取出所有记录
scroll()--游标滚动
1 建表
cuexecute("create table catalog (id integer primary key,pid integer,name varchar(10) UNIQUE,nickname text NULL)")
上面语句创建了一个叫catalog的表,它有一个主键id,一个pid,和一个name,name是不可以重复的,以及一个nickname默认为NULL。
2 插入数据
请注意避免以下写法:
# Never do this -- insecure 会导致注入攻击
pid=200
cexecute(" where pid = '%s'" % pid)
正确的做法如下,如果t只是单个数值,也要采用t=(n,)的形式,因为元组是不可变的。
for t in[(0,10,'abc','Yu'),(1,20,'cba','Xu')]:
cxexecute("insert into catalog values (,,,)", t)
简单的插入两行数据,不过需要提醒的是,只有提交了之后,才能生效我们使用数据库连接对象cx来进行提交commit和回滚rollback *** 作
cxcommit()
3查询
cuexecute("select from catalog")
要提取查询到的数据,使用游标的fetch函数,如:
In [10]: cufetchall()
Out[10]: [(0, 10, u'abc', u'Yu'), (1, 20, u'cba', u'Xu')]
如果我们使用cufetchone(),则首先返回列表中的第一项,再次使用,则返回第二项,依次下去
4修改
In [12]: cuexecute("update catalog set name='Boy' where id = 0")
In [13]: cxcommit()
注意,修改数据以后提交
5删除
cuexecute("delete from catalog where id = 1")
cxcommit()
6使用中文
请先确定你的IDE或者系统默认编码是utf-8,并且在中文前加上u
x=u'鱼'
cuexecute("update catalog set name= where id = 0",x)
cuexecute("select from catalog")
cufetchall()
[(0, 10, u'\u9c7c', u'Yu'), (1, 20, u'cba', u'Xu')]
如果要显示出中文字体,那需要依次打印出每个字符串
In [26]: for item in cufetchall():
: for element in item:
: print element,
:
0 10 鱼 Yu
1 20 cba Xu
7Row类型
Row提供了基于索引和基于名字大小写敏感的方式来访问列而几乎没有内存开销。 原文如下:
sqlite3Row provides both index-based and case-insensitive name-based access to columns with almost no memory overhead It will probably be better than your own custom dictionary-based approach or even a db_row based solution
Row对象的详细介绍
class sqlite3Row
A Row instance serves as a highly optimized row_factory for Connection objects It tries to mimic a tuple in most of its features
It supports mapping access by column name and index, iteration, representation, equality testing and len()
If two Row objects have exactly the same columns and their members are equal, they compare equal
Changed in version 26: Added iteration and equality (hashability)
keys()
This method returns a tuple of column names Immediately after a query, it is the first member of each tuple in Cursordescription
New in version 26
下面举例说明
In [30]: cxrow_factory = sqlite3Row
In [31]: c = cxcursor()
In [32]: cexecute('select from catalog')
Out[32]: <sqlite3Cursor object at 0x05666680>
In [33]: r = cfetchone()
In [34]: type(r)
Out[34]: <type 'sqlite3Row'>
In [35]: r
Out[35]: <sqlite3Row object at 0x05348980>
In [36]: print r
(0, 10, u'\u9c7c', u'Yu')
In [37]: len(r)
Out[37]: 4
In [39]: r[2] #使用索引查询
Out[39]: u'\u9c7c'
In [41]: rkeys()
Out[41]: ['id', 'pid', 'name', 'nickname']
In [42]: for e in r:
: print e,
:
0 10 鱼 Yu
使用列的关键词查询
In [43]: r['id']
Out[43]: 0
In [44]: r['name']
Out[44]: u'\u9c7c'
1简介。
Tkinter是Python唯一自带的GUI工具包,它背后使用的Tk组件库是开源世界中公认的标准。
Tkinter对于图形界面的布局管理有三大类:pack、grid、place
Pack()方法提供了选项来布局组件在界面中的位置,选项有:side、expand、fill、等
Grid()方法是采用行列来确定组件在界面中的位置,row是行号,column是列号。
Place()方法是通过组件在界面中的横纵坐标来固定位置。
2分别使用pack和grid来布局同一组件。
程序如下:
information=['Name','Gender','Age']
def pack(parent):
entries1 = []
for i in information:
row=Frame(parent)
rowpack()
lab1=Label(row,text=i,relief=RAISED,width=7,padx=5,pady=5)
lab1pack(side=LEFT)
ent1=Entry(row,relief=SUNKEN,width=30)
ent1pack(side=LEFT,ipadx=5,ipady=5)
entries1append(ent1)
def print1():
print([entget() for ent in entries1])
Button(parent,text='提交',command=print1)pack()
def grid(parent):
row=1
entries2=[]
for i in information:
lab2=Label(parent,text=i,width=7,relief=RAISED,padx=5,pady=5)
ent2=Entry(parent,width=30,relief=SUNKEN)
lab2grid(row=row,column=0)
ent2grid(row=row,column=1,ipadx=5,ipady=5)
row +=1
entries2append(ent2)
def print2():
print([entget() for ent in entries2 ])
Button(parent,text='提交',command=print2)grid(columnspan=2)
frm1=Frame(root,bd=5,relief=RAISED)
frm1pack()
Label(frm1,text='pack')pack()
pack(frm1)
frm2=Frame(root,bd=5,relief=RAISED)
Label(frm2,text='grid')grid(columnspan=2)
frm2pack()
grid(frm2)
运行结果如下:
3总结。
从运行结果界面上看两种布局的效果差不多,但通过程序可以看到,这个类似表格的界面使用pack布局的话要是两个组件布置在同一行中要使用一个容器把组件先绑定到一起来。而grid布局在这里就显得比pack方便多了,直接定义各组件在父组件中的行与列就行了。所以通过上面的比较可以得出,如果界面要求是表格类型的那么就使用grid来对组件进行布局会方便很多。
使用TK GUI的Python应用程序通常调用以下导入语句:
如果转到python的安装位置,您会发现在python库中,tkinter是一个文件夹,而不是py文件。所以当您使用 from tkinter import 时,实际上您只导入了 your-python-location/lib/tkinter/__init__py 中的内容。像ttk这样的东西实际上是tkinter文件夹中的独立文件(例如lib/tkinter/ttkpy公司,lib/tkinter公司/滚动文本py因此,from tkinter import 和{}是从不同模块导入内容的不同命令。
以上就是关于小蛇学python(10)tkinter和pandas的补充全部的内容,包括:小蛇学python(10)tkinter和pandas的补充、Python 中用 Tkinter GUI编程、Python Tkinter之布局等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)