Python论坛  - 讨论区

标题:[python-chinese] 选择格子

2007年11月26日 星期一 10:23

linda.s samrobertsmith在gmail.com
星期一 十一月 26 10:23:53 HKT 2007

在下面的代码里,
怎么做到选行(现在是只能选列)?
还有,怎么做到选单个格子?
谢谢!
Linda

from Tkinter import *

class MultiListbox(Frame):
    def __init__(self, master, lists):
	Frame.__init__(self, master)
	self.lists = []
	for l,w in lists:
	    frame = Frame(self); frame.pack(side=LEFT, expand=YES, fill=BOTH)
	    Label(frame, text=l, borderwidth=1, relief=RAISED).pack(fill=X)
	    lb = Listbox(frame, width=w, borderwidth=0, selectborderwidth=0,
			 relief=FLAT, exportselection=FALSE)
	    lb.pack(expand=YES, fill=BOTH)
	    self.lists.append(lb)
	    lb.bind('', lambda e, s=self: s._select(e.y))
	    lb.bind('', lambda e, s=self: s._select(e.y))
	    lb.bind('', lambda e: 'break')
	    lb.bind('', lambda e, s=self: s._b2motion(e.x, e.y))
	    lb.bind('', lambda e, s=self: s._button2(e.x, e.y))
	frame = Frame(self); frame.pack(side=LEFT, fill=Y)
	Label(frame, borderwidth=1, relief=RAISED).pack(fill=X)
	sb = Scrollbar(frame, orient=VERTICAL, command=self._scroll)
	sb.pack(expand=YES, fill=Y)
	self.lists[0]['yscrollcommand']=sb.set

    def _select(self, y):
	row = self.lists[0].nearest(y)
	self.selection_clear(0, END)
	self.selection_set(row)
	return 'break'

    def _button2(self, x, y):
	for l in self.lists: l.scan_mark(x, y)
	return 'break'

    def _b2motion(self, x, y):
	for l in self.lists: l.scan_dragto(x, y)
	return 'break'

    def _scroll(self, *args):
	for l in self.lists:
	    apply(l.yview, args)

    def curselection(self):
	return self.lists[0].curselection()

    def delete(self, first, last=None):
	for l in self.lists:
	    l.delete(first, last)

    def get(self, first, last=None):
	result = []
	for l in self.lists:
	    result.append(l.get(first,last))
	if last: return apply(map, [None] + result)
	return result
	
    def index(self, index):
	self.lists[0].index(index)

    def insert(self, index, *elements):
	for e in elements:
	    i = 0
	    for l in self.lists:
		l.insert(index, e[i])
		i = i + 1

    def size(self):
	return self.lists[0].size()

    def see(self, index):
	for l in self.lists:
	    l.see(index)

    def selection_anchor(self, index):
	for l in self.lists:
	    l.selection_anchor(index)

    def selection_clear(self, first, last=None):
	for l in self.lists:
	    l.selection_clear(first, last)

    def selection_includes(self, index):
	return self.lists[0].selection_includes(index)

    def selection_set(self, first, last=None):
	for l in self.lists:
	    l.selection_set(first, last)

if __name__ == '__main__':
    tk = Tk()
    Label(tk, text='MultiListbox').pack()
    mlb = MultiListbox(tk, (('Subject', 40), ('Sender', 20), ('Date', 10)))
    for i in range(1000):
	mlb.insert(END, ('Important Message: %d' % i, 'John Doe',
'10/10/%04d' % (1900+i)))
    mlb.pack(expand=YES,fill=BOTH)
    tk.mainloop()

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 12:00

lubiao lubiao.py在gmail.com
星期一 十一月 26 12:00:03 HKT 2007

On Nov 26, 2007 10:23 AM, linda. s <samrobertsmith at gmail.com> wrote:
> 在下面的代码里,
> 怎么做到选行(现在是只能选列)?
> 还有,怎么做到选单个格子?
> 谢谢!
> Linda
>
注释掉  __init__ 中的
#lb.bind('', lambda e, s=self: s._select(e.y))
换成
lb.bind('', lambda e, s=self: s.select_col(e))

添加:
   def select_col(self, e):
       print e.widget == self.lists[0]
       print e.widget == self.lists[1]
       print e.widget == self.lists[2]

       self.selection_clear(0, END)
       e.widget.select_set(0, END)

       return 'break'

e的成员 widget  就是一个  Listbox , 调用 e.select_set(0, END) 可以选择一列,
一列 是一个 Listbox , self.lists 里面有 3 个 Listbox
---------------------------------------------------------------------------------------------
如果 选择 一个 单元格, 只要
像 def selection_set(self, first, last=None):  函数中的
l.selection_set(first, last)
不要 做 for 循环, 只是 选择一个 Listbox  就行

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 12:03

lubiao lubiao.py在gmail.com
星期一 十一月 26 12:03:50 HKT 2007

On Nov 26, 2007 12:00 PM, lubiao <lubiao.py at gmail.com> wrote:
> On Nov 26, 2007 10:23 AM, linda. s <samrobertsmith at gmail.com> wrote:
> > 在下面的代码里,
> > 怎么做到选行(现在是只能选列)?

我 的
$ python
Python 2.5.1 (r251:54863, May 18 2007, 16:56:43)
[GCC 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)] on cygwin
Type "help", "copyright", "credits" or "license" for more information.

是能选行, 不能选列

> > 还有,怎么做到选单个格子?
> > 谢谢!
> > Linda
> >

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 12:09

linda.s samrobertsmith在gmail.com
星期一 十一月 26 12:09:22 HKT 2007

怎么做到选单个格子?
谢谢!
Linda
On Nov 25, 2007 8:00 PM, lubiao <lubiao.py在gmail.com> wrote:
> On Nov 26, 2007 10:23 AM, linda. s <samrobertsmith在gmail.com> wrote:
> > 在下面的代码里,
> > 怎么做到选行(现在是只能选列)?
> > 还有,怎么做到选单个格子?
> > 谢谢!
> > Linda
> >
> 注释掉  __init__ 中的
> #lb.bind('', lambda e, s=self: s._select(e.y))
> 换成
> lb.bind('', lambda e, s=self: s.select_col(e))
>
> 添加:
>    def select_col(self, e):
>        print e.widget == self.lists[0]
>        print e.widget == self.lists[1]
>        print e.widget == self.lists[2]
>
>        self.selection_clear(0, END)
>        e.widget.select_set(0, END)
>
>        return 'break'
>
> e的成员 widget  就是一个  Listbox , 调用 e.select_set(0, END) 可以选择一列,
> 一列 是一个 Listbox , self.lists 里面有 3 个 Listbox
> ---------------------------------------------------------------------------------------------
> 如果 选择 一个 单元格, 只要
> 像 def selection_set(self, first, last=None):  函数中的
> l.selection_set(first, last)
> 不要 做 for 循环, 只是 选择一个 Listbox  就行
> _______________________________________________
> python-chinese
> Post: send python-chinese在lists.python.cn
> Subscribe: send subscribe to python-chinese-request在lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request在lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2007年11月26日 星期一 12:43

lubiao lubiao.py在gmail.com
星期一 十一月 26 12:43:09 HKT 2007

On Nov 26, 2007 12:09 PM, linda. s <samrobertsmith at gmail.com> wrote:
> 怎么做到选单个格子?
> 谢谢!
> Linda
>
__init__ 中注释掉:
           #lb.bind('', lambda e, s=self: s._select(e.y))
           不响应 鼠标 移动的 消息了
修改    lb.bind('', lambda e, s=self: s._select(e.y))
为:
           lb.bind('', lambda e, s=self: s._select(e))
           为了得到 e.widget

修改
def _select(self,e):
       row = self.lists[0].nearest(e.y)
       self.selection_clear(0, END)

       e.widget.select_set(row, None)  # 只选择此列此行

       #self.selection_set(row)  不做 循环 选择 3 列。
       return 'break'

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号