2015-01-09 115 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