免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: ssfjhh
打印 上一主题 下一主题

新定义的控件怎么捕捉不到方向键操作? [复制链接]

论坛徽章:
0
1 [报告]
发表于 2013-01-13 22:39 |显示全部楼层
http://tkinter.unpythonic.net/wiki/mhMultiListBox
这里这个合适你用,功能齐备,也不会太过庞大,也是2.X的,不过使用Tools/Scripts/2to3.py转换一下就行了,我试了,可行。

在命令行中执行:
python.exe c:\python32\tools\scripts\2to3.py -w mhMultiListbox.py

如果要使用ttk,将字体、颜色、样式等控件设置移动到style参数里面就行,参考VisualTkinter生成的代码。


另,这里这个也可以试一下,我没有试:
http://mail.python.org/pipermail ... ptember/002069.html

反正对于普通不是很大的代码量来说,2to3.py脚本的处理结果还是可以接受的,剩余的一点无法自动转换的,手工修改一下下就行了。

论坛徽章:
0
2 [报告]
发表于 2013-01-15 21:22 |显示全部楼层
想捕捉方向键,当然得绑定方向键事件,比如:
self.bind('<KeyRelease>', self.keyrelease)

然后在回调函数中自己处理,根据event.keysym字符串的值就可以知道按的是什么键了,比如:"Up"/"Down"等。

论坛徽章:
0
3 [报告]
发表于 2013-01-15 21:47 |显示全部楼层
贴出你写的吧

论坛徽章:
0
4 [报告]
发表于 2013-01-16 02:25 |显示全部楼层
单独改这个问题倒是很简单,绑定键盘事件到LISTBOX就行了,
lb.bind('<Up>', lambda e: self.select(delta=-1))
lb.bind('<Down>', lambda e: self.select(delta=1))
lb.bind('<Prior>', lambda e: self.select(delta=-self._pagesize()))
lb.bind('<Next>', lambda e: self.select(delta=self._pagesize()))

上下箭头键的处理正常,
难得是翻页键的处理,我试了一下,会出现各个LISTBOX的行不同步的情况,
比如先点一下鼠标选择一行,然后按PageDown,会出现点击鼠标的那个LISTBOX的行比其他LISTBOX往上多滚了一行情况。
不知何解,没有时间细细研究了。

论坛徽章:
0
5 [报告]
发表于 2013-01-16 21:28 |显示全部楼层
可以试一下绑定虚拟事件:<<ListboxSelect>>

class Application_ui(Frame):
    #这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master.title('Form1')
        self.master.geometry('312x205')
        self.createWidgets()

    def createWidgets(self):
        self.top = self.winfo_toplevel()

        self.style = Style()

        self.List1Var = StringVar(value='1 3 5 8shhlk 24982174 3284 fshh')
        self.List1 = Listbox(self.top, listvariable=self.List1Var)
        self.List1.place(relx=0.087, rely=0.132, relwidth=0.667, relheight=0.527)
        self.List1.bind('<<ListboxSelect>>', self.List1_ListboxSelect)


class Application(Application_ui):
    #这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
    def __init__(self, master=None):
        Application_ui.__init__(self, master)

    def List1_ListboxSelect(self, event):
        print("select:%s" % event.widget.curselection()[0])

论坛徽章:
0
6 [报告]
发表于 2013-01-16 21:49 |显示全部楼层
还有一个TIP:下载tk的源码(不是tkinter),在对应控件的源码文件中搜索,就知道一个控件支持多少虚拟事件了。有很多虚拟事件在tkinter文件中没有收入。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP