最近Tk的烦心事--Scrollbar与TextView。

来源:互联网 发布:mac yy语音进不了频道 编辑:程序博客网 时间:2024/05/17 02:32

趁着清明假期把之前早就想完善的 学生信息查询系统 做了些修正。以为很简单呢。。其中还遇到不少问题。。
就是这么个小程序..
首先遇到的是蛋疼的成绩查询–之前的数据抓取存在一些小问题
url = 'http://202.119.248.199/xscjcx_dq.aspx?xh='+Id.get()
posturl="省略一大段"
request = urllib2.Request(url, None, headers)
response = urllib2.urlopen(request)
userinfo = response.read()

这是之前的代码片段。。是的。。貌似教务处网站哪里做了一些修正直接把我的爬虫拍死了T T..(逗比z你就不能给个好点的接口 改的我想死)

期间试了很多方法。。全都是提示蛋碎的“非法字符。您的IP已被记录..”
可是不能够啊 我用火狐的hackbar提交相同的内容就是可以进去..于是某晚上灵光一闪 发现唯一的不同是hackbar是用post提交的 而逗比z是用get提交的(省毛事啊..)
那么结论大概就是get与post方法被拦截的方式不同。特别是asp做的网站
–>是的 我用post方式就好了

下面是纠结了两天的Tk:
先直接放结论:千万不要为了省事用Tk。。除非你的程序真的很小。。不然真的很心碎。。

Tk就不介绍了 这里直接讲一下ttk
ttk不仅美化了tk老土的界面 还增加了一些非常非常重要的基础控件。比如Notebook,Combobox,以及非常重要的以至于不让人丢掉Tk的Treeview

python2.*是import ttk
python3.*的ttk直接在tk目录下了所以是import Tkinter.ttk

为什么Treeview非常重要?因为如果要让tk框架显示数据内容 可选控件真是太少了。Label确实挺好看 但是有个非常致命的缺点 不能与Scrollbar绑定 也就是说如果要显示多个数据的话 窗口会溢出,需要的数据就显示不完全了。

目前支持Scrollbar的控件大概也就只有 ListBox,Text,Canvas和Treeview了
(能与Scrollbar绑定的控件必须具有yview方法)

首先前两个太丑 并不适合用于显示格式化的数据 直接pass
Canvas试了半天。布局实在是有些困难(只能用固定坐标进行布局)
期间我还试图把Canvas放到LabelFrame里 然后在LabelFrame里面添加Label以显示内容 ,把Canvas绑定Scrollbar 。然后失败了。。–Canvas并不能为其他人拖进度条(废话啊。。本来就是俩东西) 也不知道是不是canvas的问题 只要界面一崩直接吃一半的cpu 开两次崩了直接满了..烧机神器?

本来都试图放弃了 后来由于李某大神指导 发现了ttk里面的一个控件Treeview
符合之前的全部要求(界面美观。可以与Scrollbar绑定)

这个真是难过的要死啊。。我真的终于终于明白看文档的重要性了。。(就算你给的文档真心不详细)
需要的直接去下吧。。
http://bbs.chinaunix.net/thread-4059025-1-1.html

该讲的文档里都差不多提到了。。
我个人觉得最恶心的是TreeView的Column属性参数居然是数组..你让我传个int进去还是可以 可是无论int是多少都是两个column..

于是创建一个具有scrollbar的控件只需要这么几行tree = Treeview(cjcx_tk_root,columns=[i for i in range(20)],height = 35)
ysb = Scrollbar(cjcx_tk_root, orient='vertical', command=tree.yview)
xsb = Scrollbar(cjcx_tk_root, orient='horizontal', command=tree.xview)
tree.configure(yscroll=ysb.set, xscroll=xsb.set)

上面的20只是为了下面用到的时候不越界 多一些没事 具体tk文档里都有提到的。

这里写图片描述

最后是想为这些heading添加一个方法:按该列排序。。
具体的方法参考tk文档吧。。各种调用就行了
不过有一个问题 就是heading(*args, command = ) 这里的command需要的只是一个函数指针 而不是给的闭包接口 所以不能带参数
如果必须带参数的话 解决方法是自己写一个闭包函数传递进去
比如
def mix(Serial):
def mid():
lis = []
for i in tree.get_children(b):
d=tree.item(i)
d.update({'id':i})
lis.append(d)
lis = sorted(lis,key = lambda x:(x['values'][Serial]))
for i in range(len(lis)):
tree.move(lis[i]['id'],'',i)
return mid

参数放在mix()里面就可以了~

最后一个看似无关的忠告是..eval啊exec啊什么的最好别随便用,不安全不说,还容易被idle报错:exec不能在嵌套函数里使用.. 当然最主要的原因是 大体上都有其他方案可以代替这两个函数。。所以尽量不用!

0 0
原创粉丝点击