2017-01-19 5 views
0

Рассмотрим следующий код:winfo_container() всегда возвращает None?

import Tkinter as tk # Python 2.7 
screen = tk.Tk() 
entry = tk.Entry(screen) 
entry.place(x=0, y=0, width=100, height=20) 
print(screen.winfo_containing(5, 5)) 
screen.mainloop() 

Учитывая информацию в разделе «winfo_containing» в http://effbot.org/tkinterbook/widget.htm, я бы ожидать, чтобы напечатать личность entry. Например. что-то вроде "". Вместо этого я всегда получаю None. Почему это? Запись - это ребенок до screen, а координата (5, 5) попадает в место, указанное в моем обращении к place.

В качестве альтернативы, существует ли другой способ получения (самого верхнего) виджета в определенном месте?

+0

'' winfo_containing '' использует координаты относительно экрана - ваш фактический, физический экран, а не окно, которое вы случайно вызывали «экран». Маловероятно, что глобальная координата 5,5 попадает в исходное местоположение вашего окна. Вам также может потребоваться вызвать '' update_idletasks() '' (или фактически ввести mainloop), прежде чем все данные геометрии будут действительны. – jasonharper

ответ

2

Что jasonharper говорит в своем комментарии прав, winfo_containing принимает координаты относительно фактического экрана компьютера, а не GUI Tkinter, и вам нужно позвонить update_idletasks перед тем, чтобы получить правильный ответ:

screen = tk.Tk() 
entry = tk.Entry(screen) 
entry.pack() 
screen.update_idletasks() 
x,y = screen.winfo_rootx(), screen.winfo_rooty() 
print(screen.winfo_containing(x+5, y+5)) 
screen.mainloop() 
+0

Это больше не печатает 'None'! Однако вызов 'screen.winfo_containing' по-прежнему возвращает экземпляр' Tk' ('screen'), а не экземпляр' Entry' ('entry'). – acdr

+0

Когда я выполняю код на своем компьютере, он возвращает экземпляр Entry (он не зависит от того, использую ли я 'entry.pack()' или 'entry.place (x = 0, y = 0, width = 100, height = 20) ') –

Смежные вопросы