2015-01-09 92 views
4

我试图使输入值增加或减少,只要按下向上或向下箭头键。要做到这一点,我需要首先找到哪些焦点,并试图做到这一点“.focus_get()”。问题是,我无法弄清楚它是如何工作的或它返回的。它为每个条目返回一个唯一编号,如:“.45191744”,但每次运行该程序时都会更改此编号。 以下数字代表运行代码时的最后5次尝试。 “0.50518728" ” 0.53009096" “0.55889592" ” 0.51891896"Python获取焦点入口名称

?我怎样才能聚焦项的变量名?

这里是我的代码:

def get_focus1(event): 
    print("return: event.widget is", event.widget) 
    print("focus is:", window2.focus_get()) 
    print(window2.focus_get()) 
    print(help(window2.Entry)) 

window2 = Tk() 

eyear1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for year 
eyear1.insert(10, defaultYear) 
eyear1.grid(row=1, column=1) 

emonth1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for Month 
emonth1.insert(10, defaultMonth) 
emonth1.grid(row=1, column=2) 

eday1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for day 
eday1.insert(10, defaultDay) 
eday1.grid(row=1, column=3) 

window2.bind('<Left>', get_focus1) 

mainloop() 
+0

你能发表一些代码吗?你正在打印从'focus_get'返回的对象?如果是这样,你看到的数字可能是焦点表示的对象。 – 2015-01-09 19:34:14

+0

刚刚更新了我的问题 – RasmusGP 2015-01-09 19:43:04

回答

4

focus_get返回实际的物体。你想做什么, 假设你没有使用 textvariable有一个很好的理由 (见Bryan的评论),是清除文本并重新写入新值(显然做一些验证)。你最终是这样的:

from tkinter import * 

def up(event): 
    # warning, exceptions can happen 
    old = int(event.widget.get()) # this gives back the actual object! 
    event.widget.delete(0, END) # delete existing text 
    event.widget.insert(10, old + 1) # put new text in 

def down(event): 
    # warning, exceptions can happen 
    old = int(event.widget.get()) # this gives back the actual object! 
    event.widget.delete(0, END) # delete existing text 
    event.widget.insert(10, old - 1) # put new text in 

window2 = Tk() 

eyear1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for year 
eyear1.insert(10, 2015) 
eyear1.grid(row=1, column=1) 

emonth1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for Month 
emonth1.insert(10, 1) 
emonth1.grid(row=1, column=2) 

eday1 = Entry(window2, width=4, font=("Helvetica", 16)) # Entry for day 
eday1.insert(10, 10) 
eday1.grid(row=1, column=3) 

# bind both keys to corresponding event handlers 
window2.bind('<Up>', up) 
window2.bind('<Down>', down) 
mainloop() 
+1

不使用文本变量的好理由是在大多数情况下textvariable是完全不必要的。在大多数情况下(“复杂度”被定义为“创造比你真正需要的更多的对象”),它增加了一点复杂性,没有真正的收益。 – 2015-01-09 20:01:27

+0

@BryanOakley我对'Tkinter'没有经验,所以我会接受你的话:)这就是我看到的人使用,所以我会删除它。 – 2015-01-09 20:02:30

+0

这正是我一直在寻找的。也像魅力一样工作! – RasmusGP 2015-01-09 20:06:22

1

请记住,当你调用打印,你所得到的表示的对象,不一定对象本身。为了向你展示这是怎么回事,它添加到您的get_focus1功能:

print("focus object class:", window2.focus_get().__class__) 

你应该看到它确实返回一个参考的Entry小部件,这意味着你可以调用该对象上的所有正常的方法。

+0

我明白了,这可能是一个愚蠢的问题,但如何获取该条目的条目名称?我需要改变其中的文本 – RasmusGP 2015-01-09 19:56:28

+2

@RasmusGP:你不需要输入名称,'event.widget' _is_ widget:'widget = event.widget; value = widget.get()' – 2015-01-09 19:58:03

+0

但我现在的问题是,我必须能够设置一个限制,如“emonth1”条目不应该能够得到高于12。所以我需要一种方式检查是否有年,月,日,小时或分钟进入。我可以硬编码,但我有每个条目2,所以我很想能够获得变量名称。 – RasmusGP 2015-01-09 21:20:12